1. 程式人生 > >VGG卷積神經網絡模型解析

VGG卷積神經網絡模型解析

VGG網絡 OPenCV 圖像分類檢測 OpenCV DNN 深度學習

VGG卷積神經網絡模型解析

一:VGG介紹與模型結構

VGG全稱是Visual Geometry Group屬於牛津大學科學工程系,其發布了一些列以VGG開頭的卷積網絡模型,可以應用在人臉識別、圖像分類等方面,分別從VGG16~VGG19。VGG研究卷積網絡深度的初衷是想搞清楚卷積網絡深度是如何影響大規模圖像分類與識別的精度和準確率的,最初是VGG-16號稱非常深的卷積網絡全稱為(GG-Very-Deep-16 CNN),VGG在加深網絡層數同時為了避免參數過多,在所有層都采用3x3的小卷積核,卷積層步長被設置為1。VGG的輸入被設置為224x244大小的RGB圖像,在訓練集圖像上對所有圖像計算RGB均值,然後把圖像作為輸入傳入VGG卷積網絡,使用3x3或者1x1的filter,卷積步長被固定1。VGG全連接層有3層,根據卷積層+全連接層總數目的不同可以從VGG11 ~ VGG19,最少的VGG11有8個卷積層與3個全連接層,最多的VGG19有16個卷積層+3個全連接層,此外VGG網絡並不是在每個卷積層後面跟上一個池化層,還是總數5個池化層,分布在不同的卷積層之下,下圖是VGG11 ~GVV19的結構圖:

技術分享圖片
考慮到整個網絡的精簡結構顯示,ReLU激活函數並沒有被顯示在上述結構中。上述結構中一些說明:

  • conv表示卷積層
  • FC表示全連接層
  • conv3表示卷積層使用3x3 filters
  • conv3-64表示 深度64
  • maxpool表示最大池化

上述VGG11 ~ VGG19參數總數列表如下:
技術分享圖片

在實際處理中還可以對第一個全連接層改為7x7的卷積網絡,後面兩個全連接層改為1x1的卷積網絡,這個整個VGG就變成一個全卷積網絡FCN。在VGG網絡之前,卷積神經網絡CNN很少有突破10層的,VGG在加深CNN網絡深度方面首先做出了貢獻,但是VGG也有自身的局限性,不能無限制的加深網絡,在網絡加深到一定層數之後就會出現訓練效果褪化、梯度消逝或者梯度爆炸等問題,總的來說VGG在剛提出的時候也是風靡一時,在ImageNet競賽數據集上都取得了不錯的效果

技術分享圖片

在其他類似數據上同樣表現不俗:
技術分享圖片

二:預訓練模型使用(Caffe)
VGG本身提供了預訓練模型供大家可以自由使用,預訓練的VGG-16模型與VGG-19模型下載地址可以在這裏發現:
http://www.robots.ox.ac.uk/~vgg/research/very_deep/
下載VGG-16模型之後使用OpenCV DNN模塊相關API,就可以實現一個圖像分類器,支持1000種圖像分類,基於ImageNet 2014-ILSVRC數據集訓練。原圖:
技術分享圖片

VGG-16預測分類結果:
技術分享圖片

稍微有點尷尬的是,OpenCL初始化內存不夠了,只能說我的機器不給力:
技術分享圖片

演示網絡加載與圖像分類的OpenCV程序代碼如下:

Net net = readNetFromCaffe(model_txt_file, model_bin_file);
    if (net.empty()) {
        printf("read caffe model data failure...\n");
        return -1;
    }
    Mat inputBlob = blobFromImage(src, 1.0, Size(w, h), Scalar(104, 117, 123));
    Mat prob;
    for (int i = 0; i < 10; i++) {
        net.setInput(inputBlob, "data");
        prob = net.forward("prob");
    }
    Mat probMat = prob.reshape(1, 1);
    Point classNumber;
    double classProb;
    minMaxLoc(probMat, NULL, &classProb, NULL, &classNumber);
    int classidx = classNumber.x;
    printf("\n current image classification : %s, possible : %.2f", labels.at(classidx).c_str(), classProb);

    putText(src, labels.at(classidx), Point(20, 20), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 255), 2, 8);
    imshow("Image Classification", src);

學習OpenCV 深度學習視頻教程 點擊下面:
OpenCV深度學習模塊 -《OpenCV 深度神經網絡教程》

VGG卷積神經網絡模型解析