1. 程式人生 > >模型測試,一站式caffe工程實踐連載(8)

模型測試,一站式caffe工程實踐連載(8)

知識引入 本次我將給大家帶分享如何對模型進行測試,也就是如何使用我們已經訓練好的模型來測試得到我們想要的結果。本次的分享包括準備資料inference過程和對結果分析。 何為inference? 所謂inference就是將已經訓練好的模型,用於測試得到我們想要的這個任務的結果,也就是一個影象分割的結果。在這個過程中,我們將給大家講述如何準備我們的測試test.prototxt檔案,以及如何利用caffe的介面來完成我們整個的inference這樣一個過程。 關鍵點檢測 關鍵點檢測,也就是利用opencv加dlib這樣的一個開源框架來獲得我們嘴脣這一塊區域,將這塊區域切出來之後,進行測試。總的來說分為兩步:第一步,我們要利用oencv的cascade這樣的一個級聯分類器的模型來做人臉檢測。利用cascade模型的特點,它的優點是它的速度非常快,當然它的缺點是它的人臉檢測的召回率會稍微低一些。如果後面對我們的場景人臉檢測有更高的需求,我們可以使用更加魯棒的人臉檢測。但現在對於這個自拍這樣一個場景的話,我們的cascade模型一般都能夠正常地檢測到我們的人臉。dlib是一個開源的機器學習的一個框架。我們使用dlib的一個關鍵點檢測模型,配合我們opencv這樣一個人臉檢測的模型,來完成最終這樣的一個任務。下面是我們的具體的程式碼: caffe,影象識別技術

從程式碼上可以看出,我們需要準備兩個模型檔案,一個基於opencv harri的級聯模型分類器,是xml格式的一個分類器,另一個是dlib,它的模型檔案,也就是.dat這樣的一個關鍵點的一個模型,它是一個68個關鍵點的模型。 當配置好這些路徑之後,我們分別對cascadeclassifier以及shape_predictor進行初始化,得到了cascade和predictor這樣的兩個變數。得到這兩個變數之後,我們再使用get_landmarks這樣的一個函式。如下圖所示: caffe,人工智慧影象識別 之後我們輸入一張影象,首先我們利用cascade分類器,在多尺度下檢測出我們的人臉區域,得到rects這樣的一個矩形區域,然後利用dlib的介面,以及predictor變數,獲取到我們最終的一個包含68個關鍵點的結果。相關的程式碼就在我們前面的章節,大家可以去自行地檢視使用。 ROI獲取檢測
前面我們已經利用opencv的人臉檢測和dlib的關鍵點檢測,得到了我們68個關節點的位置。下面這張圖就展示了68個關鍵點: caffe,影象識別技術 我們將它關鍵點的位置畫到了我們的影象上。接下來在這68個關鍵點的基礎之上,我們要正式獲得我們的嘴脣的區域。關鍵程式碼如下: caffe,影象識別技術 首先,我們可以獲取嘴脣區域的關鍵點的序號,它是從48到67這樣的一個序號,包含了20個關鍵點。得到這些關鍵點之後,我們要切出一個矩形區域。所以首先我們要獲得X和Y的範圍,也就是X的最大值,X的最小值,Y的最大值和Y的最小值,我們利用上面的程式碼獲得它的一個矩形區域,最後因為我們直接剪裁這個嘴脣區域的話,很有可能會導致嘴脣的一部分被切除掉,所以我們需要適當的擴大我們的矩形區域。 關鍵程式碼如下: caffe
在這裡我們利用了一些演算法,擴大了1.5倍。當然在這個過程中演算法程式碼上有很多的細節,包括一些邊界的補齊之類的,大家可以回頭仔細的去閱讀我提供的python指令碼。以下就是我們檢測出來的矩形,區域的大小,如下圖所示: caffe,影象識別技術 前面我們使用的是open CV的這樣一個框架,來進行人類的檢測和關鍵點的檢測。他的魯棒性會稍微差一些,在複雜的光照條件下,會有時候召回不了人臉影象。所以這裡我們給大家提供了另外的一個非常魯棒的開源框架,這是來自於CMU的這樣一個openpose框架,它可以檢測人臉的關鍵點和人體的關節點,強烈建議大家去github上面使用它的模型。 連結地址: https://github.com/CMU-Perceptual-Computing-Lab/openpose 準備測試檔案 得到了我們的嘴脣的這塊區域之後,我們就要開始正式的測試。在測試之前,我們先要準備好我們的測試檔案,注意測試檔案跟我們的訓練檔案是有差異的,它包含在以下幾個方面。首先,我們的輸入層有差異,左側是我們的訓練圖的一個輸入層,如下圖所示: caffe,影象識別技術 我們前面已經給大家講述過,我們利用這樣的一個輸入層獲得了data config,也就是獲得了資料跟它的標籤。同時我們要給這個輸入層在訓練的時候配置一些引數,包括他的batchsize的大小,包括它的一些資料增強操作的引數,比如說crop_size,mirror這樣的一些東西。 這些東西在我們在做測試的時候,是不需要的。這就是我們做測試的時候,我們的輸入的格式,如下圖所示: caffe 從中可以看出它的輸入格式是input,它的type不再是data,而是input,然後它的輸入的引數是intput_param,它其中只有一個變數,也就是shape,也就是說我們利用這樣的一個輸入input格式,我們規定了一個指定大小的block。總結起來,就是當我們在做測試的時候,我們不再需要輸入label,也不再需要配置一大堆資料增強的操作,我們只需要提供一個格式化的資料輸入尺寸就可以了。 輸出層也有所差異。下面是我們的一個訓練網路的輸出層,如下圖所示: caffe,影象識別技術 我們可以看到,當我們在做訓練的時候,我們需要一個loss來指定我們的訓練的迭代過程,我們需要ACC,也就是精度,來檢視我們的訓練的結果的好壞。當在做測試的時候,也不需要這兩個網路層,取而代之的直接是softmax這樣的一個層,如下圖所示: caffe,影象識別技術 softmax,就是將我們網路的輸出對映到(0,1)這樣的一個範圍。所以總結起來就是我們去掉了loss層,去掉了acc層,使用softmax層得到了一個最終的輸出,也就是分類的結果,從而我們得到了每一個畫素的分類的結果。 怎樣使用配置檔案? 下面我們看看怎樣使用配置檔案。我們採用了python的介面,因為python的介面進行預測相對來說比較簡單。我們下面看看我們的一些具體程式碼的分析。它具體來說包含四個方面的內容。首先,我們要初始化我們的網路結構,如下圖所示: caffe,人工智慧 就是上面的第二行程式碼,要輸入兩個檔案,一個就是我們的protel.txt的網路配置檔案,一個是caffemodel,也就是我們訓練好的儲存的模型的引數。然後我們指定caffe的test.prototxt,現在我們是測試的過程。初始化這個網路之後,我們需要定義transformer這樣的一個變數,它的作用就是將我們的資料真正地塞入caffe的視訊記憶體之中。當然是否他還有要做一些預處理的操作,我們可以看看上面的程式碼。我們看看他做了什麼,首先有一個set_mean,也就是說設定了一下我們的均值。因為我們在訓練的時候減去的均值,然後還有一個transpose,它是講我們的影象的格式轉化為我們caffe輸入的格式。因為我們影象使用numpy讀進來的影象,是寬乘以高乘以channel這樣的一個通道,這樣的一個儲存格式,而我們caffe,前面我們已經說過了,它是batchsize乘以channel乘以高乘以寬一個格式,也就是說他的channel是跟caffe的輸入格式是相反的。 看下transformer,這幾處沒有做更多的資料增強操作,在這裡我們測試的時候是不需要做資料增強操作的。然後我們利用transformer這樣的一個介面,將我們的資料塞入到我們的網路之中。塞到網路之後,我們就可以利用forward函式得到我們的結果,也就是上面的out。利用從out取到我們最終需要的一個輸出res。res就是一個block,我們去掉多餘的維度,然後再利用transpose函式,又得回我們的一個正常的圖片。我們使用argmax得到最終結果,最後把它轉換成uint方便視覺化,也就是格式化我們的結果。下面有這一套程式碼,我會在我的github課程中給大家提供,大家可以去關注下載。 連結地址https://github.com/longpeng2008/LongPeng_ML_Course 下面給大家提供一個我們的一個測試結果,如下圖所示: caffe,影象識別技術 在這裡我們將上嘴脣和下嘴脣都分割了出來,用不同的顏色進行表示,可以看出來結果還是不錯的。 測試結果展示 最後我們給大家集中展示一下我們的結果,結果包含兩個部分。首先是圖片,然後是視訊。我們先看一下圖片的結果,如下圖所示: caffe,影象識別技術 這是一張在訓練圖片中沒有見過的影象,我們可以看到上嘴脣跟下嘴脣都正確的分割出來,尤其是對於上嘴脣,嘴脣非常的薄,但是我們仍然可以正常地分割出它的結構,這證明了我們的模型是非常魯棒的。 為了進一步驗證這個結論,我們再看看我們的視訊的分割結果(蜂口小程式)。 caffe 分割視訊 從我們這個視訊的展示結果可以看出來,對於比較薄的嘴脣,對於不同的光照條件下,對於不同的姿態,我們都能夠非常好的非常平滑的得到一個視訊的分割結果。因為我們在這個分割結果過程中,我們是沒有使用額外的一些跟蹤的策略的,這也證明了我們的模型的魯棒性。好了,我們的模型測試結果的分享到此。 完整內容及視訊解讀,請關注蜂口小程式~ 參與內測,免費獲取蜂口所有內容,請申請內測(1*8*8*1*1*2*1*7*5*9*5),更有其他優惠福利多多,歡迎大家多多參與,盡情挑刺,凡是好的建議,我們都會虛心採納噠~ 蜂口小程式將持續為你帶來最新技術的落地方法,歡迎隨時關注瞭解~