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

一、Image_Webcam_SSD_Caffe 介紹

 

本文件是介紹 caffe 中的 SSD 方法來偵測與標記 webcam 即時影像中的物件。

透過 Image_Webcam_SSD_Caffe 來了解 Caffe 是如何判斷即時影像分析物體,所以首先,本文件會先介紹 Image_Webcam_SSD_Caffe 如何標記分類,使用 R8 軟體開啟 Image_Webcam_SSD_Caffe 內的解決方案產生數據庫、訓練、偵測 webcam 影像。

其操作使用主要流程為下圖 1,每一個步驟於本文件之每一章節會依序詳細介紹。

 

圖 1.製作訓練樣本的流程 .png

圖 1.製作訓練樣本的流程。

 

※如果只是想測試 webcam 即時影像偵測功能,可直接跳到第六章 ― 執行 3_inference_webcam.flow 。

 

※如果想增加(改變)樣本數、增加(改變)樣本類別,請看第三章到第六章來標記樣本類別、重新產生數據庫及重新訓練樣本。

 

※如果在運行中有任何問題,可參考第七章 ― 補充說明。

 

 

二、Image_Webcam_SSD_Caffe 資料夾介紹

 

Image_Webcam_SSD_Caffe 位於 OpenR8的 solution 資料夾內,其中包含:

 

  1. 資料夾:【data 資料夾】。
  2. flow 檔案:【1_annoset_to_lmdb.flow】、【2_train.flow】、【3_inference_webcam.flow】。
  3. exe 執行檔:【labelImg.exe】。

 

*初次使用 caffe、對 caffe 一些相關設定不熟悉者,可參照下載Image_Webcam_SSD_Caffe 內的檔案位置放置對應的檔案,等到熟悉路徑後,可自行更換存放位置、內容。

 

 

圖 2.Image_Webcam_SSD_Caffe 位置 .png

圖 2. Image_Webcam_SSD_Caffe 位置。

 

圖 3.Image_Webcam_SSD_Caffe 資料夾 .png

圖 3. Image_Webcam_SSD_Caffe 資料夾。

 

名稱

用途與功能

內容

data

存放樣本圖片、樣本類別、數據庫的地方,其資料夾內容表 2會做說明。

VOC2007、

trainval_lmdb、

test_lmdb、

deploy.prototxt、labelmap_voc.prototxt、

predefined_classes.txt、

solver.prototxt

test.prototxt、

test.txt、

test_name_size.txt、

train.prototxt、

trainval.txt、

XXX.caffemodel 檔。

1_annoset_to_lmdb.flow

將訓練樣本變成數據庫(lmdb)。

 

2_train.flow

用來訓練樣本。

 

3_inference_webcam.flow

即時影像分析物體。

 

labelImg.exe

標記樣本圖片所屬類別之軟體。

 

表1. Image_Webcam_SSD_Caffe 資料夾介紹。

 

圖 4.Image_Webcam_SSD_Caffe 的 data 資料夾內容 .png

圖 4. Image_Webcam_SSD_Caffe 的 data 資料夾內容。

 

data 資料夾內容

用途

關聯性

資料夾/檔案 內容

test_lmdb 資料夾

放置測試樣本數據庫的資料夾

1_annoset_to_lmdb.flow 運行所產生、solver.prototxt 的 test_net 填的路徑。。

data.mdb lock.mdb

trainval_lmdb 資料夾

放置訓練樣本數據庫的資料夾

1_annoset_to_lmdb.flow 運行所產生、solver.prototxt 的 trainval_net 填的路徑。

data.mdb lock.mdb

VOC2007 資料夾

VOC2012 資料夾

存放樣本圖片與樣本類別的地方。

labelImg.exe 開啟樣本圖檔來標示類別。

JPEGImages 資料夾:存放樣本圖片。

Annotations 資料夾:存放透過 labelImg.exe 標記完的樣本類別檔案(xml 檔)。

deploy.prototxt

讀取神經網路結構模型。

3_inference_webcam.flow 的 Caffe_物件偵測_讀取網路函式中,deployPath 需要讀入此檔案。

 

labelmap_voc.prototxt

標示的類別編號。

1_annoset_to_lmdb.flow 的 Caffe_物件偵測_創建訓練檔案函式中,labelMapFile 需要讀入此檔案。

需自行生成,格式如圖 5。

predefined_classes.txt

labelImg.exe 標記類別時,使用的檔案。

labelImg.exe 選擇標記的類別時,出現的名稱、

3_inference_webcam.flow 的 Caffe_物件偵測_讀取網路函式中,labelPath 需要讀入此檔案。

需自行更新,看想分多少種類別,就有多少行類別名稱。

solver.prototxt

Caffe 的參數設定。

2_train.flow 的 Caffe_訓練函式中,solverPath 需要讀入此檔案。

 

test.prototxt

讀取訓練測試的神經網路結構模型。

無。

需自行生成,請參照圖14格式。

test.txt

輸入測試圖檔的檔案名稱與測試類別標記的檔案名稱。

1_annoset_to_lmdb.flow 的 Caffe_物件偵測_創建訓練檔案函式中,listFile 需要讀入此檔案。

需自行生成,請參照圖 14 格式。

train.prototxt

讀取訓練的神經網路結構模型。

無。

 

trainval.txt

輸入樣本圖檔的檔案名稱與樣本類別標記的檔案名稱。

1_annoset_to_lmdb.flow 的 Caffe_物件偵測_創建訓練檔案函式中,listFile 需要讀入此檔案。

需自行生成,請參照圖14.格式。

VGG_VOC0712_SSD

_300x300_iter_120000 .caffemodel

訓練出來的 caffe model。

2_train.flow 執行完後所產生的檔案。

 

表2. Image_Webcam_SSD_Caffe 的 data 資料夾介紹。

 

【labelmap_voc.prototxt】的內容,如圖 5,有幾種類別就會有幾個 item{},label:0 的 background 指的是背景,請從 label:1 開始修改類別名稱。

 

圖 5. labelmap_voc.prototxt的內容格式 .png

圖5. labelmap_voc.prototxt 的內容格式。

 

 

三、準備訓練樣本圖

 

我們要使用 caffe 來 訓練時,要先決定好方向,比如說:我想分辨出這是人、動物、車子……等。為此,我們需要準備人、動物、車子……的圖片,將其圖片一一標示它們的類別(人、動物、車子……),才能加入 caffe 訓練。

 

  • 第一步:開啟標記軟體。

開啟 Image_webcam_SSD_Caffe 資料夾內的 “LABELIMG.EXE” 來標記我們想訓練的樣本類別。

 

圖 6.LABELIMG.EXE 的介面 .png

圖 6.LABELIMG.EXE 的介面。

 

  • 第二步:選擇樣本圖片存放資料夾。

點選 Open Dir 來開啟圖片樣本所放的資料夾位置,以下圖7.為例,將圖片放在了 data/VOC2007/JPEGImages 中(根據每個人放的位置,資料夾的位置也不同,第一次使用建議放在 data/VOC2007/JPEGImages 取代原本的圖),然後按下【選擇資料夾】。

 

圖 7.開啟樣本圖檔所在的位置 .png

圖 7.開啟樣本圖檔所在的位置。

 

  • 第三步:選擇存放類別標記資料夾。

點選 Change Save Dir 來開啟圖片樣本標記完類別後,所存放的資料夾位置,以下圖8.為例,將圖片放在了 data/VOC2007/Annotations 中(根據每個人放的位置,資料夾的位置也不同,第一次使用建議放在 data/VOC2007/Annotations 取代原本的標記檔案),然後按下【選擇資料夾】。

 

建議:樣本圖片與樣本類別的資料夾位置,最好放在同一個資料夾內,意思是假設有個 data 的資料夾,那裏面就只分兩個資料夾,一個存樣本圖片,一個存樣本類別。

 

圖 8.選擇樣本圖檔標記類別後所存放的資料夾位置 .png

圖 8.選擇樣本圖檔標記類別後所存放的資料夾位置。

 

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

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

 

圖 9.樣本圖檔 .png

圖 9.樣本圖檔。

 

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

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

 

圖 11.選擇樣本類別後按下 OK .png

圖 11.選擇樣本類別後按下 OK。

 

圖 12.框好樣本類別後按下 Save .png

圖 12.框好樣本類別後按下 Save。

 

圖 13.按下 Next Image 到下一張圖片繼續框選類別 .png

圖 13.按下 Next Image 到下一張圖片繼續框選類別。

 

框完所有的樣本後,需要再製作兩個檔案【trainval.txt】、【test.txt】。

 

  1. 【trainval.txt】:

內容需要放樣本圖片的路徑(選擇 Open Dir 的位置)與框選樣本類別檔案(選擇Change Save Dir) 的路徑,其格式如下圖.14。

 

圖 14.trainval.txt的內容範例 .png

圖 14. trainval.txt 的內容範例

 

如圖 14,

VOC2007 為共同存放樣本圖片與樣本類別的資料夾名稱。

JPEGImages 為存放樣本圖片的資料夾名稱。

Annotations 為存放樣本類別的資料夾名稱。

000001.jpg 為樣本圖檔的檔名。

000001.xml 為對應的樣本圖檔名之類別檔案名稱。

所以如果有100個樣本,就會有100行如圖 14的格式。

 

  1. 【test.txt】:

內容需要放圖片的路徑與框選樣本類別檔案(xml 檔) 的路徑,其格式同【trainval.txt】。

 

*注意:trainval.txt 與 test.txt 要與共同存放樣本圖片與樣本類別的資料夾同一層。

 

 

登入後,即可看到完整文章。

 

 

 

 

四、執行 1_annoset_to_lmdb.flow 產生數據庫

 

在【OpenR8 資料夾】底下有一個【R8.exe】執行檔。如下圖15。滑鼠點擊兩下即可執行 R8.exe。

 

圖 15.執行 R8.exe .png

圖 15.執行 R8.exe。

 

執行 R8.exe 後,第一次登入需輸入帳號密碼。如下圖16。

Open Robot ID (Email) : 登入開源機器人俱樂部的帳號。

Password : 登入開源機器人俱樂部會員的密碼。

 

圖 16.登入開源機器人帳號 .png

圖 16.登入開源機器人帳號。

 

請點選【File】=>【Language】=>【繁體中文】=>【確定】。如下圖17

點選完,請關閉 OpenR8,再次執行R8.exe。即可顯示繁體中文介面。如下圖 18

 

圖 17.變更語言成為繁體中文介面 .png

圖 17.變更語言成為繁體中文介面。

 

圖 18.繁體中文介面 .png

圖 18.繁體中文介面。

 

請點選【檔案】=>【開啟】=>【進入到 OpenR8 底下的 solution 資料夾】=>【選擇 Image_Webcam_SSD_Caffe 資料夾】=>【選擇 1_annoset_to_lmdb.flow 開啟】,如圖 19圖 20

 

圖 19.選擇 1_annoset_to_lmdb.flow .png

圖 19.選擇 1_annoset_to_lmdb.flow。

 

圖 20.開啟 1_annoset_to_lmdb.flow .png

圖 20.開啟 1_annoset_to_lmdb.flow。

 

按下執行產生數據庫(前提條件:trainval.txt 存在且其內容、路徑無誤),直到跳出「Press any key to continue…」(有閃退現象請參考第七章 ― 補充說明)。

 

以下是流程的函數介紹。

 

圖 21.1_annoset_to_lmdb.flow 的流程 .png

圖 21.1_annoset_to_lmdb.flow 的流程。

 

 

  1. Caffe_ 初始化:

     一開始會將 Caffe 初始化。

 

圖 22.1_annoset_to_lmdb.flow 的 Caffe_初始化 .png

圖 22.1_annoset_to_lmdb.flow 的 Caffe_ 初始化。

 

  1. 檔案_刪除資料夾:

將原本舊有的 trainval_lmdb 資料夾(訓練用)刪除。

 

圖 23.1_annoset_to_lmdb.flow 刪除訓練用的 trainval_lmdb 資料夾 .png

圖 23.1_annoset_to_lmdb.r6 刪除訓練用的 trainval_lmdb 資料夾。

 

  1. Caffe_ 物件偵測_創建訓練檔案(Caffe_ObjectDetect_CreateTrainData):

讀取 trainval.txt 內的樣本圖與類別來建立(訓練用)數據庫(lmdb)。

 

圖 24.1_annoset_to_lmdb.flow 建立訓練用的數據庫 .png

圖 24.1_annoset_to_lmdb.flow 建立訓練用的數據庫。

 

  1. 檔案_刪除資料夾:

將原本舊有的 test_lmdb 資料夾(測試用)刪除。

 

圖 25.1_annoset_to_lmdb.flow 刪除測試樣本用的 test_lmdb 資料夾 .png

圖 25.1_annoset_to_lmdb.flow 刪除測試樣本用的 test_lmdb 資料夾。

 

  1. Caffe_ 物件偵測_創建訓練檔案(Caffe_ObjectDetect_CreateTrainData):

讀取 test.txt 內的樣本圖與類別來建立(測試用)數據庫(lmdb)。

 

圖 26.1_annoset_to_lmdb.flow 建立測試用的數據庫 .png

圖 26.1_annoset_to_lmdb.r6 建立測試用的數據庫。

 

 

五、執行 2_train.flow 訓練樣本

 

執行完 1_annoset_to_lmdb.flow 後,在開啟 2_train.flow,如圖 27圖 28

 

圖 27.選擇 2_train.flow .png

圖 27.選擇 2_train.flow。

 

圖 28.開啟 2_train.flow .png

圖 28.開啟 2_train.flow。

 

※如果電腦沒有 GPU 或沒有要使用 GPU 訓練,請到【Caffe_訓練】的 “GPU” 欄位,將 “all” 改成 “” (甚麼都不填)。

按下執行開始訓練樣本(前提條件:已產生數據庫。)

 

 

  1. Caffe_ 初始化:

一開始會將 Caffe 初始化。

 

圖 29.2_train.flow 的 Caffe_初始化 .png

圖 29.2_train.flow 的 Caffe_初始化。

 

  1. Caffe_ 訓練:

讀入 solver.prototxt 檔案(內含 caffe 用的一些參數設定),設定是否有無 GPU 後,即可開始執行,如圖30。

 

圖 30.2_train.flow的 Caffe_訓練 .png

圖 30.2_train.flow的 Caffe_訓練。

 

 

六、執行 3_inference_webcam.flow 偵測 webcam 影像

 

執行完 2_train.flow 後,在開啟 3_inference_webcam.flow,如圖 31圖 32

 

圖 31.選擇 3_inference_webcam.flow .png

圖 31.選擇 3_inference_webcam.flow。

 

圖 32.開啟 3_inference_webcam.flow .png

圖 32.開啟 3_inference_webcam.flow。

 

※如果電腦沒有 GPU ,請到【Caffe_物件偵測_讀取網路】的 “enableGPU” 欄位,將 “all” 改成 “” (甚麼都不填)。

※如果有重新訓練,請到【Caffe_物件偵測_讀取網路】的 “caffeModelPath” 欄位,選擇更改後的caffe model 檔案。

按下執行即可開啟相機偵測物體,如圖 33

 

圖 33.開啟 webcam 偵測物體 .png

圖 33.3_inference_webcam.r6 的流程。

 

※如果要切換其他相機,可參考下方流程函式介紹【OpenCV_串流擷取_開啟】的裝置碼。

以下是流程的函式介紹。

 

圖 34.3_inference_webcam.flow 的流程 .png

圖 34.3_inference_webcam.r6 的 R7_EnableWxWidgets。

 

  1. R7_EnableWxWidgets:

建立一個視窗(wxwidgets 版本)。

 

圖 35.3_inference_webcam.flow 的 R7_EnableWxWidgets .png

圖 35.3_inference_webcam.flow 的 R7_EnableWxWidgets。

 

  1. Caffe_ 初始化:

將 Caffe 初始化。

 

圖 36.3_inference_webcam.flow 的 Caffe_初始化 .png

圖 36.3_inference_webcam.flow 的 Caffe_初始化。

 

  1. Caffe_ 物件偵測_讀取網路:
  • CaffeObject:來自於上一個【Caffe_ 初始化】的物件。
  • enableGPU:選擇是否具有 GPU 功能。
  • deployPath:讀取【deploy.prototxt】的相對路徑。
  • caffeModePath:讀取【XXX.caffemodel】的相對路徑,此檔案來自於上一步 train.flow 產生的結果。
  • labelPath:讀取【predefined_classes.txt】的相對路徑,此檔案存放所有類別之名稱。
  • meanFilePath:計算圖片均值的檔案路徑。

 

圖 37.3_inference_webcam.flow 的 Caffe_物件偵測_讀取網路 .png

圖 37.3_inference_webcam.flow 的 Caffe_物件偵測_讀取網路。

 

  1. OpenGL_ 新增視窗:

新增一個用來顯示影像的視窗。

OpenGL 視窗物件:建立的視窗物件。

OpenGL 視窗標題:顯示的視窗名稱。

 

圖 38.3_inference_webcam.flow的 OpenGL_新增視窗 .png

圖.38.3_inference_webcam.flow的 OpenGL_新增視窗。

 

  1. OpenGL_ 顯示視窗:

將上一點建立的 OpenGL 視窗物件填入來顯示視窗。

 

圖 39.3_inference_webcam.flow的 OpenGL_顯示視窗 .png

圖.39.3_inference_webcam.flow的 OpenGL_顯示視窗。

 

  1. R7_ProcessWxPendingEvents:

建立一個 wxwidgets 事件程序。

 

圖 40.3_inference_webcam.flow 的 R7_ProcessWxPendingEvents .png

圖40.3_inference_webcam.flow 的 R7_ProcessWxPendingEvents。

 

  1. OpenCV_ 串流擷取_初始化:

使用 OpenCV 來擷取影像,一開始先初始化。

 

圖 41.3_inference_webcam.flow 的 OpenCV_串流擷取_初始化 .png

圖41.3_inference_webcam.flow 的 OpenCV_串流擷取_初始化。

 

  1. OpenCV_ 串流擷取_開啟:

串流擷取物件:來自於上一個【OpenCV_ 串流擷取_初始化】的物件。

裝置碼:可以指定要使用第幾隻相機,0為第一隻,1為第二隻……依此類推。

 

圖 42.3_inference_webcam.flow 的 OpenCV_串流擷取_開啟 .png

圖42.3_inference_webcam.flow 的 OpenCV_串流擷取_開啟。

 

  1. For 迴圈:

圖 43為例,這裡執行 5000 次來準備循環擷取視訊畫面,可依個人需求調整次數。

 

圖 43.3_inference_webcam.flow 的 For 迴圈 .png

圖 43.3_inference_webcam.flow 的 For 迴圈。

 

  1. OpenCV_ 串流擷取_擷取:

擷取當下相機拍到畫面。

 

圖 44.3_inference_webcam.flow 的 OpenCV_串流擷取_擷取 .png

圖.44.3_inference_webcam.flow 的 OpenCV_串流擷取_擷取。

 

  1. OpenCV_ 串流擷取_取得:

取得上一點【OpenCV_ 串流擷取_擷取】的畫面影像。

 

圖 45.3_inference_webcam.flow 的 OpenCV_串流擷取_取得 .png

圖 45.3_inference_webcam.flow 的 OpenCV_串流擷取_取得。

 

  1. Caffe_ 物件偵測_影像推論:

將上一點【OpenCV_ 串流擷取_取得】的影像餵入 Caffe 來判斷是否有所屬類別。

  • CaffeObject:第三點【Caffe_ 物件偵測_讀取網路】所選擇的 CaffeObject 物件。
  • enableGPU:是否具有 GPU 功能。
  • 影像:上一點【OpenCV_ 串流擷取_取得】的影像。
  • ConfidenceThreshold:檢測閾值。

 

圖 46.3_inference_webcam.flow 的 Caffe_物件偵測_影像推論 .png

圖46.3_inference_webcam.flow 的 Caffe_物件偵測_影像推論。

 

  1. 影像_以 Json 畫方形:

若上一點【Caffe_ 物件偵測_影像推論】有判斷出類別時,會將位置已 Json 的形式輸出,這裡將 Json 讀入,畫在第11點的【OpenCV_ 串流擷取_取得】的圖片中。

 

圖 47.3_inference_webcam.flow 的影像_以 Json 畫方形 .png

圖47.3_inference_webcam.flow 的影像_以 Json 畫方形。

 

  1. OpenGL_ 顯示影像:

將上一點【影像_以 Json 畫方形】所畫的結果影像顯示在第五點【OpenGL_ 顯示視窗】中。

 

圖 48.3_inference_webcam.flow 的 OpenGL_顯示影像 .png

圖48.3_inference_webcam.flow 的 OpenGL_顯示影像。

 

  1. For 迴圈結束:

For 迴圈內容為:擷取影像 => 判斷類別 => 顯示影像。

所以顯示影像後,需要一個【For 迴圈結束】,來表示迴圈結束的位置。  

圖 49.3_inference_webcam.flow 的 For 迴圈結束 .png

 圖49.3_inference_webcam.flow 的 For 迴圈結束。

 

  1. OpenCV_ 串流擷取_釋放:

​最後結束使用相機。

 

圖 50.3_inference_webcam.flow 的 OpenCV_串流擷取_釋放 .png

圖 50.3_inference_webcam.flow 的 OpenCV_串流擷取_釋放 。

 

 

七、補充說明

 

以下是有可能會遇到的問題:

產生數據庫之前:

  1. 在開啟 labelImage 之前,先確定要分類的類別名稱,填入位於 data 資料夾內的 predefined_classes.txt 中。

舉例:假設想測試是否能分出魚、青蛙、蛇、麻雀、人,這五種類別。

在 predefined_classes.txt 的內容則為圖 51。

※不支援類別名稱有空格,像是這種Passer montanus saturates 中間有空格的,請用底線(像是 Passer_montanus_saturatus)或別種命名方式代替。

 

圖 51.在 predefined_classes.txt 修改類別名稱 .png

圖 51.在 predefined_classes.txt 修改類別名稱 。

 

  1. 在標記完類別後,是否有產生 trainval.txt 與 test.txt。

 

產生數據庫時:

  1. trainval.txt 與 test.txt 內容的圖片、標記檔路徑填錯,會導致無法生成數據庫,路徑格式請看圖 14
  2. labelmap_voc.prototxt 的分類類別是否更新。

舉例:

圖 51 為例,其 labelmap_voc.prototxt 內容則需更改為圖 52

 

圖 52.在 labelmap_voc.prototxt 修改類別名稱 .png

圖 52.在 labelmap_voc.prototxt 修改類別名稱 。

 

  1. 如果要訓練的圖片眾多或圖片,所產生的數據庫相對會比較大,若中途閃退,請清出空間來產生數據庫 (若以本文件的數據庫為例, 1 萬多張的 png 檔會產生 1 GB 多的數據庫)。

 

訓練樣本時:

  1. 是否 trainval_lmdb 與 test_lmdb 已經產生。
  2. 確認電腦是否要使用 GPU 訓練。

 

圖 53.沒有 GPU 的錯誤訊息 .png

圖 53.沒有 GPU 的錯誤訊息。

 

使用 webcam 偵測物體時:

  1. 確認電腦是否要使用 GPU 加速。

 


延伸閱讀

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

2.
[ezAI 簡單學AI] PCB 電路板的深度學習影像分析

3.
[ezAI 簡單學 AI] 深度學習 Live 影像分析及深度學習股價預測

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