1 | initial version |
ok, it won't answer your question, but at least you could start playing with the dnn code by downloading vanillaCNN.caffemodel and vanilla_deploy.prototxt from https://github.com/ishay2b/VanillaCNN/tree/master/ZOO , and modify the caffe_googlenet.cpp sample from the dnn module, like this:
#include <opencv2/dnn.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace cv::dnn;
using namespace std;
int main(int argc, char **argv)
{
cv::dnn::initModule(); //Required if OpenCV is built as static libs
String modelTxt = "vanilla_deplay.prototxt";
String modelBin = "vanillaCNN.caffemodel";
String imageFile = (argc > 1) ? argv[1] : "face.png";
Net net = dnn::readNetFromCaffe(modelTxt, modelBin);
if (net.empty())
{
std::cerr << "Can't load network by using the following files: " << std::endl;
std::cerr << "prototxt: " << modelTxt << std::endl;
std::cerr << "caffemodel: " << modelBin << std::endl;
exit(-1);
}
Mat img = imread(imageFile);
if (img.empty())
{
std::cerr << "Can't read image from the file: " << imageFile << std::endl;
exit(-1);
}
resize(img, img, Size(40,40)); // size of input (data) layer
cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
dnn::Blob inputBlob = dnn::Blob::fromImages(img); //Convert Mat to dnn::Blob batch of images
net.setBlob(".data", inputBlob); //set the network input
net.forward(); //compute output
dnn::Blob prob = net.getBlob("Dense2"); //gather output of the LAST layer in the prototxt
Mat probMat = prob.matRefConst().reshape(1, 1); //reshape the blob to 1x1000 matrix
cerr << probMat << endl;
for (int i=0; i<5; i++) { // taken from the jupyter notebook
int x = (probMat.at<float>(0,i*2 ) + 0.5) * 40;
int y = (probMat.at<float>(0,i*2+1) + 0.5) * 40;
circle(img, Point(x,y), 2, Scalar(255,0,0), 1);
}
namedWindow("LANDMARKS !",0);
imshow("LANDMARKS !", img);
waitKey();
return 0;
}
accuracy is shoddy, but hey ;)