Commit f46cd9db authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #13670 from allnes:dnn_fix_obj_detect_sample

parents 37a5af36 cca2c4b3
...@@ -153,14 +153,16 @@ void postprocess(Mat& frame, const std::vector<Mat>& outs, Net& net) ...@@ -153,14 +153,16 @@ void postprocess(Mat& frame, const std::vector<Mat>& outs, Net& net)
std::vector<int> classIds; std::vector<int> classIds;
std::vector<float> confidences; std::vector<float> confidences;
std::vector<Rect> boxes; std::vector<Rect> boxes;
if (net.getLayer(0)->outputNameToIndex("im_info") != -1) // Faster-RCNN or R-FCN if (outLayerType == "DetectionOutput")
{ {
// Network produces output blob with a shape 1x1xNx7 where N is a number of // Network produces output blob with a shape 1x1xNx7 where N is a number of
// detections and an every detection is a vector of values // detections and an every detection is a vector of values
// [batchId, classId, confidence, left, top, right, bottom] // [batchId, classId, confidence, left, top, right, bottom]
CV_Assert(outs.size() == 1); CV_Assert(outs.size() > 0);
float* data = (float*)outs[0].data; for (size_t k = 0; k < outs.size(); k++)
for (size_t i = 0; i < outs[0].total(); i += 7) {
float* data = (float*)outs[k].data;
for (size_t i = 0; i < outs[k].total(); i += 7)
{ {
float confidence = data[i + 2]; float confidence = data[i + 2];
if (confidence > confThreshold) if (confidence > confThreshold)
...@@ -171,36 +173,22 @@ void postprocess(Mat& frame, const std::vector<Mat>& outs, Net& net) ...@@ -171,36 +173,22 @@ void postprocess(Mat& frame, const std::vector<Mat>& outs, Net& net)
int bottom = (int)data[i + 6]; int bottom = (int)data[i + 6];
int width = right - left + 1; int width = right - left + 1;
int height = bottom - top + 1; int height = bottom - top + 1;
classIds.push_back((int)(data[i + 1]) - 1); // Skip 0th background class id. if (width * height <= 1)
boxes.push_back(Rect(left, top, width, height));
confidences.push_back(confidence);
}
}
}
else if (outLayerType == "DetectionOutput")
{ {
// Network produces output blob with a shape 1x1xNx7 where N is a number of left = (int)(data[i + 3] * frame.cols);
// detections and an every detection is a vector of values top = (int)(data[i + 4] * frame.rows);
// [batchId, classId, confidence, left, top, right, bottom] right = (int)(data[i + 5] * frame.cols);
CV_Assert(outs.size() == 1); bottom = (int)(data[i + 6] * frame.rows);
float* data = (float*)outs[0].data; width = right - left + 1;
for (size_t i = 0; i < outs[0].total(); i += 7) height = bottom - top + 1;
{ }
float confidence = data[i + 2];
if (confidence > confThreshold)
{
int left = (int)(data[i + 3] * frame.cols);
int top = (int)(data[i + 4] * frame.rows);
int right = (int)(data[i + 5] * frame.cols);
int bottom = (int)(data[i + 6] * frame.rows);
int width = right - left + 1;
int height = bottom - top + 1;
classIds.push_back((int)(data[i + 1]) - 1); // Skip 0th background class id. classIds.push_back((int)(data[i + 1]) - 1); // Skip 0th background class id.
boxes.push_back(Rect(left, top, width, height)); boxes.push_back(Rect(left, top, width, height));
confidences.push_back(confidence); confidences.push_back(confidence);
} }
} }
} }
}
else if (outLayerType == "Region") else if (outLayerType == "Region")
{ {
for (size_t i = 0; i < outs.size(); ++i) for (size_t i = 0; i < outs.size(); ++i)
......
...@@ -102,7 +102,7 @@ def postprocess(frame, outs): ...@@ -102,7 +102,7 @@ def postprocess(frame, outs):
classIds = [] classIds = []
confidences = [] confidences = []
boxes = [] boxes = []
if net.getLayer(0).outputNameToIndex('im_info') != -1: # Faster-RCNN or R-FCN if lastLayer.type == 'DetectionOutput':
# Network produces output blob with a shape 1x1xNx7 where N is a number of # Network produces output blob with a shape 1x1xNx7 where N is a number of
# detections and an every detection is a vector of values # detections and an every detection is a vector of values
# [batchId, classId, confidence, left, top, right, bottom] # [batchId, classId, confidence, left, top, right, bottom]
...@@ -116,17 +116,7 @@ def postprocess(frame, outs): ...@@ -116,17 +116,7 @@ def postprocess(frame, outs):
bottom = int(detection[6]) bottom = int(detection[6])
width = right - left + 1 width = right - left + 1
height = bottom - top + 1 height = bottom - top + 1
classIds.append(int(detection[1]) - 1) # Skip background label if width * height <= 1:
confidences.append(float(confidence))
boxes.append([left, top, width, height])
elif lastLayer.type == 'DetectionOutput':
# Network produces output blob with a shape 1x1xNx7 where N is a number of
# detections and an every detection is a vector of values
# [batchId, classId, confidence, left, top, right, bottom]
for out in outs:
for detection in out[0, 0]:
confidence = detection[2]
if confidence > confThreshold:
left = int(detection[3] * frameWidth) left = int(detection[3] * frameWidth)
top = int(detection[4] * frameHeight) top = int(detection[4] * frameHeight)
right = int(detection[5] * frameWidth) right = int(detection[5] * frameWidth)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment