在上一篇中安裝好了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)可以編譯運行了。
輸入的圖像為:

得到結(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中隨機選取幾個其他類別的物品來試一試。
第一張圖片:

識別結(jié)果:
Best class: #817 'sports car, sport car'
Probability: 81.8836%
第二張圖片:

識別結(jié)果:
Best class: #2 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias'
Probability: 87.1443%
第三張圖片并沒有對應給出的分類,而是從新聞聯(lián)播中隨機拉了一張截圖:

識別結(jié)果:
Best class: #624 'library'
Probability: 11.234%
并沒有適合的分類,但至少識別出了這是一個室內(nèi)的場景。
用單一分類器可以識別這么多種類的東西,效果還是挺感人的。
4. 后續(xù)
目前只是調(diào)用了已經(jīng)訓練好的分類器,后邊會研究一下如何自己來訓練所需要的分類器。
也許實現(xiàn)人工智能真的不再是科學幻想了,而就在即將到來的時代。