zoukankan      html  css  js  c++  java
  • 如何使用 opencv 加载 darknet yolo 预训练模型?

    如何使用 opencv 加载 darknet yolo 预训练模型?

    opencv 版本 > 3.4 以上

    constexpr const char *image_path = "darknet.jpg";//待检测图片
    constexpr const char *darknet_cfg = "darknet.cfg";//网络文件
    constexpr const char *darknet_weights = "darknet.weights";//训练模型
    const std::vector<std::string> class_labels = {"darknet","yolo"};//类标签
    
    void darknetDetection(const std::string &path,const std::string &darknet_cfg,const std::string &darknet_weights,std::vector<std::string> class_labels,float confidenceThreshold)
    {
        // 加载模型
        cv::dnn::Net net = cv::dnn::readNetFromDarknet(darknet_cfg,darknet_weights);
    
        // 加载标签集
        std::vector<std::string> classLabels = class_labels;
    
        // 读取待检测图片
        cv::Mat img = cv::imread(path);
        cv::Mat blob = cv::dnn::blobFromImage(img,1.0/255.0,{416,416},0.00392,true);
        net.setInput(blob,"data");
    
        // 检测
        cv::Mat detectionMat = net.forward("detection_out");// 6 845 1 W x H x C
    
        // 获取网络每层的用时并获取总用时
        std::vector<double> layersTimings;
        double freq = cv::getTickFrequency() / 1000;
        double time = net.getPerfProfile(layersTimings) / freq;
        std::ostringstream ss;
        ss << "detection time: " << time << " ms";
        // 绘制总用时至原始图片
        cv::putText(img, ss.str(), cv::Point(20, 20), 0, 0.5, cv::Scalar(0, 0, 255));
    
        // 遍历所有结果集
        for(int i = 0;i < detectionMat.rows;++i){
            const int probability_index = 5;
            const int probability_size = detectionMat.cols - probability_index;
            float *prob_array_ptr = &detectionMat.at<float>(i, probability_index);
            size_t objectClass = std::max_element(prob_array_ptr, prob_array_ptr + probability_size) - prob_array_ptr;
            float confidence = detectionMat.at<float>(i, (int)objectClass + probability_index);
    
            // 比较置信度并绘制满足条件的置信度
            if (confidence > confidenceThreshold)
            {
                float x = detectionMat.at<float>(i, 0);
                float y = detectionMat.at<float>(i, 1);
                float width = detectionMat.at<float>(i, 2);
                float height = detectionMat.at<float>(i, 3);
    
                int xLeftBottom = static_cast<int>((x - width / 2) * img.cols);
                int yLeftBottom = static_cast<int>((y - height / 2) * img.rows);
                int xRightTop = static_cast<int>((x + width / 2) * img.cols);
                int yRightTop = static_cast<int>((y + height / 2) * img.rows);
    
                cv::Rect object(xLeftBottom, yLeftBottom,xRightTop - xLeftBottom,yRightTop - yLeftBottom);//x y w h
                cv::rectangle(img, object, cv::Scalar(0, 0, 255), 2, 8);
    
                // 判断类id是否符合标签范围并绘制该标签,也就是矩阵的下标索引
                if (objectClass < classLabels.size())
                {
                    cv::String label = cv::String(classLabels[objectClass]) + ": " + std::to_string(confidence);
                    int baseLine = 0;
                    cv::Size labelSize = cv::getTextSize(label,cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
                    cv::rectangle(img, cv::Rect(cv::Point(xLeftBottom, yLeftBottom),cv::Size(labelSize.width, labelSize.height + baseLine)),cv::Scalar(255, 255, 255), cv::FILLED);
                    cv::putText(img, label, cv::Point(xLeftBottom, yLeftBottom + labelSize.height),cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));
                }
            }
        }
    
        // 显示图片
        cv::imshow("Darknet",img);
        cv::waitKey(0);
    }
    
  • 相关阅读:
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 120. Triangle
    Leetcode 26. Remove Duplicates from Sorted Array
    Leetcode 767. Reorganize String
    Leetcode 6. ZigZag Conversion
    KMP HDU 1686 Oulipo
    多重背包 HDU 2844 Coins
    Line belt 三分嵌套
    三分板子 zoj 3203
    二分板子 poj 3122 pie
  • 原文地址:https://www.cnblogs.com/cheungxiongwei/p/10768991.html
Copyright © 2011-2022 走看看