[OpenR8 解決方案] Image_PCB_DefectDetection_SSD512_Caffe (使用 Caffe 及 SSD512 進行PCB 深度學習影像瑕疵檢測)

 

 

一、Image_PCB_DefectDetection_SSD512_Caffe

 

此 Image_PCB_DefectDetection_SSD512_Caffe是利用 Caffe 框架,速度比 Keras 快兩倍以上,先使用 SSD (Single Shot MultiBox Detector) 深度學習演算法來訓練模型,再透過已訓練好的模型偵測 PCB 上面的電容是否有瑕疵,本次訓練圖片大小為 512 × 512。

主要流程如下圖1

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

接著透過 OpenR8 執行 r6 檔自動產生兩個 txt 清單檔,以此讓模型知道有哪些檔案是要進行訓練測試,以及這些檔案中是分成哪幾種類別。

前置處理準備好後,透過 Image_PCB_DefectDetection_SSD512_Caffe 中三個 r6 檔案,依序執行即可完成訓練與測試。

 

圖1.SSD 偵測電容流程.png

圖1.SSD 偵測電容流程。

 

 

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

 

圖1.1SSD 偵測電容流程.png

 

  1. 目的:

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

  1. 內容介紹:

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

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

  1. 圖像 (想要讓模型學習的影像、想要測試模型準確度的影像)
  2. 標記圖像目標位置的 xml 檔案 (框選後,會自動產生的檔案)
  1. 範例:

在此 Image_PCB_DefectDetection_SSD512_Caffe 方案範例中:

偵測 PCB 中的電容,我們透過 labelImg.exe (下圖2) 將PCB影像中的目標電容與瑕疵框選標記,如下圖3紅框是框選有瑕疵的電容並標記為 NG_capacitor 類別。標記完,儲存時會自動產生 .xml 檔案。

標記完,儲存時會自動產生 .xml 檔案。

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

【訓練】

影像請放置 openR8/solution/ Image_PCB_DefectDetection_SSD512_Caffe /data/ image

xml請放置 openR8/solution/ Image_PCB_DefectDetection_SSD512_Caffe/ data/annotation

 

  1. 補充說明:

標記的軟體 labelImg.exe 已隨 OpenR8 檔案附上,其檔案路徑為openR8 > solution > Image_PCB_DefectDetection_SSD512_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. 使用說明:

在路徑 openR8solution Image_PCB_DefectDetection_SSD512_Caffe data 資料夾下,建立trainval.txt。

  1. trainval.txt : 定義訓練有哪些影像以及其標記的檔案。

需自行將欲訓練的檔案以及測試檔案分別輸入至 trainval 的內容裡。

其中輸入的內容格式如下(png 與 xml ):

image/檔案名稱1.png  annotation/檔案名稱1.xml

image/檔案名稱2.png  annotation/檔案名稱2.xml

......

image/檔案名稱n.png  annotation/檔案名稱n.xml

 

  1. 範例:

目前 OpenR8 資料夾內的 Image_PCB_DefectDetection_SSD512_Caffe 範例皆已標記完,如下述:

已標記好的txt檔案位置於如圖5,路徑為:

【trainval.txt】openR8/solution/ Image_PCB_DefectDetection_SSD512_Caffe/data/ trainval.txt

標記內容示意如下圖6

 

圖5.trainval.txt的所在位置.png

圖5.trainval.txt的所在位置。

 

圖6.trainval.txt 的內容示意圖.png

圖6.trainval.txt 的內容示意圖。

 

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

 

圖6.1trainval.txt 的內容示意圖.png

 

  1. 目的:

建立類別 txt,此目的是跟模型說我們這些資料要分成哪幾種類別,藉此讓模型可自行學習將影像進行偵測分類。

  1. 內容介紹:

請在 openR8/solution/Image_PCB_DefectDetection_SSD512_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 之類別名稱、數量相符合。

  1. 範例:

在 openR8/solution/ Image_PCB_DefectDetection_SSD512_Caffe /data 資料夾內的labelmap.prototx,可透由 notepad++ 或記事本開啟檔案。如下圖7。

檔案內容如下圖8,可以看出我們將影像分類成 none_of_the_above (以上皆非) 以及 Pass(正常)、 NG_capacitor、NG_scratch 四類,其中個別標籤編號為 0 與 1、2、3、4。

如果要自行新增類別,請增加類別名稱及標籤號碼,可見如圖15(右)。

 

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

圖7.labelmap.prototxt 檔案路徑。

 

圖8.labelmap內容示意圖 左 增加類別示意圖 右 .png

圖8.labelmap內容示意圖(左),增加類別示意圖(右)。

 

 

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

 

圖8.1labelmap內容示意圖 左 增加類別示意圖 右 .png

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

 

  1. 使用說明 : 開啟與執行 annoset_to_lmdb flow 檔案

 

  1. 請【滑鼠雙擊 R8.exe】=>點選【檔案】=>【開啟】=>【OpenR8 > solution 下的 Image_PCB_DefectDetection_SSD512_Caffe】=> 【1_annoset_to_lmdb.r6】。示意圖如下圖9圖10圖11
  2. 請【點選執行】。如果存在舊的 lmdb 檔案,會跳出是否移除,請點選【是 ( Y ) 】,如下圖12。執行完成後,會產生 trainval_lmdb與 test_lmdb。如下圖13圖14

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

 

圖9.R8..png

圖9.R8.exe。

 

圖10.檔案開啟 annoset_to_lmdb.flow.png

圖10.檔案開啟 annoset_to_lmdb.flow。

 

圖11.載入 annoset_to_lmdb.png

圖11.載入 annoset_to_lmdb。

 

圖12.刪除 lmdb 檔.png

圖12.刪除 lmdb 檔。

 

圖13.執行完成.png

圖13.執行完成。

 

圖14.產生 trainval_lmdb與 test_lmdb.png

圖14.產生 trainval_lmdb與 test_lmdb。

 

  1. annoset_to_lmdb 參數說明

 

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

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

 

此項為設定輸入檔案的路徑與輸出 lmdb 的路徑,其檔案的項目如上圖15

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

  • Caffe_初始化 : Caffe 框架初始化。
  • 檔案_刪除資料夾(圖16):當資料夾中存在舊的 lmdb 檔案資料夾,在開始產生新 lmdb 之前,需先將舊的檔案移除。(訓練用)

如下圖,流程區域點選【檔案_刪除資料夾】出現變數列表,函式列表出現該流程的參數,點擊【資料夾名稱(字串)】的編輯,此資料夾名稱的變數及顯示在變數區,此區域的【值】,【data/train_lmdb/】即為 lmdb 的資料夾。

 

圖16.檔案_刪除資料夾.png

圖16.檔案_刪除資料夾。

 

  • Caffe_物件偵測_創建訓練檔案(圖17):產生 lmdb 檔案。(訓練用)

 

圖17.Caffe_物件偵測_創建訓練檔案.png

圖17.Caffe_物件偵測_創建訓練檔案。

 

  • 下面最後兩個【檔案_刪除資料夾】與【Caffe_物件偵測_創建訓練檔案】:為產生測試模型用的 lmdb,設定方式如上述產生訓練的 lmdb。

 

 

 

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

 

圖17.1Caffe_物件偵測_創建訓練檔案.png

 

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

 

  1. 使用說明 : 訓練模型。

首先,使用 OpenR8【開啟 2_train.r6】檔案,載入 2_train.r6,如下圖18圖19

接著,按下【執行】開始訓練模型,此步驟需花一點時間等待程式建立模型。如下圖20

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

路徑 : OpenR8/solution/ Image_PCB_DefectDetection_SSD512_Caffe /data/

檔案名稱1 : xxx.Caffemodel

檔案名稱2 : xxx. solverstate

 

圖18.2_train 檔案路徑.png

圖18.2_train 檔案路徑。

 

圖19.載入 2_train.png

圖19.載入 2_train。

 

圖20.執行 2_train 與其執行過程圖.png

圖20.執行 2_train 與其執行過程圖。

 

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

圖21.訓練完產生模型。

 

  1. 3_train 流程與參數介紹:
  • Caffe_初始化 : Caffe 框架初始化。
  • Caffe_訓練:

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

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

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

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

 

圖22.2_train 流程之 caffe_訓練.png

圖22.2_train 流程之 caffe_訓練。

 

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

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

 

 

七、步驟七:使用已訓練好的模型進行推論 - inference

 

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

圖23.1solver.prototxt 內容示意圖。

 

當模型已訓練好後,可以藉由這一個步驟使用已訓練好模型做推論。

先使用 OpenR8 開啟【3_inference_image】,載入檔案。如下圖24圖25 。

  1. 使用流程說明 :
  • 選擇欲測試的影像。如下圖26
  • 選擇已訓練好的模型。如下圖27
  • 觀看結果訊息。按下執行,透過已訓練好的模型,偵測出物件中目標的座標位置以及其類別。如下圖28
  • 觀看結果訊息與影像。如果欲看到影像上面偵測出來的結果框,則按下偵錯。顯示出物件偵測的結果。PCB 的影像上面有偵測出電容且將其框選出來。如下圖29

如果裝置未支援 NVIDIA GPU。出現錯誤訊息。請照下圖30圖31操作。

 

圖24.3_inference.png

圖24.3_inference。

 

圖25.載入 3_inference.png

圖25.載入 3_inference。

 

圖26.3_inference 選擇測試影像.png

圖26.3_inference 選擇測試影像。

 

圖27.3_inference 選擇想要做推論的模型.png

圖27.3_inference 選擇想要做推論的模型。

 

圖28.3_inference 執行結果.png

圖28.3_inference 執行結果。

 

圖29.3_inference 偵錯結果.png

圖29.3_inference 偵錯結果。

 

圖30.錯誤訊息-顯示無 GPU.png

圖30.錯誤訊息-顯示無 GPU。

 

圖31.無 NVIDIA GPU 設定方式.png

圖31.無 NVIDIA GPU 設定方式。

 

  1. 流程內容介紹
  • Caffe_初始化: Caffe 框架初始化。
  • 影像_開啟:

【影像檔案名稱 (字串) 】欲推論測試的影像路徑。

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

  • Caffe_物件偵測_讀取網路

【CaffeObject (物件) 】

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

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

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

【labelPath (字串) 】讀取在使用 labelImg.exe 做標記時,所使用的類別檔。

data/predefined_classes.txt。

【meanFilePath (字串) 】

  • Caffe_物件偵測_影像推論

【CaffeObject (物件) 】

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

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

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

【ConfidenceThreshold (浮點數) 】

  • Json_列印

【json (Json) 】顯示 Caffe_物件偵測_影像推論的檢測結果訊息。

  • 影像_以 Json 畫方形

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

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

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

  • 偵錯_影像

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

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

 


延伸閱讀

1.
OpenR8 - 人人都會用的 AI 軟體 (下載)

2.
OpenR8 AI 軟體 使用手冊

3.
[OpenR8 解決方案] Image_Webcam_SSD_Caffe (使用 Caffe SSD 演算法偵測 webcam 即時影像中的物件)

4.
[OpenR8 解決方案] Image_PCB_YOLOv3_Keras (影像分析使用 YOLOv3 演算法及 Keras 函式庫進行 PCB 物件偵測)

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