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 基于Inception模型圖像分類(lèi)

        共 4777字,需瀏覽 10分鐘

         ·

        2021-06-13 14:10

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

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

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

        Network in Network(NIN)


        要介紹Inception網(wǎng)絡(luò)結(jié)構(gòu)首先應(yīng)該介紹一下NIN(Network in Network)網(wǎng)絡(luò)模型,2014年新加坡國(guó)立大學(xué)發(fā)表了一篇關(guān)于計(jì)算機(jī)視覺(jué)圖像分類(lèi)的論文,提到采用了一種新的網(wǎng)絡(luò)結(jié)構(gòu)NIN實(shí)現(xiàn)圖像分類(lèi),該論文的第二作者顏水成畢業(yè)于北京大學(xué)數(shù)學(xué)系,現(xiàn)任360人工智能研究院院長(zhǎng)與首席科學(xué)家。NIN主要思想是認(rèn)為CNN網(wǎng)絡(luò)中卷積濾波是基于線(xiàn)性濾波器實(shí)現(xiàn)的,抽象能力不夠,所以一般是用一大堆filter把所有特征都找出來(lái),但是這樣就導(dǎo)致網(wǎng)絡(luò)參數(shù)過(guò)大,論文作者提出通過(guò)MLP(多個(gè)權(quán)重階層組成+一個(gè)非線(xiàn)性激活函數(shù))對(duì)輸入?yún)^(qū)域通過(guò)MLP產(chǎn)生一個(gè)輸出feature map,然后繼續(xù)滑動(dòng)MLP窗口,對(duì)比如下:

        這樣做有兩個(gè)好處,

        1. MLP可以共享參數(shù),減少參數(shù)總數(shù)

        2. 對(duì)每個(gè)局部感受野神經(jīng)元實(shí)現(xiàn)更加復(fù)雜計(jì)算,提升能力

        論文中提到NIN網(wǎng)絡(luò)完整結(jié)構(gòu)如下:

        包含了三個(gè)MLP卷積層與一個(gè)全局池化層。

        Inception v1


        受到這篇文章的影響與啟發(fā),谷歌在2014也提出一個(gè)新的網(wǎng)絡(luò)模型結(jié)構(gòu)Inception網(wǎng)絡(luò)也就是大家熟知v1網(wǎng)絡(luò),其主要貢獻(xiàn)在于實(shí)現(xiàn)了NIN網(wǎng)絡(luò)層數(shù)的增加,并且在訓(xùn)練各個(gè)網(wǎng)絡(luò)時(shí)候?yàn)榱颂岣呤諗?,考慮中間層的輸出與最終分類(lèi)錯(cuò)誤。只是中間層不同,最初inception網(wǎng)絡(luò)的中間層為:

        后來(lái)發(fā)現(xiàn)3x3與5x5的卷積計(jì)算耗時(shí)很長(zhǎng),而且輸出導(dǎo)致卷積厚度增加,如果層數(shù)過(guò)度將導(dǎo)致卷積網(wǎng)絡(luò)不可控制,于是就在3x3與5x5的卷積之前分別加上1x1的卷積做降維,修改后的結(jié)構(gòu)如下:

        最終得到v1版本的網(wǎng)絡(luò)結(jié)構(gòu)如下:

        Inception v2 and Inception v3


        于是在v1的基礎(chǔ)上作者繼續(xù)工作,加入了BN層,對(duì)大于3x3的卷積用一系列小的卷積進(jìn)行替代,比如7x7可以被1x7與7x1替代兩個(gè)小卷積核,5x5可以被1x5與5x1兩個(gè)小卷積核替代,這樣就得到Inception v2的版本。于是作者繼續(xù)對(duì)此網(wǎng)絡(luò)結(jié)構(gòu)各種優(yōu)化調(diào)整,最終又得到了Inception v3版本

        Inception v4


        Inception v4一個(gè)最大的改動(dòng)就是引入了殘差網(wǎng)絡(luò)結(jié)構(gòu),對(duì)原有的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行優(yōu)化,得到v1與v2的殘差版本網(wǎng)絡(luò)結(jié)構(gòu),最終得到一個(gè)更加優(yōu)化的v4模型,完整的v4結(jié)構(gòu):

        對(duì)應(yīng)的Block A、B、C結(jié)構(gòu)如下:Inception-A


        Inception-B


        Inception-C


        v1模型加殘差網(wǎng)絡(luò)結(jié)構(gòu)



        OpenCV DNN模塊中使用Inception模型


        1. 下載Inception預(yù)訓(xùn)練網(wǎng)絡(luò)模型

        2. 使用OpenCV DNN模塊相關(guān)API加載模型

        3. 運(yùn)行Inception網(wǎng)絡(luò)實(shí)現(xiàn)圖像分類(lèi) 完整的代碼實(shí)現(xiàn)如下:

        1. #include <opencv2/opencv.hpp>

        2. #include <opencv2/dnn.hpp>

        3. #include <iostream>

        4. /******************************************************

        5. *

        6. * 作者:賈志剛

        7. * QQ: 57558865

        8. * OpenCV DNN 完整視頻教程:

        9. * http://edu.51cto.com/course/11516.html

        10. *

        11. ********************************************************/

        12. using namespace cv;

        13. using namespace cv::dnn;

        14. using namespace std;

        15. String labels_txt_file = "D:/android/opencv_tutorial/data/models/inception5h/imagenet_comp_graph_label_strings.txt";

        16. String tf_pb_file = "D:/android/opencv_tutorial/data/models/inception5h/tensorflow_inception_graph.pb";

        17. vector<String> readClassNames();

        18. int main(int argc, char** argv) {

        19.    Mat src = imread("D:/vcprojects/images/twocat.png");

        20.    if (src.empty()) {

        21.        printf("could not load image...\n");

        22.        return -1;

        23.    }

        24.    namedWindow("input", CV_WINDOW_AUTOSIZE);

        25.    imshow("input", src);

        26.    vector<String> labels = readClassNames();

        27.    Mat rgb;

        28.    cvtColor(src, rgb, COLOR_BGR2RGB);

        29.    int w = 224;

        30.    int h = 224;

        31.    // 加載網(wǎng)絡(luò)

        32.    Net net = readNetFromTensorflow(tf_pb_file);

        33.    if (net.empty()) {

        34.        printf("read caffe model data failure...\n");

        35.        return -1;

        36.    }

        37.    Mat inputBlob = blobFromImage(src, 1.0f, Size(224, 224), Scalar(), true, false);

        38.    inputBlob -= 117.0; // 均值

        39.    // 執(zhí)行圖像分類(lèi)

        40.    Mat prob;

        41.    net.setInput(inputBlob, "input");

        42.    prob = net.forward("softmax2");

        43.    // 得到最可能分類(lèi)輸出

        44.    Mat probMat = prob.reshape(1, 1);

        45.    Point classNumber;

        46.    double classProb;

        47.    minMaxLoc(probMat, NULL, &classProb, NULL, &classNumber);

        48.    int classidx = classNumber.x;

        49.    printf("\n current image classification : %s, possible : %.2f", labels.at(classidx).c_str(), classProb);

        50.    // 顯示文本

        51.    putText(src, labels.at(classidx), Point(20, 20), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 255), 2, 8);

        52.    imshow("Image Classification", src);

        53.    imwrite("D:/result.png", src);

        54.    waitKey(0);

        55.    return 0;

        56. }

        57. std::vector<String> readClassNames()

        58. {

        59.    std::vector<String> classNames;

        60.    std::ifstream fp(labels_txt_file);

        61.    if (!fp.is_open())

        62.    {

        63.        printf("could not open file...\n");

        64.        exit(-1);

        65.    }

        66.    std::string name;

        67.    while (!fp.eof())

        68.    {

        69.        std::getline(fp, name);

        70.        if (name.length())

        71.            classNames.push_back(name);

        72.    }

        73.    fp.close();

        74.    return classNames;

        75. }

        輸入原圖:

        測(cè)試結(jié)果:

        關(guān)鍵是速度很快,比VGG快N多,基本秒出結(jié)果!



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

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

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺(jué)公眾號(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、三維視覺(jué)、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


        瀏覽 95
        點(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>
            三级久久久 | 大香蕉精品在线 | 大香蕉天天干夜夜操天天干夜夜 | 色五月婷婷爱 | 亚洲免费在线观看的高清视频网站 | 黑人日皮视频 | 亚洲成人AV | 国产又粗又猛又爽又黄无码的视频 | 日韩精品一区二区三区四区66 | 三上悠亚三级 |