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

一、Image_PCB_SSD300_Keras

 

此 Image_PCB_SSD300_Keras 是透過 Keras 的函式庫,使用 SSD (Single Shot MultiBox Detector) 方法來偵測 PCB 上面的電容。此文章是使用 300 x 300 影像大小做訓練測試,另有 512 x 512 大小的訓練樣本可以參考 ( 可見解決方案 SSD512 說明文件 ),300 x 300 較 512 x 512 運算速度快,但準確度略差 512 x 512。 我們的主要流程如下圖1。

首先,我們需準備想要讓模型學習的影像,將影像中的目標框選起來,且將框選的框標記是什麼類別,此目的是為了讓模型知道這個影像中框起來的物件是屬於何物。 標記檔案準備好後,接著剩下只要透過 OpenR8 Image_PCB_SSD300_Keras 三個 flow 檔案,依序執行即可完成訓練與測試。

 

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

圖1.SSD 偵測電容流程。

 

 

二、資料夾介紹

 

此解決方案 Image_PCB_SSD300_Keras 資料夾內容如下圖2。

內容主要分為前置處理,訓練以及測試三種用途。

 

圖2.資料夾示意圖.png

圖2.資料夾示意圖。

 

  1. 前置處理

前置處理主要為標記框選檔案與執行 .py 檔產生訓練所需的檔案兩部分。

【標記框選檔案】

data/annotation : 放置標記的 xml 檔案。例如 : 1.xml、2.xml 等。    data/image : 放置想要訓練的影像檔。例如 : 1.png、2.png 等。    get_data_from_XML_PCB.py。設定分類的種類名稱以及分類數之檔案。

【產生訓練所需的檔案】

1_prepare.flow。將標記好的檔案轉為訓練所需的 .pkl 檔案。     data/PCB.pkl。為上述執行 1_prepare.flow 所產生的檔案。

 

  1. 訓練模型

訓練模型包含使用者需執行的檔案以及訓練運行的檔案兩部分。

【使用者所需執行之檔案】

2_train.flow。OpenR8 訓練模型之流程檔案,下指令執行 .py 檔案。    src/ssd_run_training.py。設定要分類的類別數量。     data/output/weights.30-1.39.hdf5 為訓練完產生的模型檔案。

【訓練運行之檔案】

ssd.py、ssd_layers.py、ssd_utils.py。Keras 函式庫之 SSD 算法以及訓練檔。 data 資料夾。

 

  1. 測試模型

【使用者所需執行之檔案】

3_inference.flow。OpenR8 測試模型之流程檔案。下指令執行 .py 檔案。    data/pics。放置測試所需的圖片。例如: 1.png、2.png、3.png 等。

data/weights_PCB.hdf5。想要測試的模型。將欲測試的圖片丟進此模型,可得 偵測出的結果。

src/ssd_inference.py。設定分類的類別

【測試運行之檔案】

src/ssd_run_inference.py。測試運行的檔案。

 

 

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

 

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

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

 

  1. 圖像 (想要讓模型學習的影像)

檔案放置位置: openR8/solution/Image_PCB_SSD300_Keras/data/image

(依照目前的 batch size等網路參數設定,建議圖片大於 11 張。此外圖片通道是 3 個通道,如果不是請自行改為 RGB 3 channel)

  1. 標記圖像中目標的 xml 檔案 (框選後才會產生的紀錄檔案)

檔案放置位置: openR8/solution/Image_PCB_SSD300_Keras/data/annotation

 

圖3.標籤完之影像與 xml 檔案放置位置.png

圖3.標籤完之影像與 xml 檔案放置位置。

 

在此 Image_PCB_SSD300_Keras 方案範例中:

目標為偵測 PCB 中的電容,我們透過 labelImg.exe (下圖4)將 PCB 影像中的目標電容框選標記,如下圖11綠框是框選電容以及將其標記成 capacitor (電容)的類別。標記完,儲存時會產生 .xml 檔案。

標記步驟方法如下:

 

第一步:開啟標記軟體

標記軟體位置 openR8/tool/Deep Learning/labelImg,如下圖4,點擊兩下,開啟畫面如圖5:

 

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

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

 

圖5.開啟標籤工具.png

圖5.開啟標籤工具。

 

第二步:設定開啟影像樣本所在資料夾位置。如下圖6。選擇後開啟顯示如下圖7。

 

圖6.選擇影像樣本所在的位置.png

圖6.選擇影像樣本所在的位置。

 

圖7.開啟影像樣本所在位置.png

圖7.開啟影像樣本所在位置。

 

第三步:選擇存放類別標記資料夾。如下圖8。選擇後開啟顯示如下圖9。

 

圖8.選擇儲存標記 xml 檔案所在的位置.png

圖8.選擇儲存標記 xml 檔案所在的位置。

 

圖9.載入儲存標記 xml 檔案所在的位置.png

圖9.載入儲存標記 xml 檔案所在的位置。

 

第四步: 框選樣本圖片並標記類別

按下 Create RectBox 來框選樣本範圍,接著選擇類別,一張圖片並不侷限框選同一種類別,框好後,就可按下 Save 儲存標記類別的檔案,按 Next Image 繼續框選下一張樣本圖片,直到所有樣本圖片皆標記好類別為止。

 

圖10.按下 Create RectBox 來框選樣本.png

圖10.按下 Create RectBox 來框選樣本 。

 

圖11.選擇框選的所屬類別.png

圖11.選擇框選的所屬類別。

 

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

 

 

 

 

四、步驟二:前置處理-定義類別與分類數量

 

此步驟是定義我們將資料分成哪幾種類別以及分類的數量,來讓模型可以透過這些資料學習分類。主要分成三個流程,如下1~3。

 

  1. 開啟 get_data_from_XML_PCB.py 檔案。

請使用 【Notepad++】 開啟 【get_data_from_XML_PCB.py】。如下圖12圖13。

路徑 : solution/Image_PCB_SSD300_Keras/src/get_data_from_XML_PCB.py

 

  1. 修改 Notepad++ 的編碼。請點選【Encoding】=>【Encoding in UTF-8】。如下圖14。

 

  1. 設定想要將資料分類的數量。如下圖15。

請將檔案內的 self.num_classes = 1 的數量【1】改為分類數。

例如:我們將資料分類成電容與 LED 兩類,則 self.num_classes = 2。

 

  1.  設定想要將資料分類的類別。如下圖16。

請將 _to_one_hot(self,name) 裡面的

if name == 'capacitor':

one_hot_vector[0] = 1

設定成資料分類的類別格式,如下:

if name == '類別名稱 a':

one_hot_vector[0] = 1

elif name == '類別名稱 b':

one_hot_vector[1] = 1

......以此類推

例如:我們分成兩種類別,名稱個別為 capacitor 與 led。則需修改成: 

if name == 'capacitor':

one_hot_vector[0] = 1

elif name == 'LED':

one_hot_vector[1] = 1

 

圖12.get_data_from_XML_PCB.py 路徑.png

圖12.get_data_from_XML_PCB.py 路徑。

 

圖13.get_data_from_XML_PCB.py 內容.png

圖13.get_data_from_XML_PCB.py 內容。

 

圖14.修改 Notepad 編碼為 UTF-8.png

圖14.修改 Notepad++ 編碼為 UTF-8。

 

圖15.設定分類數.png

圖15.設定分類數。

 

圖16.設定分類類別名稱.png

圖16.設定分類類別名稱。

 

 

五、步驟三:安裝 Python 以及模組套件

 

如果沒有支援 GPU 加速運算的硬體且裝置未安裝 Python。請設定如下圖17。在環境變數中的 Path 內增加 OpenR8 python 的路徑。反之,設定如下 圖18。

 

圖17.Python Installation 位置圖.png

圖17.Python Installation 位置圖。

 

圖18.Python Installation 示意圖.png

圖18.Python Installation 示意圖。

 

 

六、步驟四:前置處理-1_prepare

 

接著剩下來的步驟,都只需要開啟 OpenR8 軟體,執行 flow 檔。

此步驟只需兩步驟,載入流程檔案與點擊執行,即可完成將前面準備的好的檔案轉成訓練所需的資料。

 

  1. 載入流程檔案。

【滑鼠雙擊 R8.exe=>點選【檔案】=>【開啟】=>solution 資料夾內的Image_PCB_SSD300_Keras=>1_prepare.flow。示意圖如下圖19圖20圖21。

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

 

圖19.R8.png

圖19.R8.exe。

 

圖20.檔案開啟.png

圖20.檔案開啟。

 

圖21.選擇 Image_PCB_SSD300_Keras 資料夾.png

圖21.選擇 Image_PCB_SSD300_Keras 資料夾。

 

圖22.選擇 1_prepare.flow.png

圖22.選擇 1_prepare.flow

 

圖23.載入 1_prepare.flow.png

圖23.載入 1_prepare.flow。

 

  1. 執行流程檔案。只需點擊【執行】就會開始運行流程檔案,利用下指令的方式執行前面準備的 get_data_from_XML_PCB.py。如下圖24圖25。

 

圖24.運行 1_prepare.flow.png

圖24.運行 1_prepare.flow。

 

圖25.執行完成 1_prepare.flow 產生 PCB.pkl 檔.png

圖25.執行完成 1_prepare.flow 產生 PCB.pkl 檔。

 

 

七、步驟五:訓練模型-2_train

 

介紹主要分兩部分,第一點先介紹如何開始做訓練。

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

 

  1. 填入訓練的參數。請開啟C:/Users/ai/Desktop/OpenR8/solution/Image_PCB_SSD300_Keras/src/ssd_run_training.py

在內容中找到 NUM_CLASSES = 1 + 1,前面的 1 表示為想要分類的數量,後面的 1 表示背景。

例如 : 分電容與電阻,前面的 1 需修改為 2,也就是 NUM_CLASSES = 2 + 1。

 

  1. 開啟流程。

使用 OpenR8【開啟 2_train.flow】檔案,載入 2_train,如下圖26圖27。

 

  1. 執行流程。

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

 

  1. ​執行完成,產生模型。

當此執行完成後會產生訓練好的模型,其模型檔案生成放置,如下圖29。路徑為:檔案根目錄/solution/Image_PCB_SSD300_Keras/data/output/檔案名稱 1:xxx. hdf5

 

圖26.2_train 檔案路徑.png

圖26.2_train 檔案路徑。

 

圖27.開啟 2_train.png

圖27.開啟 2_train。

 

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

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

 

圖29.執行完成 2_train 產生的 model 檔.png

圖29.執行完成 2_train 產生的 model 檔。

 

 

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

 

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

 

  1. 開啟流程檔案。

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

 

  1. 設定測試影像。

接著設定需要測試的影像。方法如下圖32。

其中測試的影像請放置於:

資料夾根目錄/solution/Image_PCB_SSD_Keras/data/pics。

 

  1. 設定測試的模型。

請將/data/output訓練好的 weights.30-1.39.hdf5 模型更名為weights_PCB.hdf5,取代 data/weights_PCB.hdf5 的檔案。

 

  1. 設定測試所需要用的類別。檔案位置 :  C:/Users/ai/Desktop/OpenR8/solution/Image_PCB_SSD300_Keras/src/ssd_inference.py 請將內容 voc_classes = ['capacitor'],修改成自己定義的類別  voc_classes = [‘類別1’, ‘類別2’, ‘類別3’….],類別1、類別2……為前面定義好的類別名稱。

例如 : 想要分類電容與LED共兩類,voc_classes = [‘capacitor’, ‘LED’]。

 

  1. 執行,顯示結果。

點選執行。如下圖33。

 

圖30.3_inference.png

圖30.3_inference

 

圖31.載入 3_inference.png

圖31.載入 3_inference

 

圖32.3_inference 選擇測試影像.png

圖32.3_inference 選擇測試影像。

 

圖33.3_inference 測試結果.png

圖33.3_inference 測試結果。

 

 


延伸閱讀

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

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