天天看點

HuskyLens人工智能攝像頭

目錄

1、子產品特性

2、子產品功能

3、子產品調測

3.1、單對象識别

3.2、多對象識别

4、子產品應用

HuskyLens是一款簡單易用的人工智能攝像頭(視覺傳感器),内置6種功能:人臉識别、物體追蹤、物體識别、巡線追蹤、顔色識别、标簽(二維碼)識别。僅需一個學習按鍵即可完成AI訓練,擺脫繁瑣的訓練和複雜的視覺算法,讓你更加專注于項目的構思和實作。

HuskyLens人工智能攝像頭
HuskyLens闆載UART/I2C接口,可以連接配接到Arduino、Raspberry Pi、LattePanda、micro:bit、STM32等主流控制器,實作硬體無縫對接,直接輸出識别結果給控制器,無需折騰複雜的算法,就能制作非常有創意的項目,該智能硬體模組于2020年2月正式出售(預售價329RMB),通過一段官方示範視訊進一步了解該模組。
HuskyLens人工智能攝像頭
Huskylens内置了許多類型的圖像處理算法,可支援拍照、運算、識别和處理為一體,最終将識别結果通過UART/I2C輸出到控制器,其接口說明如下所示:
HuskyLens人工智能攝像頭

USB 接口:接上電源自動開機,斷掉電源自動關機,配上上位機,可以更新固件;

傳感器接口:支援 UART 或 I2C 協定,通過該接口,可連接配接常用的主要闆,如 Arduino、樹莓派、micro:bit;該接口也支援供電;

功能按鍵:左右撥動,切換選擇内置的功能;向下短按,調出或隐藏菜單;向下長按,進入目前功能的參數設定;

學習按鍵:按下“學習按鍵”,學習指定物體。支援長按操作,長按期間,将持續學習;

螢幕:2.0 寸 IPS 顯示器,實時看到各種狀态下的結果,友善調試,所見即所得。

Huskylens主要有六大功能,簡介如下所示:

HuskyLens人工智能攝像頭

物體追蹤:追蹤指定的物體,可以是任何有明顯輪廓的物體,甚至是各種手勢;

人臉識别:偵測臉部輪廓,可同時識别多人;

物體識别:識别這是什麼物體(僅限于内置的 20 種物體);

巡線追蹤:識别指定的線條,并做路徑規劃;

顔色識别:識别指定的顔色及其位置(由于光線的變化,對于相近的顔色,攝像頭有時會誤識别);

标簽識别:偵測二維碼标簽,識别出指定标簽(目前攝像頭不能識别複雜二維碼,如微信上用的二維碼)。

由于Huskylens将識别的結果通過UART/I2C傳輸到控制器,是以我們隻需要在Huskylens上訓練好識别對象,解析接口協定即可,這裡我使用的是UART通信協定(57600 (bps)  8N1),該子產品的協定格式如下所示:

HuskyLens人工智能攝像頭

資料頭1 資料頭2 位址 資料長度 指令 資料 累加和校驗

0x55 0xAA 1 Byte 1Byte 1Byte

Data 1~Data n

(10Byte)

1Byte

協定解析如下:

資料頭1和資料頭2以0x55和0xAA固定格式開頭,因為0x55二進制是0101 0101,0xAA二進制是1010 1010,在通訊編碼原理中,應該盡可能避免過多的重複0或1,因為當你的傳輸變成一個長0/1時,一個脈沖幹擾就會将你的資料截斷,整加誤碼的機會。 若你的通訊機不能正确接受10101010或01010101,那麼你的線路等肯定出現問題。 這個隻是一個快速判斷線路狀态的一個手段,在做内現存測試的時候也經常使用這兩個資料字段,也是同樣的道理;

位址占用一個位元組,本子產品預設位址是0x11;

資料長度占用一個位元組,指資料的長度,注意不是整個資料幀的長度;

指令ID占用一個位元組;

資料長度為10位,資料資訊為檢測到對象的像素尺寸和對象屬性,順序為:檢測對象X點中心低位位元組、檢測對象X點中心高位位元組、檢測對象Y點中心低位位元組、檢測對象Y點中心高位位元組、檢測對象寬度低位位元組、檢測對象寬度高位位元組、檢測對象高度低位位元組、檢測對象高度高位位元組,剩餘兩個位元組為檢測到的對象;

8位累加和校驗,不進位,例如:0x55+0xAA+0x11+0x0A+0x10+0x2C+0x01+0xC8+0x00+0x0A+0x00+0x14+0x00+0x01

+0x00=0x23E,則校驗位為0x3E。

Huskylens無需請求指令,自動發送毫秒級的裝置狀态資料幀,打開序列槽調測助手即可直接分析,下面以人臉識别功能為例,分析協定幀結構。

這裡選取了周傑倫的圖像作為識别對象, Huskylens人臉識别訓練操作流程如下所示:

HuskyLens人工智能攝像頭
在尚未檢測到目标對象的情況下,打開序列槽調測助手,模組發送大量資料(均相同),選擇其中一條分析。
HuskyLens人工智能攝像頭
HuskyLens人工智能攝像頭

0x55 0xAA 0x11

0x0A

(10 Byte)

0x10

0x00 0x00 0x00 0x00 0x01 0x00 0x01 0x00

(8 Byte對象尺寸大小資料)

0x00 0x00

(2 Byte目标對象辨別,此時代表無對象)

55+ AA+11+0A+10+00+00+00+00+01+ 00+01+00+00+00=0x12C

(取低位為0x2C)

訓練周傑倫的人臉作為識别對象,如下所示:

HuskyLens人工智能攝像頭
此時子產品發送的協定幀,可以識别出0001号ID,也就是周傑倫的人臉圖像尺寸,如下所示:
HuskyLens人工智能攝像頭

0x9C 0x00 0x88 0x00 0x53 0x00 0x70 0x00

0x00 0x01

(建立的第一個人臉ID)

55+ AA+11+0A+10+9C+00+88+00+53+ 00+70+00+00+01=0x312

(取低位為0x12)

可以打開子產品的多人臉訓練模式,訓練阿信為第二個識别對象,如下所示:

HuskyLens人工智能攝像頭
多人模式子產品發送的協定幀中識别對象ID和單人模式有所差別,此時識别周傑倫(建立的第一個對象)。
HuskyLens人工智能攝像頭
子產品發送協定如下所示:
HuskyLens人工智能攝像頭

其中0xFFFE代表多人識别中第二個對象(阿信)未識别到。

再識别阿信(建立的第二個對象),如下所示:

HuskyLens人工智能攝像頭
HuskyLens人工智能攝像頭

其中0xFFFF代表多人識别中第一個對象(周傑倫)未識别到。

HuskyLens人工智能攝像頭的應用就簡要講解人臉識别的功能,其他功能都是大同小異,小夥伴們了解協定幀就可以輕松應對。

由于目前手頭上隻有STM32系列開發闆,遂基于STM32+HuskyLens實作人臉識别開關燈小案例,實作代碼如下所示,主要是拆解、校驗協定(示範視訊)。

uint8_t UART2_ReceivedChar=0,check = 0;
uint8_t USART2_RxData[16]; 
uint32_t USART2_RX_DATA_BUF_CNT=0; 
int8_t USART2_RX_Flag=0;
uint16_t data_id=0;
void USART2_IRQHandler(void)
{
  //UART2接收資料
  if(LL_USART_IsActiveFlag_RXNE(USART2))
  {
    UART2_ReceivedChar = 0;
   
    //讀取接收寄存器,讀資料會清中斷
    UART2_ReceivedChar = LL_USART_ReceiveData8(USART2);
   
    //判斷若以0x55開頭,接收16個字元
    if(UART2_ReceivedChar==0x55)
    {
      USART2_RX_Flag=1;
    }
   
    if(USART2_RX_Flag==1&&USART2_RX_DATA_BUF_CNT<16)
    {
      USART2_RxData[USART2_RX_DATA_BUF_CNT++] = UART2_ReceivedChar;
    }
    //接收16個字元後進行處理
    else
    {
      //因為子產品發送速度過快,需要校驗
      if(USART2_RxData[0]==0x55&&USART2_RxData[1]==0xAA&&USART2_RxData[2]==0x11)
      {
        //進行累加和校驗,對比發送和接收的是否一緻
        for(int8_t i=0;i<15;i++)
        {
          LL_mDelay(10);
          check+=USART2_RxData[i];
        }
         LL_mDelay(200);
        //若接收正确,處理
        if(check==USART2_RxData[15])
        {
            //裝載低位、高位識别對象ID
            data_id=USART2_RxData[14];
            data_id<<=8;
            data_id|=USART2_RxData[13];
           
            //未檢測到周傑倫
            if(data_id==0xFFFF)
            {  
              //LED燈滅
              LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_9);
            }
            //未檢測到阿信
            else if(data_id==0xFFFE)
            {
              //LED燈亮
              LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_9);
            }
        }
      }
     
      //清除标志
      USART2_RX_Flag=0;
      USART2_RX_DATA_BUF_CNT=0;
      check=0;
    }
   
    //清除溢出标志
    LL_USART_ClearFlag_ORE(USART2);
  }
}      

通過設定斷點可以看到每一次的上次資料和發送到序列槽調試助手的一緻。

HuskyLens人工智能攝像頭

繼續閱讀