Visual C++ darknet opencv cuda yolo4測試即時影像、柴犬影片識別。「Vcpkg安裝darknet cuda並以C++ yolo v3 tiny辨識柴犬白狗動作影片」https://www.youtube.com/watch?v=ZODKCQABcKM
- #include <iostream>
- #include <fstream>
- #include <opencv2/opencv.hpp>
- #include <vector>
- using namespace cv;
- using namespace std;
- using namespace cv::dnn;
- vector<string> coco;
- void name_list() {
- fstream fin("coco.names", ios::in);
- string tmp = "";
- while (getline(fin, tmp))
- coco.push_back(tmp);
- fin.close();
- cout << coco.size() << endl;
- }
- int main()
- {
- cout << "參考https://pjreddie.com/darknet/yolo/ \n";
- name_list();
- cv::setUseOptimized(1);
- VideoCapture cap("shiba_turns_around.mp4");
- cap.set(CAP_PROP_FRAME_WIDTH, 1280);
- cap.set(CAP_PROP_FRAME_HEIGHT, 720);
- string model = "yolov4.weights";
- string config = "yolov4.cfg";
- Net network = readNet(model, config, "Darknet");
- network.setPreferableBackend(DNN_BACKEND_CUDA);
- network.setPreferableTarget(DNN_TARGET_CUDA);
- string wname = "Darknet yolo4 ";
- namedWindow(wname);
- Vec3b colors[] = { Vec3b(255,255,0), Vec3b(0, 255,0), Vec3b(0,255,255), Vec3b(255,0,255) };
- int i = 0;
- while (1)
- {
- Mat im;
- cap >> im;
- if (!im.data) break;
- Mat blobFromIm;
- bool swapRB = true;
- blobFromImage(im, blobFromIm, 1, Size(416, 416), Scalar(), swapRB, false);
- //Size(608, 608) or (416, 416)
- float scale = 1.0 / 255.0;
- Scalar mean = 0;
- network.setInput(blobFromIm, "", scale, mean);
- Mat detection = network.forward();
- // rows represent number of detected objects
- int rowsNoOfDetection = detection.rows;
- // [x ; y ; w; h; class 0 ; class 1 ; class 2 ;....]
- //
- int xywh_scores = detection.cols;
- // Loop over number of detected object.
- for (int j = 0; j < rowsNoOfDetection; ++j)
- {
- // for each row, the score is from element 5 up to end
- Mat scores = detection.row(j).colRange(5, xywh_scores);
- Point PositionOfMax;
- double confidence;
- //This function find indexes of min and max confidence and related index.
- minMaxLoc(scores, 0, &confidence, 0, &PositionOfMax);
- if (confidence > 0.01)
- {
- // [x ; y ; w; h;
- int x = (int)(detection.at<float>(j, 0) * im.cols);
- int y = (int)(detection.at<float>(j, 1) * im.rows);
- int w = (int)(detection.at<float>(j, 2) * im.cols);
- int h = (int)(detection.at<float>(j, 3) * im.rows);
- int left = x - w / 2;
- int up = y - h / 2;
- stringstream ss;
- int i = PositionOfMax.x;
- ss << coco[i] << ",prob=" << 100 * confidence << "%";
- string what = ss.str();
- cout << '#' << j << ":[" << x << ',' << y << ',' << w << ',' << h << "]:";
- cout<< what << endl;
- Vec3b color = confidence * colors[i % 4];
- rectangle(im, Rect(left, up, w, h), color, 2, LINE_8, 0);
- int baseLine = 0;
- Size labelSize = getTextSize(what, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
- rectangle(im, Rect(Point(left, up - labelSize.height),
- Size(labelSize.width, labelSize.height + baseLine)), color, -1);
- putText(im, what, Point(left, up), FONT_HERSHEY_SIMPLEX, 0.5, Scalar());
- }
- }
- imshow(wname, im);
- if (waitKey(1) == 27) {
- imwrite("doggy.png", im);
- break;
- }
- }
- destroyAllWindows();
- cap.release();
- return 0;
- }
沒有留言:
張貼留言