samples/dnn/classification.cpp


Check the corresponding tutorial 了解更多细节

#include <fstream>
#include <sstream>
#include < opencv2/dnn.hpp >
#include "common.hpp"
std::string keys =
"{ help h | | Print help message. }"
"{ @alias | | An alias name of model to extract preprocessing parameters from models.yml file. }"
"{ zoo | models.yml | An optional path to file with preprocessing parameters }"
"{ input i | | Path to input image or video file. Skip this argument to capture frames from a camera.}"
"{ framework f | | Optional name of an origin framework of the model. Detect it automatically if it does not set. }"
"{ classes | | Optional path to a text file with names of classes. }"
"{ backend | 0 | Choose one of computation backends: "
"0: automatically (by default), "
"1: Halide language (http://halide-lang.org/), "
"2: Intel's Deep Learning Inference Engine (https://software.intel.com/openvino-toolkit), "
"3: OpenCV implementation }"
"{ target | 0 | Choose one of target computation devices: "
"0: CPU target (by default), "
"1: OpenCL, "
"2: OpenCL fp16 (half-float precision), "
"3: VPU }" ;
using namespace cv ;
using namespace dnn;
std::vector<std::string> classes;
int main( int argc, char ** argv)
{
CommandLineParser parser(argc, argv, keys);
const std::string modelName = parser. get < 字符串 >( "@alias" );
const std::string zooFile = parser. get < 字符串 >( "zoo" );
keys += genPreprocArguments(modelName, zooFile);
parser = CommandLineParser (argc, argv, keys);
parser. about ( "Use this script to run classification deep learning networks using OpenCV." );
if (argc == 1 || parser. has ( "help" ))
{
parser. printMessage ();
return 0;
}
float scale = parser. get < float >( "scale" );
Scalar mean = parser. get < Scalar >( "mean" );
bool swapRB = parser. get < bool >( "rgb" );
int inpWidth = parser. get < int >( "width" );
int inpHeight = parser. get < int >( "height" );
字符串 model = findFile (parser. get < 字符串 >( "model" ));
字符串 config = findFile (parser. get < 字符串 >( "config" ));
字符串 framework = parser. get < 字符串 >( "framework" );
int backendId = parser. get < int >( "backend" );
int targetId = parser. get < int >( "target" );
// Open file with classes names.
if (parser. has ( "classes" ))
{
std::string file = parser. get < 字符串 >( "classes" );
std::ifstream ifs(file.c_str());
if (!ifs.is_open())
CV_Error ( Error::StsError , "File " + file + " not found" );
std::string line ;
while (std::getline(ifs, line))
{
classes.push_back(line);
}
}
if (!parser. check ())
{
parser. printErrors ();
return 1;
}
CV_Assert (!model.empty());
Net net = readNet (model, config, framework);
net.setPreferableBackend(backendId);
net.setPreferableTarget(targetId);
// Create a window
static const std::string kWinName = "Deep learning image classification in OpenCV" ;
if (parser. has ( "input" ))
cap. open (parser. get < 字符串 >( "input" ));
else
cap. open (0);
// Process frames.
Mat frame, blob;
while ( waitKey (1) < 0)
{
cap >> frame;
if (frame.empty())
{
break ;
}
blobFromImage (frame, blob, scale, Size (inpWidth, inpHeight), mean, swapRB, false );
net.setInput(blob);
Mat prob = net.forward();
Point classIdPoint;
double confidence;
minMaxLoc (prob. reshape (1, 1), 0, &confidence, 0, &classIdPoint);
int classId = classIdPoint. x ;
// Put efficiency information.
std::vector<double> layersTimes;
double freq = getTickFrequency () / 1000;
double t = net.getPerfProfile(layersTimes) / freq;
std::string label = format( "Inference time: %.2f ms" , t);
putText (frame, label, Point (0, 15), FONT_HERSHEY_SIMPLEX , 0.5, Scalar (0, 255, 0));
// Print predicted class.
label = format( "%s: %.4f" , (classes.empty() ? format( "Class #%d" , classId).c_str() :
classes[classId].c_str()),
confidence);
putText (frame, label, Point (0, 40), FONT_HERSHEY_SIMPLEX , 0.5, Scalar (0, 255, 0));
imshow (kWinName, frame);
}
return 0;
}