玩轉(zhuǎn)OpenCV3——DNN

在上一篇中安裝好了OpenCV3.1的環(huán)境后,繼續(xù)研究官方文檔中關(guān)于contrib庫的教程。
DNN即Deep Neural Networks,也就是深層神經(jīng)網(wǎng)絡,是目前深度學習概念中最基本的一種技術(shù)框架。
相對于傳統(tǒng)的人工神經(jīng)網(wǎng)絡(包括多層神經(jīng)網(wǎng)絡),對DNN的關(guān)鍵不同點的一種解釋是:其在做有監(jiān)督學習前要先做非監(jiān)督學習,然后將非監(jiān)督學習學到的權(quán)值當作有監(jiān)督學習的初值進行訓練。

1. 準備工作

這次要看的教程是Load Caffe framework models。
在VS中新建一個名為caffe_googlenet的win32控制臺項目,將opencv_contrib\modules\dnn\samples目錄下的4個文件拷貝至項目文件夾內(nèi)覆蓋。
另外還差一個bvlc_googlenet.caffemodel文件需要單獨下載,即訓練好的分類器模型。

其中Caffe是一個深度學習框架,由Berkeley大學研究并發(fā)布。
官方教程中給出的下載鏈接貌似被墻了,可以到我的云盤分享去下載,提取碼1d6e。

此時已經(jīng)可以編譯運行了。
輸入的圖像為:


space shuttle

得到結(jié)果如下:

Net Outputs(1):
prob
Best class: #812 'space shuttle'
Probability: 99.9799%

即輸入圖片屬于分類space shuttle的可能性為99.9799%。

2. 代碼分析

源碼就不貼了,opencv_contrib\modules\dnn\samples文件夾下有現(xiàn)成的cpp文件。
幾個關(guān)鍵步驟如下:
(1)載入Caffe模型

Ptr<dnn::Importer> importer;
importer = dnn::createCaffeImporter(modelTxt, modelBin);   

(2)創(chuàng)建神經(jīng)網(wǎng)絡并初始化

dnn::Net net;
importer->populateNet(net);
importer.release();

(3)讀取輸入圖像并轉(zhuǎn)化為GoogleNet可識別的blob格式

Mat img = imread(imageFile);
resize(img, img, Size(224, 224));
dnn::Blob inputBlob = dnn::Blob(img); 

(4)將圖像數(shù)據(jù)輸入網(wǎng)絡

net.setBlob(".data", inputBlob);

(5)計算輸出

net.forward();

(6)取出prob層的輸出,確定最終的分類

dnn::Blob prob = net.getBlob("prob");
int classId;
double classProb;
getMaxClass(prob, &classId, &classProb);

3. 進一步分析

我們來分析一下例程中提供的幾個文件。

  • bvlc_googlenet.caffemodel
    剛剛已經(jīng)說過,是訓練好的分類器模型。

  • bvlc_googlenet.prototxt
    根據(jù)存儲的內(nèi)容來看應該是記錄了生成的深度神經(jīng)網(wǎng)絡結(jié)構(gòu)。

  • synset_words.txt
    存儲了該分類模型可以識別的圖像內(nèi)容的種類。

我們從synset_words.txt中隨機選取幾個其他類別的物品來試一試。

第一張圖片:


car

識別結(jié)果:

Best class: #817 'sports car, sport car'
Probability: 81.8836%

第二張圖片:


shark

識別結(jié)果:

Best class: #2 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias'
Probability: 87.1443%

第三張圖片并沒有對應給出的分類,而是從新聞聯(lián)播中隨機拉了一張截圖:


news

識別結(jié)果:

Best class: #624 'library'
Probability: 11.234%

并沒有適合的分類,但至少識別出了這是一個室內(nèi)的場景。

用單一分類器可以識別這么多種類的東西,效果還是挺感人的。

4. 后續(xù)

目前只是調(diào)用了已經(jīng)訓練好的分類器,后邊會研究一下如何自己來訓練所需要的分類器。
也許實現(xiàn)人工智能真的不再是科學幻想了,而就在即將到來的時代。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容