【蜂口 | AI人工智慧】模型測試——龍鵬的一站式caffe工程實踐連載(八)

絵飛的魚發表於2018-09-27

知識引入

本次我將給大家帶分享如何對模型進行測試,也就是如何使用我們已經訓練好的模型來測試得到我們想要的結果。本次的分享包括準備資料inference過程和對結果分析。

何為 inference

所謂 inference 就是將已經訓練好的模型,用於測試得到我們想要的這個任務的結果,也就是一個影像分割的結果。在這個過程中,我們將給大家講述如何準備我們的測試 test.prototxt 檔案,以及如何利用 caffe 的介面來完成我們整個的 inference 這樣一個過程。

關鍵點檢測

關鍵點檢測,也就是利用opencv 加dlib 這樣的一個開源框架來獲得我們嘴唇這一塊區域,將這塊區域切出來之後,進行測試。總的來說分為兩步 第一步,我們要利用oencv的cascade這樣的一個級聯分類器的模型來做人臉檢測。利用cascade模型的特點,它的優點是它的速度非常快,當然它的缺點是它的 人臉檢測 的召回率會稍微低一些。如果後面對我們的場景人臉檢測有更高的需求,我們可以使用更加魯棒的人臉檢測。但現在對於這個自拍這樣一個場景的話,我們的cascade模型一般都能夠正常地檢測到我們的人臉。 dlib 是一個開源的機器學習的一個框架。我們使用dlib的一個關鍵點檢測模型,配合我們opencv這樣一個人臉檢測的模型,來完成最終這樣的一個任務。下面是我們的具體的程式碼

從程式碼上可以看出,我們需要準備兩個模型檔案,一個基於opencv harri 的級聯模型分類器, 是xml格式的一個分類器,另一個是dlib,它的模型檔案,也就是.dat這樣的一個關鍵點的一個模型,它是一個68個關鍵點的模型。 當配置好這些路徑之後,我們分別對cascadeclassifier以及shape_predictor進行初始化,得到了cascade和predictor這樣的兩個變數。得到這兩個變數之後,我們再使用get_landmarks這樣的一個函式。如下圖所示:

之後我們輸入一張影像,首先我們利用ca scade 分類器 ,在多尺度下檢測出我們的人臉區域,得到rec ts 這樣的一個矩形區域,然後利用dlib的介面,以及 predictor 變數,獲取到我們最終的一個包含68個關鍵點的結果。相關的程式碼就在我們 的章節 ,大家可以去自行地檢視使用。

ROI 獲取檢測

前面我們已經利用opencv的 人臉 檢測和 dlib 的關鍵 檢測,得到了我們68個關節點的位置。 面這張圖就展示了68個關鍵點:

我們將它關鍵點的位置畫到了我們的影像上。接下來在這68個關鍵點的基礎之上,我們要正式獲得我們的嘴唇的區域。 關鍵程式碼如下:

首先,我們可以獲取嘴唇區域的關鍵點的序號,它是從48到67這樣的一個序號,包含了20個關鍵點。得到這些關鍵點之後,我們要切出一個矩形區域。所以首先我們要獲得X和Y的範圍,也就是X的最大值,X的最小值,Y的最大值和Y的最小值 我們利用上面的程式碼獲得它的一個矩形區域,最後因為我們直接剪裁這個嘴唇區域的話,很有可能會導致嘴唇的一部分被切除掉,所以我們需要適當的擴大我們的矩形區域。  關鍵程式碼如下:

在這裡我們利用了一些演算法,擴大了1.5倍。當然在這個過程中演算法程式碼上有很多的細節,包括一些邊界的補齊之類的,大家可以回頭仔細的去閱讀我提供的python指令碼。以下就是我們 檢測 出來的矩形,區域的大小, 如下圖所示:

前面我們使用的是open CV的這樣一個框架,來進行人類的檢測和關鍵點的檢測。他的魯棒性會稍微差一些,在複雜的光照條件下,會有時候召回不了人臉影像。所以這裡我們給大家提供了另外的一個非常魯棒的開源框架,這是來自於CMU的這樣一個openpose框架,它可以檢測人臉的關鍵點和人體的關節點,強烈建議大家去github 上面使用 它的模型。

連結地址

準備測試檔案

得到了我們的嘴唇的這塊區域之後,我們就要開始正式的測試 在測試之前,我們先要準備好我們的測試檔案,注意測試檔案跟我們的訓練檔案是有差異的,它包含在以下幾個方面。首先,我們的輸入層有差異,左側是我們的訓練圖的一個輸入層 ,如下圖所示:

我們前面已經給大家講述過,我們利用這樣的一個輸入層獲得了d ata config ,也就是獲得了資料跟它的標籤。同時我們要給這個 輸入層 在訓練的時候配置一些引數,包括他的batch size 的大小,包括它的一些資料增強操作的引數,比如說crop_size,mirror這樣的一些東西。 這些東西在我們在做測試的時候,是不需要的。這就是我們做測試的時候,我們的輸入的格式, 如下圖所示:

從中可以看出它的輸入 格式是input ,它的 type 不再是 data ,而是input,然後它的輸入的引數是intpu t_param ,它其中只有一個變數,也就是 shape 也就是說我們利用這樣的一個輸入input格式,我們規定了一個指定大小的blo c k。總結起來,就是當我們在做測試的時候,我們不再需要輸入label,也不再需要配置一大堆資料 增強 的操作,我們只需要提供一個格式化的資料輸入尺寸就可以了。

輸出層也有所差異。下面是我們的一個訓練網路的輸出層, 如下圖所示:

我們可以看到,當我們在做訓練的時候,我們需要一個 loss 來指定我們的訓練的迭代過程,我們需要ACC,也就是精度,來檢視我們的訓練的結果的好壞。當在做測試的時候,也不需要這兩個網路 ,取而代之的直接是softmax這樣的一個層,如下圖所示:

  softmax,就是將我們網路的輸出對映到(0,1)這樣的一個範圍。所以總結起來就是我們去掉了 loss 層,去掉了 acc ,使用 soft max 得到了一個最終的輸出,也就是分類的結果,從而我們得到了每一個畫素的分類的結果。

怎樣使用配置檔案?

下面我們看看怎樣使用配置檔案。我們採用了python的介面,因為 python 的介面 進行預測相對來說比較簡單。我們下面看看我們的一些具體程式碼的分析。它具體來說包含四個方面的內容。首先,我們要初始化我們的網路結構,如下圖所示:

就是上面的第二行程式碼,要輸入兩個檔案,一個就是我們的protel . txt的網路配置檔案,一個是 caffemodel ,也就是我們訓練好的儲存的模型的引數。然後我們指定caffe test .prototxt ,現在我們是測試的過程。初始化這個網路之後,我們需要定義 transformer 這樣的一個變數, 它的作用就是將我們的資料真正地塞入caffe的 視訊記憶體 之中。當然是否他還有要做一些預處理的操作,我們可以看看上面的程式碼。我們看看他做了什麼,首先有一個set_mean,也就是說設定了一下我們的均值。因為我們在訓練的時候減去的均值,然後還有一個transpose,它是講我們的影像的格式轉化為我們caffe輸入的格式。因為我們影像使用numpy讀進來的影像,是寬乘以高乘以 channel 這樣的一個通道,這樣的一個儲存格式,而我們 caffe ,前面我們已經說過了,它是 batch size 乘以channel乘以高乘以寬 一個格式,也就是說他的channel 是跟 caffe的輸入格式是相反的。  看下transformer, 這幾處沒有做更多的資料增強操作,在這裡我們測試的時候是不需要做資料增強操作的。然後我們利用 transformer 這樣的一個介面,將我們的資料塞入到我們的網路之中。塞到網路之後,我們就可以利用for ward 函式得到我們的結果,也就是上面的out。利用 out取到我們最終需要的一個輸出res。res就是 一個block ,我們去掉多餘的維度,然後再利用transpose函式,又得回我們的一個正常的圖片。我們 使用argmax 得到最終結果 ,最後把它轉換成 uint 方便視覺化,也就是格式化我們的結果。下面有這一套程式碼,我會在我的github課程中給大家提供,大家可以去關注下載。

連結地址

下面給大家提供一個我們的一個測試結果 ,如下圖所示:

在這裡我們將上嘴唇和下嘴唇都分割了出來,用不同的顏色進行表示,可以看出來結果還是不錯的。

測試結果展示

最後我們給大家集中展示一下我們的結果,結果包含兩個部分。首先是圖片,然後是影片。我們先看一下圖片的結果,如下圖所示:

這是一張在訓練圖片中沒有見過的影像,我們可以看到上 嘴唇 跟下嘴唇都正確的分割出來,尤其是對於上嘴唇,嘴唇非常的薄,但是我們仍然可以正常地分割出它的結構,這證明了我們的模型是非常魯棒的。 為了進一步驗證這個結論,我們再看看我們的影片的分割結果。

https://mp.weixin.qq.com/s/OGHh2qFAN2bxvEolvGVaCQ

此處由於編輯器限制,請根據連結移步到公眾號文章中觀看,謝謝

從我們這個影片的展示結果可以看出來,對於比較薄的嘴唇,對於不同的光照條件下,對於不同的姿態,我們都能夠非常好的非常平滑的得到一個影片的分割結果。因為我們在這個分割結果過程中,我們是沒有使用額外的一些跟蹤的策略的,這也證明了我們的模型的魯棒性。 好了,我們的模型測試結果的分享到此

免費領取技術大咖分享課,加蜂口V信: fengkou-IT
感謝您的閱讀,更多精彩請持續關注蜂口微信小程式!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31553577/viewspace-2215066/,如需轉載,請註明出處,否則將追究法律責任。

相關文章