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

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

★★☆☆☆

材料表LinkIt7697 相關套件 (購買連結)  購買請洽機器人王國商城喔~
電腦和LinkIt 7697接線圖

 

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

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

 

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

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

建立testAI的資料夾

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

三個辨識物品

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

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

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

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

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

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

第一代紙盒版LinkIt 7697分類器

https://youtu.be/MWgi-Wj412M  

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

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

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

擴充板接上伺服機SG90和三色LED
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的角度,和貼上類別標籤

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

伺服機角度設計圖

 

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

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

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

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

下載檔案之路徑圖

 

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

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

查看COM號碼

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

  • 上傳Arduino程式,開啟SERVO_LED_SERIAL.ino 程式並燒錄到LinkIt 7697
燒錄程式至LinkIt 7697
  • 執行電腦的圖像辨識程式
  • 需開啟Anaconda Prompt(testAI) 視窗
開啟Anaconda Prompt(testAI) 視窗
  • 輸入 cd \testAI\AI_7697
輸入移動資料夾指令
  • 輸入python TM2_UART_tflite.py –model model.tflite –labels labels.txt –com3
輸入執行圖像辨識程式指令

 

  • 成功開出攝影機的畫面
成功開出攝影機辨識畫面

 

  • 成功執行畫面
成功執行畫面

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

  • 改寫Python類別程式

請開啟TM2_UART_tflite.py和labels.txt對照

TM2_UART_tflite.py和labels.txt對照圖

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

    if (labels[label_id]=='0 Toy') :
      ser.write(b'command_1\n')  # 訊息必須是位元組類型
      # time.sleep(0.5)           # 暫停0.5秒,再執行底下接收回應訊息的迴圈

    elif (labels[label_id]=='1 Pringles') :
      ser.write(b'command_2\n')  # 訊息必須是位元組類型
      # time.sleep(0.5)           # 暫停0.5秒,再執行底下接收回應訊息的迴圈

    elif (labels[label_id]=='2 Yogurt') :
      ser.write(b'command_3\n')  # 訊息必須是位元組類型
      # time.sleep(0.5)           # 暫停0.5秒,再執行底下接收回應訊息的迴圈
    
    elif (labels[label_id]=='3 Other')  :
      ser.write(b'command_4\n')  # 訊息必須是位元組類型
      # time.sleep(0.5)           # 暫停0.5秒,再執行底下接收回應訊息的迴圈
TM2_UART_tflite.py

行數

程式片段說明

1~2

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

 

Arduino程式片段說明:

#define LED_RED_pin 7
#define LED_BLUE_pin 8
#define LED_GREEN_pin 9
#define Servo_pin 10

int TOY= 0;
int Pringles = 50; 
int Yogurt = 100;
int otherangle = 170;

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

String str;

void setup(void)  
{
  Serial.begin(9600);

  // init pin states
  pinMode(LED_RED_pin, OUTPUT);
  digitalWrite(LED_RED_pin,LOW);
  pinMode(LED_BLUE_pin, OUTPUT);
  digitalWrite(LED_BLUE_pin,LOW);
  pinMode(LED_GREEN_pin, OUTPUT);
  digitalWrite(LED_GREEN_pin,LOW);
  
  myservo.attach(Servo_pin);  // attaches the servo on Servo_pin to the servo object
}

void loop(void)  
{
  //int i;
  digitalWrite(LED_RED_pin,LOW);
  digitalWrite(LED_BLUE_pin,LOW);
  digitalWrite(LED_GREEN_pin,LOW);
  
  if (Serial.available()) {
    // 讀取傳入的字串直到"\n"結尾
    str = Serial.readStringUntil('\n');

    if (str == "command_1") {     // 若字串值是 "command_1" ,TOY亮RED燈
      digitalWrite(LED_RED_pin,1);
      digitalWrite(LED_BLUE_pin,0);
      digitalWrite(LED_GREEN_pin,0);
      myservo.write(TOY);          //伺服馬達轉到0度
      Serial.println("command_1"); 
    } 
else if (str == "command_2") {  // 若字串值是 "command_2",Pringles亮YELLOW燈
      digitalWrite(LED_RED_pin,0);
      digitalWrite(LED_BLUE_pin,1);
      digitalWrite(LED_GREEN_pin,0);
 
      myservo.write(Pringles);         //伺服馬達轉到100度
      Serial.println("command_2");
    } 
    else if (str == "command_3" ) { // 若字串值是 "command_3" ,Yogurt亮GREEN燈
      digitalWrite(LED_RED_pin,0);
      digitalWrite(LED_BLUE_pin,0);
      digitalWrite(LED_GREEN_pin,1);
      myservo.write(Yogurt);          //伺服馬達轉到150度
      Serial.println("command_3");
    }
    else if (str == "command_4" ) { // 若字串值是 "command_4",Other不亮燈
      digitalWrite(LED_RED_pin,0);
      digitalWrite(LED_BLUE_pin,0);
      digitalWrite(LED_GREEN_pin,0);
      myservo.write(otherangle);          //伺服馬達轉到170度
      Serial.println("command_4");
    }
  }
}
SERVO_LED_SERIAL.ino
行數程式片段說明
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行程式,也是同樣意思。

 

[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

3 thoughts on “【教學】LinkIt 7697 也能玩AI圖像辨識

  1. 林雨滴 says:

    我是否能使用arduino 的攝影模組來做偵測的動作?
    有推薦的攝影模組嗎?
    可以提供關於該攝影模組的程式碼與如何連結嗎?

    • 鈺莨 says:

      你好,林雨滴:
      1.文章中利用電腦辨識到圖片後,將辨識結果透過USB線,傳指令送到LinkIt7697,所以攝影鏡頭是要接在電腦使用的,並無法使用Arduino 的攝影模組。
      2.本篇也可以將LinkIt7697換成Arduino。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *