這個專案結合了深度學習,edge AI 邊緣計算裝置,與機器手臂的控制。透過完成一個智慧檯燈專案,可以學習到深度學習,edge AI 邊緣計算裝置,與機器手臂的控制。
文/人工智慧科技基金會技術發展中心總監
這個專案結合了深度學習,edge AI 邊緣計算裝置,與機器手臂的控制
以下是爸爸的碎念…
市面上的檯燈大多僅注重亮度,少數會多注意到光線柔和不反光。但如果家裡有小小學生就會知道,更多的狀況是小朋友根本沒開燈,或寫字區域根本不在燈的照射範圍內,另外更需要有人時時提醒小朋友的寫字坐姿,請他頭抬起來,腰挺直…
檯燈能不能更聰明,幫家長解決以上問題?
產品主要功能
- 是個檯燈
- 追蹤小朋友的寫字區域
- 提醒小朋友的坐姿
產品結構分析
檯燈本身的樣子就跟機器手臂有 87% 像,因此我用機器手臂來取代檯燈的支架,讓檯燈能夠藉由馬達控制來改變照射的區域與角度,另外也能縮短開發時間。
怎麼知道該照射哪個區域呢?這就是該使用 AI 的地方。由 webcam 擷取影像,Intel Up Squared 開發板做運算,使用 posenet pre-trained model 來找到身體各個主要關節在影像中的位置,然後將右手腕關節位置換算成馬達控制的座標,傳送到 Arduino 控制機器手臂的馬達,便可以讓燈光照射在適當的位置;另外計算各關節的相對位置來判斷坐姿是否正確;同時也以 Arduino 輸出 PWM 訊號控制 LED 燈的亮度。概念圖如下:
Intel Up Squared 開發板
或許大家對於這個開發板較為陌生,但如果提到 Intel NCS 神經計算棒,應該滿多人有聽過,Up squared 開發板就是使用 Intel 的 CPU 再加上與 NCS 同系列晶片的 VPU,專做 AI model 的 inference 工作;使用起來就跟一般電腦沒兩樣,可以安裝 Windows 10 或 Ubuntu 等作業系統,另外還提供與 Raspberry Pi 相同的 40 pin GPIO 腳位,方便外加其他裝置使用。
近期 Intel 的 CPU 裡都有內建 GPU,因此這塊開發板可以同時使用 GPU 和 VPU 來跑兩個不同的 AI model,需要的話還可以在 USB 插上神經計算棒來跑更多 model。當然要使用這些功能是需要安裝 Openvino toolkit 的,安裝方式在官網中有 step by step 的步驟說明。
Openvino
Openvino toolkit 是 Intel 提供的一個深度學習工具包,為了能在 Intel 平台上快速的做 inference,需要使用這個工具包把已經在其他平台訓練好的模型縮減並轉化成 Openvino 的中繼表示 (IR) 檔們。
以下指令將 tensorflow 的 pb 檔轉成 Openvino 的 IR 檔,並且指定輸入大小、輸出層與精度,執行後會產生一個 .xml 檔與一個 .bin 檔。
簡化後的程式主要執行步驟如下:
PoseNet
Openvino 提供了很多 pre-trained model 可以使用,也試過裡面提供的 single-human-pose-estimation-0001 來標出各關節的位置,雖然準確度較高,但 frame rate 只剩不到 2fps,用來控制機器手臂比較不順暢。
因此使用了 PoseNet,本來就開發給 mobile devices 和瀏覽器使用,因此硬體需求較低,雖然準確度也較低,但已足敷使用。Google 只有提供 Tensorflow lite 的 PoseNet pre-trained model,因此需要轉成 Tensorflow 的 pb 檔(這裡有詳細流程),再轉成 Openvino 的 IR 檔(指令如上)。
程式流程
程式流程如下圖,左邊是在 Intel Up squared 開發板上執行的流程,起始時先將 PoseNet 與物件偵測(使用 mobilenet_ssd,只做人物偵測) model 分別載入 GPU 與 HDDL,接下來針對攝影機擷取的每一張影像做身體關節偵測與人物偵測,使用這些資訊來判斷右手的位置與坐姿正確與否,並輸出座標給 Arduino Uno 開發板。
由於目標是快速做出樣品,因此坐姿的判斷是以傳統 rule-based 的方式來做,但缺陷其實很多,這部分應該也要改以 AI 的方式來做判斷較為準確。
右邊的 Arduino 開發板經由 UART 收到右手座標後轉換成每個馬達的轉動角度與方向資訊,用以控制機器手臂。(如下圖,當物體由 X 移動到 Y,底座馬達與第三節馬達分別要轉動的角度為 𝜃1 與 𝜃2),但因為沒有距離資訊 d,所以無法以三角函數直接算出最終角度,只能計算方向(正轉或反轉)與相對的大小,所以就以每次轉動小角度慢慢逼近的方式處理。
Up Squared 與 Arduino 的溝通
前面說到 Up Squared 會計算出右手在影像中的座標,接下來我們使用 UART 這種序列式傳輸技術把座標傳送到 Arduino。
- 在 Arduino 端,可以使用 Serial 這個函式庫
- 在 Intel Up Squared 端,則使用 pySerial 這個函式庫
執行畫面
淺藍色圈圈是關節位置,深藍色框框是物件偵測的結果。右邊模擬姿勢不正的狀態,在左上角有顯示提醒,並且也發出警示音效。
Tinkerkit Braccio 機器手臂
Tinkerkit Braccio 是支六軸機器手臂,也就是有六顆伺服馬達,每個馬達的工作範圍都是180度,分別控制底座旋轉角度、三節手臂的角度、與末端夾具的開合角度,我們以 BraccioV2 函式庫控制手臂各個馬達。
由於不需要抓握東西,因此拆除夾具轉接上燈罩,轉接器與燈罩內的 LED 固定支架則是由 3D 列印製成。