當Node.js遇上OpenCV深度神經網路
作者:VincentMühler
編譯:weakish
編者按:opencv4nodejs及face-recognition.js維護者Vincent Mühler介紹了如何在Node.js環境下使用訓練好的神經網路模型識別圖像中的物體。
今天我們將看看Node.js的OpenCV深度神經網路模塊。
如果你希望釋放神經網路的魔力,來辨識和分類圖像中的物體,卻對深度學習是如何工作的毫無頭緒(像我一樣),更不知道如何創建和訓練神經網路,那麼本文正適合你!
所以我們今天將創建什麼?
在這一篇教程中,我們將了解如何通過OpenCV的DNN模塊,從Tensorflow和Caffe載入預訓練的模型,然後我們將深入兩個基於Node.js和OpenCV進行物體識別的例子。
首先我們將使用Tensorflow的Inception模型來辨識圖像中的物體,之後我們將使用COCO SSD模型檢測和辨識同一圖像中的多個不同物體。
你可以在我的github倉庫上找到樣例代碼:justadudewhohacks/opencv4nodejs
Tensorflow Inception
訓練過的Tensorflow Inception模型可以辨別約1000個分類的物體。如果你將圖像傳入網路,它將給出圖像中的物體的每個分類的似然。
分類圖像中的物品
為了分類圖像中的物品,我們將編寫以下幫助函數:
這一函數做了這些事:
準備輸入圖像
Tensorflow Inception網路接受224x224大小的輸入圖像。因此我們調整圖像大小,使其最大邊的大小為224,然後用白像素補齊。
讓圖像穿過網路
我們可以直接從圖像創建blob,然後調用前向傳播輸入,然後獲取輸出blob.
從輸出blob提取結果
為了通用性,輸出blob的表達形式直接是矩陣(),而它的維度取決於模型。在Inception下這很簡單。blob不過是一個1xN矩陣(其中N等於分類數),描述了所有分類的概率分布。每個條目為一個浮點數,表示相應分類的置信度。所有條目相加,總和為1.0(100%)。
我們想仔細看看圖像可能性最大的分類,因此我們查看所有置信度大於(這個例子中是5%)。最後,我們根據置信度排序結果,並返回、對。
測試
現在我們將讀取一些我們希望網路辨識的樣本數據:
輸出為:(你可以參考本文開頭的圖片)
很有趣。我們得到了愛基斯摩犬和香蕉圖像非常準確的描述。對於汽車圖像而言,汽車的具體類別不太准,但模型確實辨識出了圖像中的汽車。當然,網路不可能在無限的分類上進行訓練,因此它沒有為最後一張圖像返回「婦女」描述。然而,它確實辨識出了帽子。
COCO SSD
好,模型表現不錯。但是我們如何處理包含多個物體的圖像呢?為了辨識單一圖像中的多個物體,我們將利用單圖多盒檢測器(Single Shot Multibox Detector, SSD)。在我們的第二個例子中,我們將查看一個在COCO(Common Object in Context)數據集上訓練的SSD模型。我們使用的這一模型在84個不同分類上訓練過。
這一模型來自Caffe,因此我們將載入二進位文件VGG_coco_SSD_300x300_iter_400000.caffemodel,以及protoxt文件deploy.prototxt:
基於COCO分類
我們的分類函數和基於Inception的分類函數幾乎一樣,不過這次輸入將是300x300的圖像,而輸出將是1x1xNx7矩陣。
我不是很清楚為何輸出是1x1xNx7矩陣,不過我們實際上只關心Nx7部分。我們可以使用flattenFloat工具函數映射第三、第四維至2D矩陣。與Inception輸出矩陣相比,這次N不對應每個分類,而是檢測到的每個物體。另外,每個物體對應7個條目。
為什麼是7個條目?
記住,這裡我們遇到的問題和之前有點不一樣。我們想要檢測單張圖像中的多個物體,因此我們不可能僅僅給出每個分類的置信度。我們實際上想要得到的是一個指示每個物體在圖中的位置的矩形。7個條目分別為:
我其實毫無頭緒
物體的分類標籤
分類的置信度
矩形左端的x
矩形底部的y
矩形右端的x
矩形頂部的y
輸出矩陣給了我們不少關於結果的信息,這看起來相當整潔。我們同樣可以根據置信度再次過濾結果,並為每個辨識出的物體在圖像中繪製邊框。
看看它的效果!
出於行文的簡潔,我將跳過繪製矩形的代碼,以及其他可視化的代碼。如果你想知道具體是怎麼做的,可以訪問前面提到的github倉庫。
讓我們傳入一張汽車圖像到網路,然後過濾結果,看看是否檢測到了分類:
很棒!下面提高一下難度。讓我們試下……一張早餐桌?
很不錯!
最後的話
如果你想進一步嘗試,我建議你查看Caffe Model Zoo,其中提供了用於不同用例的已訓練模型,你可以直接下載。
如果你基於OpenCV和DNN做了很棒的應用,我會很感興趣!歡迎留言分享。
原文地址:https://medium.com/%40muehler.v/node-js-meets-opencvs-deep-neural-networks-fun-with-tensorflow-and-caffe-ff8d52a0f072
※利用深度學習幫助科學圖像分析
※一文概覽用於數據集增強的對抗生成網路架構
TAG:論智 |