工程筆記本 / AI 人工智慧

AI 人工智慧

【教學】LinkIt 7697 也能玩AI圖像辨識

鄭 建彥📅 2020-12-15👁 28
想要體驗AI互動裝置,但卻只有LinkIt7697單晶片的模組時要如何實現呢? 本篇文章是透過電腦執行圖像辨識後,藉由USB線傳電腦指令給LinkIt7697來進行腳位控制。
撰寫/攝影 許鈺莨
時間 大約一小時
難度

★★☆☆☆

材料表 LinkIt7697 相關套件 (購買連結 購買請洽機器人王國商城喔~
[caption id="attachment_41231" align="aligncenter" width="867"] 電腦和LinkIt 7697接線圖[/caption]

 

本篇文章分成五個部分,才可實現本專題:

  1. 在網站上Teachable Machine上收集資料、訓練及推論,推論後下載檔案至電腦。
  2. 在電腦控制端安裝人工智慧環境建置。
  3. 設計外殼來固定LinkIt 7697、伺服機SG90和三色LED。
  4. LinkIt 7697接上伺服機SG90和三色LED腳位,並貼上要辨識的物品標籤。
  5. 上傳LinkIt 7697受控端的Arduino程式,並執行電腦的圖像辨識程式。

 

第一步:在網站上Teachable Machine上收集資料、訓練及推論,推論後下載檔案至電腦。

先在電腦的C槽根目錄建立名為testAI的資料夾,爾後的程式都需下載到此資料夾中。

[caption id="attachment_41232" align="aligncenter" width="799"] 建立testAI的資料夾[/caption]

  本專題的要辨識的類別有四個,優酪乳(Yogurt)、品客(Pringles)、玩具(TOY)及一種反指標其他(Other),需將這四種類別分別上傳至Teachable Machine網站上做訓練,之後將模型檔及標籤檔下載電腦資料夾,而在Teachable Machine網站收集資料、訓練、即時推論及下載檔案相關教學可參考部落格教學文[1]。  

三個辨識物品

[gallery size="medium" ids="41233,41234,41235"]

  收集圖片至Teachable Machine,如下圖所示:

[gallery columns="2" size="medium" ids="41236,41237"]

當然讀者也可以找三種不同特徵的物品來做訓練。    

第二步:在電腦控制端安裝人工智慧環境建置(若已安裝則可以跳過)。 

此步驟非常重要,因為圖像辨識的程式是在電腦端執行邊緣運算的,需在電腦端安裝Anaconda 軟體及執行AI程式的相關套件,有關電腦的環境建置安裝步驟請參考此部落格[2]。  

第三步:設計外殼來固定LinkIt 7697、伺服機SG90和三色LED。

本專案之外殼是利用3mm的白色透明壓克力板雷射切割出來的,想要雷切檔可以來信到機器人王國商城[3]。 若不想做雷切檔外殼,亦可以找紙盒裁切,將LinkIt 7697、伺服機SG90和三色LED固定住,如下圖所示。

[caption id="attachment_41238" align="aligncenter" width="365"] 第一代紙盒版LinkIt 7697分類器[/caption]

https://youtu.be/MWgi-Wj412M  

第四步:LinkIt 7697接上伺服機SG90和三色LED腳位,並貼上要辨識的物品標籤。

  • 將伺服機SG90和三色LED接上LinkIt 7697擴充板上

接下來是設計LinkIt 7697的I/O控制,請將伺服機SG90和三色LED接到LinkIt 7697 NANO擴充板的腳位上,如下圖所示。

[caption id="attachment_41239" align="aligncenter" width="700"] 擴充板接上伺服機SG90和三色LED[/caption]
SG90腳位 LinkIt 7697擴充板
訊號線(橘色) D10(S)
電源線(紅色) D10(5V)
接地線(棕色) D10(G)
三色LED腳位 LinkIt 7697擴充板
V(黑色) D7(G)
R(紅色) D7(S)
B(藍色) D8(S)
G(綠色) D9(S)
  • 設定伺服機SG90的角度,和貼上類別標籤

本專題將四個類別對應不同角度,利用標籤紙貼在外殼上,以本專題為例,如下圖/表所示

[caption id="attachment_41240" align="aligncenter" width="739"] 伺服機角度設計圖[/caption]

 

類別 角度
TOY(玩具) 0
Pringles(品客) 50
Yogurt(優酪乳) 100
Other(其他) 170
  • 標籤的順序及角度是可以改變的

第五步:上傳LinkIt 7697受控端的Arduino程式,並執行電腦的圖像辨識程式。

  • 首先要下載電腦執行圖形辨識的Python檔案及Arduino程式,到testAI資料夾

下載檔案的網址見[4],並解壓縮AI_7697資料夾 *注意:解壓縮時請注意,AI_7697資料夾只需包一層就好

[caption id="attachment_41237" align="aligncenter" width="501"] 下載檔案之路徑圖[/caption]

 

  • 確定LinkIt 7697的序列埠USB號碼

將LinkIt 7697 USB插入電腦後,開啟裝置管理員連接埠的COM和LPT看號碼

[caption id="attachment_41242" align="aligncenter" width="667"] 查看COM號碼[/caption]

本專案的序列埠號碼為COM3,之後燒錄Arduino程式及執行圖像辨識程式會用到。  

  • 上傳Arduino程式,開啟SERVO_LED_SERIAL.ino 程式並燒錄到LinkIt 7697
[caption id="attachment_41243" align="aligncenter" width="505"] 燒錄程式至LinkIt 7697[/caption]
  • 執行電腦的圖像辨識程式
  • 需開啟Anaconda Prompt(testAI) 視窗
[caption id="attachment_41244" align="aligncenter" width="434"] 開啟Anaconda Prompt(testAI) 視窗[/caption]
  • 切換到指定路徑

[pastacode lang="bash" manual="cd%20C%3A%5CtestAI%5CAI_7697" message="switch to the file location" highlight="" provider="manual"/]

[caption id="attachment_41245" align="aligncenter" width="530"] 輸入移動資料夾指令[/caption]

 

  • 若第一次執行程式,需先安裝 pyserial 套件:

[pastacode lang="bash" manual="pip%20install%20pyserial" message="install pyserial" highlight="" provider="manual"/]

  • 執行程式,請注意檔案都要放在相同路徑下,且要確認 com 編號

[pastacode lang="bash" manual="python%20TM2_UART_tflite.py%20--model%20model.tflite%20--labels%20labels.txt%20--com3" message="run tflite inference" highlight="" provider="manual"/]

[caption id="attachment_41246" align="aligncenter" width="788"] 輸入執行圖像辨識程式指令[/caption]

 

  • 成功開出攝影機的畫面
[caption id="attachment_41247" align="aligncenter" width="800"] 成功開出攝影機辨識畫面[/caption]

 

  • 成功執行畫面
[caption id="attachment_41229" align="aligncenter" width="944"] 成功執行畫面[/caption]

  同時伺服機SG90會轉動,三色LED燈號會亮起,即專案成功執行。 [補充]如何換類別後也可以達到一樣的效果,和程式說明。

  • 改寫Python類別程式

請開啟TM2_UART_tflite.py labels.txt 對照

[caption id="attachment_41248" align="aligncenter" width="863"] TM2_UART_tflite.py和labels.txt對照圖[/caption]

若讀者換了別的物品辨識的話,下載下來的labels.txt也會不同,在下段的TM2_UART_tflite.py程式中,的第1行、第5行、第9行、第13行需改成和labels.txt的相同名稱 Python程式片段說明:

[pastacode lang="python" manual="%20%20%20%20if%20(labels%5Blabel_id%5D%3D%3D'0%20Toy')%20%3A%0A%20%20%20%20%20%20ser.write(b'command_1%5Cn')%20%20%23%20%E8%A8%8A%E6%81%AF%E5%BF%85%E9%A0%88%E6%98%AF%E4%BD%8D%E5%85%83%E7%B5%84%E9%A1%9E%E5%9E%8B%0A%20%20%20%20%20%20%23%20time.sleep(0.5)%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9A%AB%E5%81%9C0.5%E7%A7%92%EF%BC%8C%E5%86%8D%E5%9F%B7%E8%A1%8C%E5%BA%95%E4%B8%8B%E6%8E%A5%E6%94%B6%E5%9B%9E%E6%87%89%E8%A8%8A%E6%81%AF%E7%9A%84%E8%BF%B4%E5%9C%88%0A%0A%20%20%20%20elif%20(labels%5Blabel_id%5D%3D%3D'1%20Pringles')%20%3A%0A%20%20%20%20%20%20ser.write(b'command_2%5Cn')%20%20%23%20%E8%A8%8A%E6%81%AF%E5%BF%85%E9%A0%88%E6%98%AF%E4%BD%8D%E5%85%83%E7%B5%84%E9%A1%9E%E5%9E%8B%0A%20%20%20%20%20%20%23%20time.sleep(0.5)%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9A%AB%E5%81%9C0.5%E7%A7%92%EF%BC%8C%E5%86%8D%E5%9F%B7%E8%A1%8C%E5%BA%95%E4%B8%8B%E6%8E%A5%E6%94%B6%E5%9B%9E%E6%87%89%E8%A8%8A%E6%81%AF%E7%9A%84%E8%BF%B4%E5%9C%88%0A%0A%20%20%20%20elif%20(labels%5Blabel_id%5D%3D%3D'2%20Yogurt')%20%3A%0A%20%20%20%20%20%20ser.write(b'command_3%5Cn')%20%20%23%20%E8%A8%8A%E6%81%AF%E5%BF%85%E9%A0%88%E6%98%AF%E4%BD%8D%E5%85%83%E7%B5%84%E9%A1%9E%E5%9E%8B%0A%20%20%20%20%20%20%23%20time.sleep(0.5)%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9A%AB%E5%81%9C0.5%E7%A7%92%EF%BC%8C%E5%86%8D%E5%9F%B7%E8%A1%8C%E5%BA%95%E4%B8%8B%E6%8E%A5%E6%94%B6%E5%9B%9E%E6%87%89%E8%A8%8A%E6%81%AF%E7%9A%84%E8%BF%B4%E5%9C%88%0A%20%20%20%20%0A%20%20%20%20elif%20(labels%5Blabel_id%5D%3D%3D'3%20Other')%20%20%3A%0A%20%20%20%20%20%20ser.write(b'command_4%5Cn')%20%20%23%20%E8%A8%8A%E6%81%AF%E5%BF%85%E9%A0%88%E6%98%AF%E4%BD%8D%E5%85%83%E7%B5%84%E9%A1%9E%E5%9E%8B%0A%20%20%20%20%20%20%23%20time.sleep(0.5)%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9A%AB%E5%81%9C0.5%E7%A7%92%EF%BC%8C%E5%86%8D%E5%9F%B7%E8%A1%8C%E5%BA%95%E4%B8%8B%E6%8E%A5%E6%94%B6%E5%9B%9E%E6%87%89%E8%A8%8A%E6%81%AF%E7%9A%84%E8%BF%B4%E5%9C%88%0A" message="TM2_UART_tflite.py" highlight="" provider="manual"/]

行數

程式片段說明

1~2

當標籤顯示TOY時,就會傳command_1的字串給LinkIt7697
之後的5~14行程式也是相同意思

 

Arduino程式片段說明:

[pastacode lang="python" manual="%23define%20LED_RED_pin%207%0A%23define%20LED_BLUE_pin%208%0A%23define%20LED_GREEN_pin%209%0A%23define%20Servo_pin%2010%0A%0Aint%20TOY%3D%200%3B%0Aint%20Pringles%20%3D%2050%3B%20%0Aint%20Yogurt%20%3D%20100%3B%0Aint%20otherangle%20%3D%20170%3B%0A%0A%23include%20%3CServo.h%3E%0A%0AServo%20myservo%3B%20%20%2F%2F%20create%20servo%20object%20to%20control%20a%20servo%0A%0AString%20str%3B%0A%0Avoid%20setup(void)%20%20%0A%7B%0A%20%20Serial.begin(9600)%3B%0A%0A%20%20%2F%2F%20init%20pin%20states%0A%20%20pinMode(LED_RED_pin%2C%20OUTPUT)%3B%0A%20%20digitalWrite(LED_RED_pin%2CLOW)%3B%0A%20%20pinMode(LED_BLUE_pin%2C%20OUTPUT)%3B%0A%20%20digitalWrite(LED_BLUE_pin%2CLOW)%3B%0A%20%20pinMode(LED_GREEN_pin%2C%20OUTPUT)%3B%0A%20%20digitalWrite(LED_GREEN_pin%2CLOW)%3B%0A%20%20%0A%20%20myservo.attach(Servo_pin)%3B%20%20%2F%2F%20attaches%20the%20servo%20on%20Servo_pin%20to%20the%20servo%20object%0A%7D%0A%0Avoid%20loop(void)%20%20%0A%7B%0A%20%20%2F%2Fint%20i%3B%0A%20%20digitalWrite(LED_RED_pin%2CLOW)%3B%0A%20%20digitalWrite(LED_BLUE_pin%2CLOW)%3B%0A%20%20digitalWrite(LED_GREEN_pin%2CLOW)%3B%0A%20%20%0A%20%20if%20(Serial.available())%20%7B%0A%20%20%20%20%2F%2F%20%E8%AE%80%E5%8F%96%E5%82%B3%E5%85%A5%E7%9A%84%E5%AD%97%E4%B8%B2%E7%9B%B4%E5%88%B0%22%5Cn%22%E7%B5%90%E5%B0%BE%0A%20%20%20%20str%20%3D%20Serial.readStringUntil('%5Cn')%3B%0A%0A%20%20%20%20if%20(str%20%3D%3D%20%22command_1%22)%20%7B%20%20%20%20%20%2F%2F%20%E8%8B%A5%E5%AD%97%E4%B8%B2%E5%80%BC%E6%98%AF%20%22command_1%22%20%EF%BC%8CTOY%E4%BA%AERED%E7%87%88%0A%20%20%20%20%20%20digitalWrite(LED_RED_pin%2C1)%3B%0A%20%20%20%20%20%20digitalWrite(LED_BLUE_pin%2C0)%3B%0A%20%20%20%20%20%20digitalWrite(LED_GREEN_pin%2C0)%3B%0A%20%20%20%20%20%20myservo.write(TOY)%3B%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94%E8%BD%89%E5%88%B00%E5%BA%A6%0A%20%20%20%20%20%20Serial.println(%22command_1%22)%3B%20%0A%20%20%20%20%7D%20%0Aelse%20if%20(str%20%3D%3D%20%22command_2%22)%20%7B%20%20%2F%2F%20%E8%8B%A5%E5%AD%97%E4%B8%B2%E5%80%BC%E6%98%AF%20%22command_2%22%EF%BC%8CPringles%E4%BA%AEYELLOW%E7%87%88%0A%20%20%20%20%20%20digitalWrite(LED_RED_pin%2C0)%3B%0A%20%20%20%20%20%20digitalWrite(LED_BLUE_pin%2C1)%3B%0A%20%20%20%20%20%20digitalWrite(LED_GREEN_pin%2C0)%3B%0A%20%0A%20%20%20%20%20%20myservo.write(Pringles)%3B%20%20%20%20%20%20%20%20%20%2F%2F%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94%E8%BD%89%E5%88%B0100%E5%BA%A6%0A%20%20%20%20%20%20Serial.println(%22command_2%22)%3B%0A%20%20%20%20%7D%20%0A%20%20%20%20else%20if%20(str%20%3D%3D%20%22command_3%22%20)%20%7B%20%2F%2F%20%E8%8B%A5%E5%AD%97%E4%B8%B2%E5%80%BC%E6%98%AF%20%22command_3%22%20%EF%BC%8CYogurt%E4%BA%AEGREEN%E7%87%88%0A%20%20%20%20%20%20digitalWrite(LED_RED_pin%2C0)%3B%0A%20%20%20%20%20%20digitalWrite(LED_BLUE_pin%2C0)%3B%0A%20%20%20%20%20%20digitalWrite(LED_GREEN_pin%2C1)%3B%0A%20%20%20%20%20%20myservo.write(Yogurt)%3B%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94%E8%BD%89%E5%88%B0150%E5%BA%A6%0A%20%20%20%20%20%20Serial.println(%22command_3%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%20(str%20%3D%3D%20%22command_4%22%20)%20%7B%20%2F%2F%20%E8%8B%A5%E5%AD%97%E4%B8%B2%E5%80%BC%E6%98%AF%20%22command_4%22%EF%BC%8COther%E4%B8%8D%E4%BA%AE%E7%87%88%0A%20%20%20%20%20%20digitalWrite(LED_RED_pin%2C0)%3B%0A%20%20%20%20%20%20digitalWrite(LED_BLUE_pin%2C0)%3B%0A%20%20%20%20%20%20digitalWrite(LED_GREEN_pin%2C0)%3B%0A%20%20%20%20%20%20myservo.write(otherangle)%3B%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94%E8%BD%89%E5%88%B0170%E5%BA%A6%0A%20%20%20%20%20%20Serial.println(%22command_4%22)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A" message="SERVO_LED_SERIAL.ino" highlight="" provider="manual"/]

行數 程式片段說明
1~4 定義三色LED腳位,紅色接LinkIt7697擴充板D7 藍色接LinkIt7697擴充板D8 綠色接LinkIt7697擴充板D9
6~9       定義物品類別角度,伺服機轉到TOY為0度 伺服機轉到Pringles為50度 伺服機轉到Yogurt為100度 伺服機轉Other到為170度
43~70 當接收到command_1的字串,則伺服機會轉動至0度,同時三色LED燈會亮起紅燈,50~70行程式,也是同樣意思。

 

https://youtu.be/2SDVqQQjOBQ

[1] 在Teachable Machine網站收集資料、訓練、即時推論及下載檔案至電腦步驟:https://blog.cavedu.com/2020/11/26/google-teachable-machine-raspberry-pi-4/

[2]在電腦中安裝人工智慧環境建置:https://blog.cavedu.com/2018/09/28/general_env_setup_anaconda_tensorflow_keras_opencv/

[3]機器人王國信箱:service@robotkingdom.com.tw

[4]下載本專題程式連結:https://pse.is/38mrnh

相關文章 📎

留言 💬 (0)

還沒有留言,來當第一個。