使用 OpenMV Cam 迅速將機器學習用於物件偵測
資料提供者:DigiKey 北美編輯群
2020-02-25
在現今的嵌入式系統產業中,迫切需要使用機器學習 (ML) 對物件進行偵測和分類,特別是物聯網 (IoT)、保全、先進駕駛輔助系統 (ADAS) 及以工業自動化為架構的系統。不過,物件偵測是個很複雜的主題,機器學習也是相對較新的領域,因此開發機器學習應用來偵測物件,可能是艱鉅且麻煩的任務。
例如,物件偵測以往要求開發人員學習 OpenCV 等架構,並購買數千美元的電腦設備,才能取得成功。因此,傳統的物件偵測與機械視覺方法不只耗時,也很昂貴。
SparkFun Electronics 的 Python 可編程 OpenMV H7 攝影機模組是個創新的解決方案,能讓工程師將機器學習用於物件偵測和機械視覺應用,而無需成為機器學習的專家或購買昂貴的設備。此模組已設計為類似「Arduino」的低成本模組,可用於影像處理與偵測。如此一來,此模組和軟體生態系統便能提供一個獨特而有趣的解決方案,以低成本模組透過機器學習輕鬆實現物件的偵測和分類。
本文將介紹 OpenMV H7 攝影機模組,並說明開發人員如何透過 CIFAR-10 電腦視覺影像資料集,將機器學習用於物件偵測領域。
OpenMV H7 攝影機模組
OpenMV H7 攝影機模組具有功能豐富的軟體資料庫,並提供許多資源,幫助開發人員快速建立機器學習應用。例如,開發人員可將 OpenMV 攝影機用於偵測臉孔和眼睛,甚至是精準地追蹤瞳孔。另外,此模組可用來建立色斑 (blob) 或標記,然後由其追蹤顏色。甚至還有些範例,展示了如何使用機器學習來偵測和追蹤客製化物件。
OpenMV H7 攝影機模組是單一的整合式開發板,含有實現以機器學習為基礎的物件偵測和分類所需的所有硬體元件,而成本卻比傳統的機械視覺系統要少幾個數量級。此模組尺寸較小,僅有 1.4 x 1.75 in,其內含有:
- 高端微控制器
- 可替換的整合式攝影機模組
- 電池連接器
- USB micro 連接器
- 三色 LED
- microSD 插槽 (支援高達 64 GB 的卡片)
- 擴充輸入和輸出 (I/O)
圖 1:OpenMV H7 攝影機模組採用全整合式設計,具有使用機器學習快速開發並部署機械視覺應用所需的全部元件。(圖片來源:SparkFun Electronics)
擴充 I/O 為開發人員提供一系列來自微控制器的周邊裝置功能 (圖 2)。這些功能含有多個通訊介面,例如:
- UART
- SPI
- I2C
- CAN
此外,擴充 I/O 還含有控制與資料通道,可用於驅動伺服器、透過數位類比轉換器 (DAC) 產生訊號,或透過類比數位轉換器 (ADC) 讀取感測器的數值。這些擴充 I/O 讓 OpenMV 模組非常適合用於家庭自動化、機器人引導、工業自動化及物件偵測與空間追蹤等領域的視覺應用。
圖 2:OpenMV H7 攝影機模組具有大量可擴充的 I/O 引腳。這些引腳可用於控制伺服馬達或樣本感測器,也可用於與 Wi-Fi 模組建立通訊,打造 IoT 裝置。(圖片來源:SparkFun)
板載微控制器是 STMicroelectronics 的 STM32F765VIT6,其內含有 Arm Cortex-M7 處理器並採用 100 引腳的 LQFP 封裝。此處理器的執行頻率為 216 MHz,並提供 2 MB 快閃記憶體與 512 KB RAM。此處理器具有雙精度浮點單元 (FPU) 和完整 DSP 指令,因此功能極為強大,非常適合機械視覺應用。此外,這款微控制器還含有硬體型 JPEG 編碼器,可加速成像應用。圖 3 顯示 STM32F765VIT6 的常規方塊圖。
圖 3:STM32F765VIT 具有 2 MB 快閃記憶體、512 KB RAM 以及周邊裝置,例如硬體型 JPEG 編碼和 DSP 指令,因而非常適合機械視覺應用。(圖片來源:STMicroelectronics)
OpenMV H7 攝影機模組的獨特之處在於,其支援多個不同的攝影機模組。例如,如果開發人員不想使用解析度為 640 x 480 的板載攝影機,則可改用支援 ON Semiconductor 的 MT9V034 影像感測器的模組。MT9V034 是一款寬度為 1/3 英吋、格式為 VGA 的 CMOS 主動像素數位成像感測器,具有全域快門和高動態範圍 (HDR) 模式。此感測器的影像解析度為 752 x 480,可在很寬的溫度範圍內 (-30˚C 至 +70˚C) 工作。ON Semiconductor 已針對此影像感測器推出 MT9V034C12STCH-GEVB 開發板 (圖 4)。
圖 4:MT9V034C12STCH-GEVB 是一款用於 MT9V034 影像感測器的開發板,含有內建透鏡,可加速開發與測試。(圖片來源:ON Semiconductor)
開發第一個物件偵測應用
OpenMV H7 攝影機模組的應用開發全部透過 OpenMV IDE 來完成,此 IDE 提供一個 Python 介面實現應用開發 (圖 5)。使用 Python 後,將無需瞭解低階編程語言。實際上,除了能用 Python 編寫指令碼外,OpenMV H7 攝影機模組還可以原生執行 MicroPython。這為開發人員提供一個極為簡便的入門方法,使其可以輕鬆編寫機械視覺應用並執行機器學習推理。
圖 5:OpenMV IDE 提供了基於 Python 的介面,可為 OpenMV H7 攝影機模組開發應用程式碼。此應用隨後會以指令碼形式傳送給執行 MicroPython 的攝影機模組。(圖片來源:Beningo Embedded Group)
設定完成後,開發人員需要先執行基本的 hello_world.py,其中包含清單 1 所示的程式碼。這段 Python 指令碼展示了開發人員如何啟用 OpenMV 攝影機並連續拍攝快照。這可讓開發人員取得即時影片並測量畫格率。連接到 PC 後,畫格率可能會有所變化,範圍為 25 fps 至 60 fps 左右。此應用的執行方式很簡單,只需使用螢幕左下角的連接按鈕將 OpenMV 攝影機連接到 OpenMV IDE,然後按下綠色執行按鈕即可。
複製
# Hello World Example
#
# Welcome to the OpenMV IDE!Click on the green run arrow button below to run the script!
import sensor, image, time
sensor.reset() # Reset and initialize the sensor.sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.skip_frames(time = 2000) # Wait for settings take effect.clock = time.clock() # Create a clock object to track the FPS.
while(True):
clock.tick() # Update the FPS clock. img = sensor.snapshot() # Take a picture and return the image. print(clock.fps()) # Note: OpenMV Cam runs about half as fast when connected
# to the IDE.The FPS should increase once disconnected.
清單 1:OpenMV IDE hello_world.py 應用程式可讓 OpenMV 攝影機模組提供即時影片。(程式碼來源:OpenMV)
若想執行第一個物件偵測和分類測試,則需使用所需的物件識別類別來訓練機器學習網路。CIFAR-10 資料集是一個常用的影像資料集,可用來訓練物件偵測模型並測試該模型的運行狀況。CIFAR-10 資料集內含 60,000 張影像,其中包含以下 10 種影像類別的 32 x 32 彩色影像:
- 飛機
- 汽車
- 鳥
- 貓
- 鹿
- 狗
- 蛙
- 馬
- 船
- 卡車
有關如何訓練模型並將模型轉換為可在 OpenMV 攝影機上執行的推斷,不在本文的討論範圍內。不過,您可跳過模型開發直接執行經過 CIFAR-10 訓練的網路。OpenMV IDE 已包含經過訓練的 CIFAR-10 模型,只要將其載入攝影機即可。
若想使用此模型,請將 OpenMV 攝影機連接到 PC 和 OpenMV IDE。在 OpenMV IDE 中,按一下 tools (工具) -> machine learning (機器學習) -> CNN Network Library (CNN 網路資料庫)。隨即會開啟視窗,並顯示 OpenMV qtcreator 模型資料夾。共有兩個選項:
- cmsisnn
- tensorflow
在 cmsisnn 下,瀏覽至 cifar10 資料夾,然後點擊 cifar10.network。隨即會開啟另一個視窗。這個視窗可將經過訓練的網路檔案儲存在 OpenMV 攝影機上。隨後,使用者可選擇攝影機隨附的大容量儲存磁碟來儲存該網路。
儲存網路後,請前往 File (檔案) -> Examples (範例) -> 25-Machine-Learning (25-機器學習) -> nn_cifar10_search_whole_window.py,載入 CIFAR-10 機器學習範例。此操作會載入如下所示的範例指令碼 (清單 2)。
複製
# CIFAR-10 Search Whole Window Example
#
# CIFAR is a convolutional neural network designed to classify its field of view into several
# different object types and works on RGB video data.#
# In this example we slide the LeNet detector window over the image and get a list of activations
# where there might be an object.Note that use a CNN with a sliding window is extremely compute
# expensive so for an exhaustive search do not expect the CNN to be real-time.
import sensor, image, time, os, nn
sensor.reset() # Reset and initialize the sensor.sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.set_windowing((128, 128)) # Set 128x128 window.sensor.skip_frames(time=750) # Don't let autogain run very long.sensor.set_auto_gain(False) # Turn off autogain.sensor.set_auto_exposure(False) # Turn off whitebalance.
# Load cifar10 network (You can get the network from OpenMV IDE).net = nn.load('/cifar10.network')
# Faster, smaller and less accurate.# net = nn.load('/cifar10_fast.network')
labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# net.search() will search an roi in the image for the network (or the whole image if the roi is not
# specified).At each location to look in the image if one of the classifier outputs is larger than
# threshold the location and label will be stored in an object list and returned.At each scale the
# detection window is moved around in the ROI using x_overlap (0-1) and y_overlap (0-1) as a guide. # If you set the overlap to 0.5 then each detection window will overlap the previous one by 50%.Note
# the computational work load goes WAY up the more overlap.Finally, for mult-scale matching after
# sliding the network around in the x/y dimensions the detection window will shrink by scale_mul (0-1)
# down to min_scale (0-1).For example, if scale_mul is 0.5 the detection window will shrink by 50%. # Note that at a lower scale there's even more area to search if x_overlap and y_overlap are small... # contrast_threshold skips running the CNN in areas that are flat.
for obj in net.search(img, threshold=0.6, min_scale=0.5, scale_mul=0.5, \
x_overlap=0.5, y_overlap=0.5, contrast_threshold=0.5):
print("Detected %s - Confidence %f%%" % (labels[obj.index()], obj.value()))
img.draw_rectangle(obj.rect(), color=(255, 0, 0))
print(clock.fps())
清單 2:OpenMV IDE nn_cifar10_search_whole_window.py 範例應用程式可用於分類影像,並為分類測量置信度。(程式碼來源:OpenMV)
測試應用程式可按照 hello_world.py 指令碼執行,即按一下左下方的 connect (連接),將 OpenMV IDE 連接到模組,然後按一下 run (執行)。此時,攝影機將會執行指令碼,並嘗試分類所看到的影像。終端視窗會輸出某個影像是否已分類,以及置信度為多少。
這時,開發人員只需要呈現 CIFAR-10 資料集內的不同物件,供攝影機分類即可。基於本文的目的,我們為攝影機提供了貓 (圖 6) 和飛機 (圖 7) 的影像。雖然難以從影像中看出,但置信度大約為 70%。置信度之所以可能偏低,是因為訓練影像與測試影像存在差異、照明條件及其他因素。當然,透過額外的訓練並加強對攝影機環境的控制,可達到更高的置信度水平。
圖 6:OpenMV IDE 攝影機針對 CIFAR-10 資料集執行 CNN 網路,並提供貓的影像進行識別。(圖片來源:Beningo Embedded Group)
圖 7:OpenMV IDE 攝影機針對 CIFAR-10 資料集執行 CNN 網路,並提供飛機的影像進行識別。(圖片來源:Beningo Embedded Group)
擴充 OpenMV H7 的能力
OpenMV 模組具有很多擴充途徑,能和不同的攝影機模組,以及幾乎無限量的外部感測器搭配使用。
雖然 OpenMV 模組具有 I/O 擴充能力,但使用外部擴充板來取得額外的電源、接地及通訊訊號也很實用。DFRobot 針對 OpenMV M7 模組推出的 DFR0578 Gravity 擴充板,就是個很實用的擴充板 (圖 8)。從圖中可以看出,Gravity 模組可存取更多電源與接地引腳。此模組甚至擴充了額外的 I2C 線,並提供其他選項為模組供電。這讓外部感測器和模組的介接變得更簡單,而不需使用試驗電路板或接線。
圖 8:DFRobot 針對 OpenMV M7 攝影機推出的 Gravity 擴充板,提供了更多易於存取的排針座,可簡化快速原型開發過程。(圖片來源:DFRobot)
除了 Gravity 板,開發人員可能會覺得另一塊有趣的擴充板也很有用,那就是 DFRobot 的 DFR0498 FireBeetle Covers – 攝影機與音訊媒體板 (圖 9)。FireBeetle 開發模組包含:
- 連接 IIS 編解碼器的介面
- 攝影機模組
- 耳機
- 麥克風
另外,還有許多其他擴充板可連接到 OpenMV H7 攝影機模組,具體要視終端應用而定。
圖 9:DFRobot 的 FireBeetle DFR0498 具有擴充功能,可接入麥克風等媒體元件。(圖片來源:DFRobot)
使用 OpenMV 的秘訣與訣竅
雖然 OpenMV H7 攝影機模組的入門並不難,但開發人員在首次使用此模組時需要注意許多細微的差異和決策。以下是一些入門的「秘訣與訣竅」:
- 首次使用模組時,請確保按照 OpenMV 文件中概述的程序調整模組的焦點。
- 從 Files (檔案) -> Examples (範例) 選單中,取用數十個範例,包括如何偵測顏色到臉部辨識等。
- 為增加網際網路連線能力,請考慮使用 Wi-Fi 擴充板。使用 Tools (工具) -> OpenMV Cam Settings (OpenMV 攝影機設定) 選項,可在 OpenMV IDE 啟動時自動啟用 Wi-Fi 擴充板。
- 考慮使用 TensorFlow Lite 針對感興趣的物件訓練機器學習模組。
開發人員遵循這些「秘訣和訣竅」後,便會發現初次使用 OpenMV H7 攝影機模組時,就能省下很多的時間與錯誤。
結論
如本文所述,OpenMV H7 攝影機模組特別適合協助開發人員將機器學習原則快速應用於物件偵測及相關應用中。開發人員不僅可以使用範例應用程式來加快設計速度,還可使用多種擴充選項來連接攝影機和感測器。開發人員只需要知道如何編寫幾行 Python 程式碼便可順利入門,並可在幾個小時內實現應用,具體要視複雜程度而定。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。