Working code, but no detections using C++?
TNemes-3141 opened this issue · 0 comments
TNemes-3141 commented
Hello,
I want to use MobileNetSDD with C++ and therefore got this code from here: Usage of OpenCV C++ API to perform objection detection using MobileNet and SSD
I modified the code slightly to work, you can find it below. My problem is: Using the MobileNetSSD_deploy.prototxt
and mobilenet_iter_73000.caffemodel
provided, I do not get any detections back (only the first default one).
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/utils/trace.hpp>
using namespace cv;
using namespace cv::dnn;
#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;
#define PROJECT_DIR "C:\\Users\\nemes\\source\\repos\\SSD_with_OpenCV\\x64\\Debug\\"
string CLASSES[] = { "background", "aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant", "sheep",
"sofa", "train", "tvmonitor" };
int main(int argc, char** argv) {
CV_TRACE_FUNCTION();
String modelTxt = (string)PROJECT_DIR + "MobileNetSSD_deploy.prototxt";
String modelBin = (string)PROJECT_DIR + "mobilenet_iter_73000.caffemodel";
String imageFile = (argc > 1) ? argv[1] : (string)PROJECT_DIR + "test2.jpg";
Net net = readNetFromCaffe(modelTxt, modelBin); //here is network initialization
if (net.empty()) {
cerr << "Can't load network by using the following files: " << endl;
cerr << "prototxt: " << modelTxt << endl;
cerr << "caffemodel: " << modelBin << endl;
exit(-1);
}
Mat img = imread(imageFile);
if (img.empty()) {
cerr << "Can't read image from the file: " << imageFile << endl;
exit(-1);
}
else {
std::cout << "Succesfully read image from file: " << imageFile << endl;
}
Mat img2;
resize(img, img2, Size(300, 300));
Mat inputBlob = blobFromImage(img2, 0.007843, Size(300, 300), Scalar(127.5, 127.5, 127.5), false);
net.setInput(inputBlob, "data");
Mat detection = net.forward("detection_out"); //here the data gets forwardet to the network
Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>()); //these are the detections
ostringstream ss;
float confidenceThreshold = 0;
std::cout << "Found " << detectionMat.rows << " detection(s):" << endl;
std::cout << "ID: " << static_cast<int>(detectionMat.at<float>(0, 1)) << " Confidence: " << static_cast<int>(detectionMat.at<float>(0, 2)) << endl;
for (int i = 0; i < detectionMat.rows; i++) {
float confidence = detectionMat.at<float>(i, 2);
if (confidence > confidenceThreshold) {
int idx = static_cast<int>(detectionMat.at<float>(i, 1));
int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * img.cols);
int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * img.rows);
int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * img.cols);
int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * img.rows);
Rect object((int)xLeftBottom, (int)yLeftBottom,
(int)(xRightTop - xLeftBottom),
(int)(yRightTop - yLeftBottom));
rectangle(img, object, Scalar(0, 255, 0), 2);
std::cout << CLASSES[idx] << ": " << confidence << endl;
ss.str("");
ss << confidence;
String conf(ss.str());
String label = CLASSES[idx] + ": " + conf;
int baseLine = 0;
Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
putText(img, label, Point(xLeftBottom, yLeftBottom),
FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
}
}
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
cv::imwrite((string)PROJECT_DIR + "detections.png", img, compression_params);
std::cout << "Ending..." << endl;
return 0;
}
So this is my only output:
Found 1 detection(s):
ID: -431602080 Confidence: -431602080
That, obviously, can't be right (on the picture, there are some animals and people). The code is a simplification by the official cpp-example provided by OpenCV, so that works. What could be the problem then?
Thanks for the answers in advance!