[OpenR8 解決方案] Image_Age_SSD_Caffe (影像分析使用 SSD 512 演算法及 Caffe 函式庫進行年齡預測)

一、Image_Age_SSD_Caffe

 

此 Image_Age_SSD_Caffe 是在深度學習 Caffe 的框架下,先使用 SSD (Single Shot MultiBox Detector) 演算法來訓練模型,再透過已訓練好的模型進行年齡預測,本次訓練圖片大小為 512 × 512。

主要流程如下圖1。

首先,我們需準備想要讓模型學習的影像,將影像中的目標框選起來,且將框選的框標記是什麼類別,此目的是為了讓模型知道這個影像中框起來的物件是屬於何物。

接著透過一系列的 flow 檔案,產生兩個 txt 清單檔,以此讓模型知道有哪些檔案是要進行訓練測試,以及這些檔案中是分成哪幾種類別,再執行 flow 檔對兩個 txt 清單檔訓練,訓練完成後依據想測試影像選擇不同的 flow 檔測試。

 

圖1.SSD 預測年齡流程.png

圖1.SSD 預測年齡流程。

 

 

二、步驟一:前置處理 - 感興趣區域標記

 

圖1.1SSD 預測年齡流程.png

 

  1. 目的:

準備框選標記感興趣的區域。

  1. 內容介紹:

在影像中框選想要讓模型學習的物件。例如:想要讓模型學習人臉的年齡就準備人臉的影像,再將影像中的人臉框選起來、標記為年齡大小。如此一來,模型才會知道這個圖片框起來的區域就是人臉的年齡大小。以此類推,想要讓模型學習什麼東西,就準備好影像與框選好做標記。

因此我們所需準備的檔案包含以下兩項

(1). 影像 (想要讓模型學習的影像、想要測試模型準確度的影像)

(2). 標記圖像目標位置的 xml 檔案 (框選後,會自動產生的檔案)

  1. 範例:

在此 Image_Age_SSD_Caffe 方案範例中:

預測影像中人臉的年齡,我們透過 labelImg.exe (下圖2) 將影像中的目標人臉框選標記,如下圖3紅框是框選人臉以及將其標記成 age (人臉年齡) 的類別。標記完,儲存時會自動產生 .xml 檔案。

請將影像放置指定資料夾位置。如下圖4。

【訓練】

影像請放置 openR8/solution/Image_Age_SSD_Caffe/data/train_image

xml請放置 openR8/solution/Image_Age_SSD_Caffe/data/train_annotation

【測試】

影像與 xml 檔案一樣使用訓練樣本的檔案來測試。

  1. 補充說明:

標記的軟體 labelImg.exe 已隨 OpenR8 檔案附上,其檔案路徑為openR8 > solution > Image_Age_SSD_Caffe > labelImg.exe,如下圖2,其使用方法可參考開源機器人俱樂部 [ezAI 簡單學 AI] labelImg 使用方法 (Windows 版本)

 

圖2.標籤工具所在位置.png

圖2.標籤工具所在位置。

 

圖3.標記影像中的目標物件.png

圖3.標記影像中的目標物件。

 

圖4.訓練樣本資料夾之標籤完之影像與 xml 檔案放置位置.png

圖4.訓練樣本資料夾之標籤完之影像與 xml 檔案放置位置。

 

 

三、步驟二:前置處理 - 建立檔案位置的 txt 檔

 

圖4.1訓練樣本資料夾之標籤完之影像與 xml 檔案放置位置.png

 

  1. 目的:

定義訓練和測試的影像與其標記的位置。

  1. 使用方法:

(1) 如果電腦有安裝顯示卡,點選 “R8_Python3.6_GPU.bat” 開啟 “1_prepare_train_txt.flow” 。

如果電腦沒有安裝顯示卡,點選 “R8_Python3.6_CPU.bat” 開啟 “1_prepare_train_txt.flow” 。

 

圖5.R8_Python3.6_GPU.bat 與 R8_Python3.6_CPU.bat 所在位置.png

圖5.R8_Python3.6_GPU.bat 與 R8_Python3.6_CPU.bat 所在位置。

 

圖6.開啟 1_prepare_train_txt.png

圖6.開啟 1_prepare_train_txt。

 

(2) 確認下方敘述之訓練樣本與標記檔的檔案路徑,確認完畢後,即可按下 Run,產生 train.txt,出現『Press any key to continue . . .』,表示成功產生 train.txt。

目前訓練樣本的路徑固定放置於 solution/Image_Age_SSD_Caffe/data/train_image 之中

目前訓練樣本標記檔的路徑固定放置於 solution/Image_Age_SSD_Caffe/data/train_annotation之中

【train.txt】產生的位置為 openR8/solution/Image_Age_SSD_Caffe/data/train.txt

 

圖7.1_prepare_train_txt.flow 產生 train.txt的運行結果.png

圖7.1_prepare_train_txt.flow 產生 train.txt的運行結果。

 

(3) 由於測試影像與 xml 檔案一樣使用訓練樣本的檔案來測試,所以不需要產生 test.txt 檔案。

 

圖8.train.txt 的所在位置.png

圖8.train.txt 的所在位置。

 

圖9.train.txt 的內容示意圖.png

圖9.train.txt 的內容示意圖。

 

 

四、步驟三:前置處理 - 建立標籤類別 txt 檔

 

圖9.1train.txt 的內容示意圖.png

 

  1. 目的:

上個步驟是建立檔案清單,來跟模型說哪些檔案是要進行訓練、測試。 接著要建立類別 txt,此目的是跟模型說我們這些資料要分成哪幾種類別,藉此讓模型可自行學習將影像進行偵測分類。

  1. 內容介紹:

請在 openR8/solution/Image_Age_SSD_Caffe/data 路徑下面建立

【labelmap.prototxt】檔案。檔案內容格式如下:

item {

name: "none_of_the_above"

label: 0

display_name: "background"

}

item {

name: "類別標籤名字"

label: 1

display_name: "顯示此類別的名字"

}

……

item {

name: "類別標籤名字"

label: n

display_name: "顯示此類別的名字"

}

 

請注意:上述的【name】【display_name】請務必與【標記感興趣區域標記】的     xml 之類別名稱、數量相符合。舉例:標記時,分成貓、狗兩類,那麼上述的【name】【display_name】務必與標記貓、狗的類別命名一致,如圖10。

 

圖10.範例的 labelmap.prototxt.png

圖10.範例的 labelmap.prototxt。

 

  1. 範例:

目前 OpenR8 資料夾內的 Image_Age_SSD_Caffe 範例 labelmap.prototxt 已建好,如下文字敘述。

在 OpenR8/solution/Image_Age_SSD_Caffe/data 資料夾中,可以看到 labelmap.prototxt,可透由 notepad++ 或記事本開啟檔案。如下圖11。

檔案內容如下圖12,可以看出我們將影像分類成 none_of_the_above (以上皆非) 以及 20 、 30 、 40 、 50 、 60 、 70 、 80 八類,其中個別 label 編號為 0 、 1 、 2 、 3 、 4 、 5 、 6 、 7。

 

圖11.labelmap.prototxt 檔案路徑.png

圖11.labelmap.prototxt 檔案路徑。

 

圖12.labelmap.prototxt 內容示意圖.png

圖12.labelmap.prototxt 內容示意圖。

 

 

五、步驟四:前置處理 - annoset_to_lmdb

 

圖12.1labelmap.prototxt 內容示意圖.png

 

此步驟為將上面兩步驟已定義好的 txt 轉成後續訓練測試模型所需的 lmdb 檔案。

  1. 開啟 annoset_to_lmdb flow 檔案

如果電腦有安裝顯示卡,請【滑鼠雙擊 R8_Python3.6_GPU.bat】,沒有安裝顯示卡,請【滑鼠雙擊 R8_Python3.6_CPU.bat】=>點選【File】=>【Open】=>【OpenR8 > solution 下的 Image_Age_SSD_Caffe】=> 【2_annoset_to_lmdb.flow】。示意圖如下圖13圖14圖15圖16。

對於開啟軟體至載入解決方案有任何疑問可參閱【OpenR8 操作手冊】

 

圖13.R8_Python3.6_GPU.bat 與 R8_Python3.6_CPU.png

圖13.R8_Python3.6_GPU.bat 與 R8_Python3.6_CPU.bat。

 

圖14.檔案開啟.png

圖14.檔案開啟。

 

圖15.選擇 Image_Age_SSD_Caffe 資料夾的 2_annoset_to_lmdb.flow.png

圖15.選擇 Image_Age_SSD_Caffe 資料夾的 2_annoset_to_lmdb.flow。

 

圖16.載入 2_annoset_to_lmdb.flow.png

圖16.載入 2_annoset_to_lmdb.flow。

 

  1. 執行 annoset_to_lmdb 流程檔案

參數確認後,請點選 Run。如果存在舊的 lmdb 檔案,會跳出是否移除,請點選【Yes】,如下圖17。

執行完成後,會產生 train_lmdb 與 test_lmdb。如下圖18圖19。

 

圖17.刪除 lmdb 檔.png

圖17.刪除 lmdb 檔。

 

圖18.執行完成.png

圖18.執行完成。

 

圖19.產生 train_lmdb 與 test_lmdb.png

圖19.產生 train_lmdb 與 test_lmdb。

 

annoset_to_lmdb 流程檔案參數說明

 

圖20.輸入檔案 左 轉成輸出檔案 右 .png

圖20.輸入檔案(左)轉成輸出檔案(右)。

 

此項為設定輸入檔案的路徑與輸出 lmdb 的路徑,其檔案的項目如上圖20。參數路徑已預設好,可直接跳至 3. 直接執行。

以下為此 flow 檔案之每個流程順序介紹,由上至下有分別為:

Caffe_Init : Caffe 框架初始化。

File_DeleteDir (圖21):當資料夾中存在舊的 lmdb 檔案資料夾,在開始產生新 lmdb 之前,需先將舊的檔案移除。(訓練用)

如下圖,流程區域點選【File_DeleteDir】出現變數列表,函式列表出現該流程的參數,點擊【dirName (String)】的 Edit,此資料夾名稱的變數及顯示在變數區,此區域的【Value】,【data/train_lmdb/】即為 lmdb 的資料夾。

 

圖21.File_DeleteDir.png

圖21.File_DeleteDir。

 

Caffe_ObjectDetect_CreateTrainData (圖22):產生 lmdb 檔案。(訓練用)

 

圖22.Caffe_ObjectDetect_CreateTrainData.png

圖22.Caffe_ObjectDetect_CreateTrainData。

 

下面最後兩個【File_DeleteDir】與【Caffe_ObjectDetect_CreateTrainData】:為產生測試模型用的 lmdb,設定方式如上述產生訓練的 lmdb。

 

 

六、步驟五:訓練模型 - train

 

圖22.1Caffe_ObjectDetect_CreateTrainData.png

 

介紹主要分兩部分,第一點先介紹如何開始做訓練,接著如果有興趣知道每一個流程方塊可觀看第二點之介紹此流程的詳細內容。

  1. 前置準備資料完成後,開始訓練模型。

首先,使用 OpenR8 開啟【3_train.flow】檔案,載入 3_train.flow,如下圖23圖24。

接著,確認電腦是否支援 GPU 加速(沒有支援 GPU 加速時,請到 【Caffe_Train】 的 GPU 欄位,將值從【all】改為【】),按下【Run】開始訓練模型,此步驟需花一點時間等待程式建立模型。如下圖25。

當此執行完成後會產生訓練好的模型,其模型檔案生成放置,如下圖26。

路徑 : OpenR8/solution/Image_Age_SSD_Caffe/data/

檔案名稱1 : xxx.caffemodel

檔案名稱2 : xxx.solverstate

 

圖23.3_train.flow 檔案路徑.png

圖23.3_train.flow 檔案路徑。

 

圖24.開啟 3_train.flow.png

圖24.開啟 3_train.flow。

 

圖25.執行 3_train.flow 與其執行過程圖.png

圖25.執行 3_train.flow 與其執行過程圖。

 

圖26.訓練完產生模型.png

圖26.訓練完產生模型。

 

  1. 3_train 流程介紹:

Caffe_Init : Caffe 框架初始化。

Caffe_Train:

【CaffeObject】接續前面初始化的設定。

【GPU】用來訓練模型的裝置是否需使用 GPU 加速,如果是請將值改為 all;反之,請填空值。(如果填入 all,請確認裝置是否有 GPU)

【solverPath】主要參數。此為 Caffe 訓練所需要的輸入檔 solver.prototxt,檔案內容包含訓練迭代的次數、訓練的參數以及樣本的清單等。如下圖27圖28。

【continueTrainModelPath】接續之前訓練好的模型繼續訓練。將值填入欲接續訓練的模型路徑,模型副檔名務必為 .caffemodel。

 

圖27.3_train.flow 流程之 Caffe_Train.png

圖27.3_train.flow 流程之 Caffe_Train。

 

圖28.solver.prototxt 內容示意圖.png

圖28.solver.prototxt 內容示意圖。

 

 

七、步驟六:測試各訓練階段的模型

 

  1. 目的:用於測試各階段模型的準確度,從中找出合適的模型,避免訓練過度擬合於訓練樣本,而導致測試樣本效果不佳。
  2. 使用說明 :

(1) 訓練樣本:【開啟 OpenR8】 => 【開啟與載入 4_train_result.flow】 => 【執行 flow】 => 【產生 train_result.txt】 

(2) 選擇合適的訓練次數模型 :

如圖29,從 train_result.txt 可以觀察出,模型在某個訓練次數階段的結果可以接受,或者在某個階段之後已達到收斂。因此,我們就選擇此次數的模型是較為合適。

 

圖29.train_result.txt 內容.png

圖29.train_result.txt 內容。

 

 

八、步驟七:測試已訓練好的模型 - inference_image

 

圖29.1train_result.txt 內容.png

 

當模型已訓練好後,可以藉由這一個步驟測試訓練出來的模型。

先使用 OpenR8 開啟【5_inference.flow】,載入檔案。如下圖30圖31

  1. 測試流程

►選擇欲測試的影像,如下圖32。 更換選擇的影像 (20-3439312.jpg),如下圖35,顯示為 20-3439312.jpg 的偵測結果。

►確認電腦是否支援 GPU 加速。點選【Caffe_ObjectDetect_ReadNet】 GPU 之【Edit】,變數區【Value】的【all】改成【】 即為取消使用 GPU 加速。

►選擇訓練效果較好的 model 來偵測圖片。點選【Caffe_ObjectDetect_ReadNet】caffeModelPath 的 【…】 來選擇要使用的訓練模型 (.caffemodel 檔)。

►觀看結果訊息。按下 Run,透過已訓練好的模型,偵測出物件中目標的座標位置以及其類別。如下圖33。

►觀看結果訊息與影像。如果欲看到影像上面偵測出來的結果框,則按下 Debug。顯示出物件偵測的結果。如下圖34,影像上面有預測出人臉的年齡且將其人臉框選出來。

 

圖30.5_inference.flow.png

圖30.5_inference.flow。

 

圖31.載入 5_inference.flow.png

圖31.載入 5_inference.flow。

 

圖32.5_inference 選擇測試影像.png

圖32.5_inference 選擇測試影像。

 

圖33.5_inference 執行結果.png

圖33.5_inference 執行結果。

 

圖34.5_inference Debug 結果.png

圖34.5_inference Debug 結果。

 

圖35.5_inference 另一張影像測試結果.png

圖35.5_inference 另一張影像測試結果。

 

  1. inference.flow 流程內容介紹

►Caffe_Init: Caffe 框架初始化。

►Image_Open:

【imageFileName (String)】欲推論測試的影像路徑。

【image (Image)】依照上面影像檔案名稱將欲推論的影像讀入後,存至此變數。

►Caffe_ObjectDetect_ReadNet

【CaffeObject (Object)】

【GPU (String)】是否開啟 GPU 加速。

【deployPath (String)】讀取網路結構模型。data/deploy.prototxt。

【caffeModelPath (String)】讀入已訓練好的模型 (副檔名為 .caffemodel )。

【labelPath (String)】讀取在使用 labelImg.exe 做標記時,所使用的類別檔。 data/predefined_classes.txt。

【meanFilePath (String)】

►Caffe_ObjectDetect_InferenceImage

【CaffeObject (Object)】

【OutputResult (Json)】將影像推論完後的結果以訊息存至此變數。

【GPU (String)】是否開啟 GPU 加速。

【image (Image)】欲推論的影像。

【confidence Threshold (Float)】信賴閾值。

►Json_Print

【json (Json)】顯示 Caffe_ObjectDetect_InferenceImage 的檢測結果訊息。

►Image_DrawRectJson

【image (Image)】欲推論的影像。

【json (Json)】推論出來的結果訊息。

【imageDrawRectJson (Image)】將推論出來的結果訊息畫至欲推論的影像。

►Debug_Image

【image (Image)】顯示已畫上推論結果訊息的影像。

【displayPercentage (Int)】顯示圖的百分比。值為 200 表示 200 % (圖片放大一倍)、50 表示 50 % (圖片縮小一半),以此類推放大縮小。

【windowTitle (String)】顯示圖視窗的標題。

 

  1. 如果要推論多張影像的測試結果,可以開啟 6_inference_folder.flow 檔案來使用

將欲推論的多張影像放置在自定的資料夾內,如圖36所示。設定欲推論的影像資料夾路徑,如圖37 所示,按 Run 就可以開始多張影像推論,如果欲看到影像上面偵測出來的結果框,則按下 Debug。6_inference_folder.flow 流程內容設定可以參考 5_inference.flow 設定方式。

 

圖36.欲推論的影像資料夾.png

圖36.欲推論的影像資料夾。

 

圖37.推論多張影像的測試結果.png

圖37.推論多張影像的測試結果。

 

 

九、步驟八:擷取 webcam 影像測試已訓練好的模型 - inference_webcam

 

圖37.1推論多張影像的測試結果.png

 

當模型已訓練好後,也可以藉由這一個步驟擷取 webcam 的影像來測試訓練出來的模型。

先使用 OpenR8 開啟【7_inference_webcam.flow】,載入檔案。如下圖38圖39。

  1. 測試流程

►確認 【OpenCV_VideoCapture_Open】 webcam 的【deviceNumber】(筆電鏡頭預設為 0,加裝的 webcam 為 1,依此類推)。如下圖40。

►確認電腦是否支援 GPU 加速。點選【Caffe_ObjectDetect_ReadNet】 GPU 之【Edit】,變數區【Value】的【all】改成【】 即為取消使用 GPU 加速。

►選擇訓練效果較好的 model 來偵測圖片。點選【Caffe_ObjectDetect_ReadNet】caffeModelPath 的 【…】 來選擇要使用的訓練模型( .caffemodel 檔 )。

►按下執行,透過已訓練好的模型,偵測 webcam 擷取影像的物件目標的座標位置以及其類別。如下圖41。

 

圖38.7_inference_webcam.flow.png

圖38.7_inference_webcam.flow。

 

圖39.載入 7_inference_webcam.flow.png

圖39.載入 7_inference_webcam.flow。

 

圖40.7_inference_webcam 確認 webcam deviceNumber.png

圖40.7_inference_webcam 確認 webcam deviceNumber。

 

圖41.7_inference_webcam 執行結果.png

圖41.7_inference_webcam 執行結果。

 

  1. inference_webcam.flow 流程內容介紹

►Caffe_Init: Caffe 框架初始化。

►Caffe_OjbectDetect_ReadNet

【CaffeObject (Object)】

【GPU (String)】是否開啟 GPU 加速。

【deployPath (String)】讀取網路結構模型。data/deploy.prototxt。

【caffeModelPath (String)】讀入已訓練好的模型 (副檔名為 .caffemodel )。

【labelPath (String)】讀取在使用 labelImg.exe 做標記時,所使用的類別檔。 data/predefined_classes.txt。

【meanFilePath (String)】

►OpenCV_VideoCapture_Init: 串流擷取初始化。

►OpenCV_VideoCapture_Open: 開啟指定的 webcam。

►OpenCV_VideoCapture_Grab: 擷取指定的 webcam 影像。

►OpenCV_VideoCapture_Retrieve: 取得 webcam 擷取的影像。

►Caffe_ObjectDetect_inferenceImage

【 CaffeObject (Object) 】

【OutputResult (Json)】將影像推論完後的結果以訊息存至此變數。

【GPU (String)】是否開啟 GPU 加速。

【image (Image)】欲推論的影像。

【ConfidenceThreshold (Float)】信賴閾值。

►Json_Print

【json (Json)】顯示 Caffe_ObjectDetect_inferenceImage 的檢測結果訊息。

►Image_DrawRectJson

【image (Image)】欲推論的影像。

【json (Json)】推論出來的結果訊息。

【imageDrawRectJson (Image)】將推論出來的結果訊息畫至欲推論的影像。

►Image_Show

【image (Image)】顯示已畫上推論結果訊息的影像。

【displayPercentage (Int)】顯示圖的百分比。值為 200 表示 200 % (圖片放大一倍)、50 表示 50 % (圖片縮小一半),以此類推放大縮小。

►Image_DestoryAllWindows:將影像視窗關閉。

►OpenCV_VideoCapture_Release:將 webcam 關閉。


延伸閱讀

1.
OpenR8 社群版 - 人人都會用的 AI 軟體 (免費下載)

[CP 值最好的 AI 人工智慧電腦熱賣中]
硬體採用最新最快的 Titan RTX, RTX-2080Ti-11G, 及 TESLA V100!
視窗圖控介面,易學易用。
硬體優勢:針對深度學習最佳化設計,且經過客戶端 24H 運作驗證。
軟體優勢:事先安裝人工智慧軟體及優化設定,每週提供最新 AI 演算法下載。
公司優勢:專業人工智慧機器人設計公司,資本額一億。
歡迎企業、學校、及公家機關大量採購。
可租用,歡迎來信或來電洽詢。
詳細資料請參閱以下網址: https://tw.openrobot.club/ai_computer