1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        OpenCV中使用YOLO對(duì)象檢測(cè)

        共 6178字,需瀏覽 13分鐘

         ·

        2021-04-29 11:26

        點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)

        本文轉(zhuǎn)自:opencv學(xué)堂

        OpenCV在3.3.1的版本中開始正式支持Darknet網(wǎng)絡(luò)框架并且支持YOLO1與YOLO2以及YOLO Tiny網(wǎng)絡(luò)模型的導(dǎo)入與使用。YOLO是一種比SSD還要快的對(duì)象檢測(cè)網(wǎng)絡(luò)模型,算法作者在其論文中說FPS是Fast R-CNN的100倍,基于COCO數(shù)據(jù)集跟SSD網(wǎng)絡(luò)的各項(xiàng)指標(biāo)對(duì)比

        在最新的OpenCV3.4上我也測(cè)試了YOLO3,發(fā)現(xiàn)不支持,因?yàn)閅OLO3有個(gè)新層類型shortcut,OpenCV3.4的Darknet暫時(shí)還不支持。這里首先簡(jiǎn)單的介紹一下YOLO網(wǎng)絡(luò)基本結(jié)構(gòu),然后在通過代碼演示Darknet支持的YOLO在OpenCV使用。

        一:YOLO網(wǎng)絡(luò)


        對(duì)象檢測(cè)網(wǎng)絡(luò)基本上可以分為兩種,一種稱為兩步法、另外一種稱為一步法,很顯然基于圖像分類加上滑動(dòng)窗口的方式最早的R-CNN就是兩步法的代表之一,兩步法的前面基本上是一個(gè)卷積神經(jīng)網(wǎng)絡(luò),可以是VGGNet或者Inception之類的,然后再加上一個(gè)滑動(dòng)窗口,但是這種方法太慢,所以就有了區(qū)域推薦(RP),預(yù)先推薦一些感興趣的區(qū)域,進(jìn)行預(yù)言,這些方法普遍有一個(gè)缺點(diǎn),計(jì)算量比較大,導(dǎo)致性能低下無法實(shí)時(shí),而YOLO采樣了一種完全不同的方法,達(dá)到對(duì)圖像每個(gè)區(qū)域只計(jì)算一次(You Only Look Once - YOLO),YOLO把圖像分為13x13的Cell(網(wǎng)格):

        每個(gè)Cell預(yù)測(cè)5個(gè)BOX,同時(shí)YOLO也會(huì)生成一個(gè)置信分?jǐn)?shù),告訴每個(gè)BOX包含某個(gè)對(duì)象的可能性是多少,注意置信分?jǐn)?shù)不會(huì)直接說明BOX內(nèi)是檢測(cè)到何種對(duì)象,最終那些得分高的BOX被加粗顯示如下:

        對(duì)于每個(gè)BOX來說,Cell會(huì)預(yù)測(cè)檢測(cè)對(duì)象類別,這部分的工作就像是一個(gè)分類器一樣,基于VOC數(shù)據(jù)集20中對(duì)象檢測(cè),YOLO結(jié)合分?jǐn)?shù)與分類信息對(duì)每個(gè)BOX給出一個(gè)最終可能對(duì)象類型的可能性值,如下圖,黃色區(qū)域85%可能性是狗:

        因?yàn)榭倲?shù)是13x13的網(wǎng)格,每個(gè)網(wǎng)格預(yù)言5個(gè)BOX,所以最終有854個(gè)BOX,證據(jù)表明絕大多數(shù)的BOX得分會(huì)很低,我們只要保留30%BOX即可(取決于你自己的閾值設(shè)置),最終輸出:

        從上面可以看出整個(gè)圖像只是被計(jì)算了一次,真正做到了降低計(jì)算量,提高了檢測(cè)實(shí)時(shí)性。上述檢測(cè)使用的YOLO的網(wǎng)絡(luò)結(jié)構(gòu)如下:

        發(fā)現(xiàn)只有CNN層,沒有FC層,是不是簡(jiǎn)單到爆,最后說一下為什么最后一層卷積層深度是125, 因?yàn)槊總€(gè)Cell檢測(cè)5個(gè)BOX,對(duì)每個(gè)BOX來說,包含如下數(shù)據(jù)

        • BOX本身信息,x、y、w、h

        • 置信分?jǐn)?shù)

        • 基于VOC數(shù)據(jù)集的20個(gè)對(duì)象類別

        所以對(duì)每個(gè)BOX來說有25個(gè)參數(shù),5個(gè)BOX= 5x25=125個(gè)參數(shù)。

        上面是得到的網(wǎng)絡(luò)模型就是tiny-YOLO網(wǎng)絡(luò)模型,可以在移動(dòng)端實(shí)時(shí)對(duì)象檢測(cè)。這個(gè)跟作者在論文中提到的稍微有點(diǎn)差異,論文中作者是輸入圖像為448x448,分為7x7的網(wǎng)格(Cell),結(jié)構(gòu)如下:

        最終輸出是每個(gè)Cell預(yù)測(cè)兩個(gè)BOX,做20個(gè)分類,它得到最終是

        • BOX本身信息,x、y、w、h

        • 置信分?jǐn)?shù)

        深度 = SS(B5+20), 其中20個(gè)表示分類數(shù)目,S表示網(wǎng)絡(luò)分割,B表示BOX個(gè)數(shù)。S=7、B=2,最終輸出是77*30

        二:在OpenCV中使用YOLO


        OpenCV在3.3.1版本中開始支持Darknet,可能有人會(huì)問,Darknet是什么鬼,它是YOLO的作者自己搞出來的深度學(xué)習(xí)框架,支持C/C++/Python語言,支持YOLOv1、YOLOv2、YOLOv3等網(wǎng)絡(luò)模型訓(xùn)練與使用。但是在OpenCV只是前饋網(wǎng)絡(luò),只支持預(yù)測(cè),不能訓(xùn)練。OpenCV中基于YOLO模型我使用的是tiny-YOLO網(wǎng)絡(luò)模型,支持20中對(duì)象檢測(cè)。代碼實(shí)現(xiàn)步驟如下:1.加載網(wǎng)絡(luò)模型

        1. String modelConfiguration = "D:/vcprojects/images/dnn/yolov2-tiny-voc/yolov2-tiny-voc.cfg";

        2. String modelBinary = "D:/vcprojects/images/dnn/yolov2-tiny-voc/yolov2-tiny-voc.weights";

        3. dnn::Net net = readNetFromDarknet(modelConfiguration, modelBinary);

        4. if (net.empty())

        5. {

        6.    printf("Could not load net...\n");

        7.    return;

        8. }

        2.加載分類信息

        1. vector<string> classNamesVec;

        2. ifstream classNamesFile("D:/vcprojects/images/dnn/yolov2-tiny-voc/voc.names");

        3. if (classNamesFile.is_open())

        4. {

        5.    string className = "";

        6.    while (std::getline(classNamesFile, className))

        7.        classNamesVec.push_back(className);

        8. }

        3.加載測(cè)試圖像

        1. // 加載圖像

        2. Mat frame = imread("D:/vcprojects/images/fastrcnn.jpg");

        3. Mat inputBlob = blobFromImage(frame, 1 / 255.F, Size(416, 416), Scalar(), true, false);

        4. net.setInput(inputBlob, "data");

        4.檢測(cè)

        1. // 檢測(cè)

        2. Mat detectionMat = net.forward("detection_out");

        3. vector<double> layersTimings;

        4. double freq = getTickFrequency() / 1000;

        5. double time = net.getPerfProfile(layersTimings) / freq;

        6. ostringstream ss;

        7. ss << "detection time: " << time << " ms";

        8. putText(frame, ss.str(), Point(20, 20), 0, 0.5, Scalar(0, 0, 255));

        5.顯示與運(yùn)行效果

        1. // 輸出結(jié)果

        2. for (int i = 0; i < detectionMat.rows; i++)

        3. {

        4.    const int probability_index = 5;

        5.    const int probability_size = detectionMat.cols - probability_index;

        6.    float *prob_array_ptr = &detectionMat.at<float>(i, probability_index);

        7.    size_t objectClass = max_element(prob_array_ptr, prob_array_ptr + probability_size) - prob_array_ptr;

        8.    float confidence = detectionMat.at<float>(i, (int)objectClass + probability_index);

        9.    if (confidence > confidenceThreshold)

        10.    {

        11.        float x = detectionMat.at<float>(i, 0);

        12.        float y = detectionMat.at<float>(i, 1);

        13.        float width = detectionMat.at<float>(i, 2);

        14.        float height = detectionMat.at<float>(i, 3);

        15.        int xLeftBottom = static_cast<int>((x - width / 2) * frame.cols);

        16.        int yLeftBottom = static_cast<int>((y - height / 2) * frame.rows);

        17.        int xRightTop = static_cast<int>((x + width / 2) * frame.cols);

        18.        int yRightTop = static_cast<int>((y + height / 2) * frame.rows);

        19.        Rect object(xLeftBottom, yLeftBottom,

        20.            xRightTop - xLeftBottom,

        21.            yRightTop - yLeftBottom);

        22.        rectangle(frame, object, Scalar(0, 0, 255), 2, 8);

        23.        if (objectClass < classNamesVec.size())

        24.        {

        25.            ss.str("");

        26.            ss << confidence;

        27.            String conf(ss.str());

        28.            String label = String(classNamesVec[objectClass]) + ": " + conf;

        29.            int baseLine = 0;

        30.            Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);

        31.            rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom),

        32.                Size(labelSize.width, labelSize.height + baseLine)),

        33.                Scalar(255, 255, 255), CV_FILLED);

        34.            putText(frame, label, Point(xLeftBottom, yLeftBottom + labelSize.height),

        35.                FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));

        36.        }

        37.    }

        38. }

        39. imshow("YOLO-Detections", frame);

        運(yùn)行結(jié)果如下:

        文章中提到模型可以到本人的GITHUB上下載即可,地址如下

        1. https://github.com/gloomyfish1998/opencv_tutorial


        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


        瀏覽 75
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天堂操逼 | 操美女操美女逼毛 | 欧美一级高潮片免费的 | 美女被草到流水在线看 | 久久岛国电影免费观看软件 | 中国大陆高清aⅴ毛片 | 青青青久草 | 波多野结衣喷水视频 | 娇女嗯啊好猛h古代 | 三级片www. |