[Prueba del kit de desarrollo de IA visual CSK6 de Lensing] Primera experiencia de detección de cabeza y hombro e interacción multimodal

Este artículo proviene de la actividad del kit de desarrollo de IA visual CSK6 organizada por Jishu Community y Lesi Technology. Para obtener más actividades de prueba de la placa de desarrollo, preste atención al sitio web de Jishu Community. Autor: Alex_bG9Qau

fondo

Hace algún tiempo, olvidé en qué canal estaba y vi una actividad de prueba del kit de desarrollo de IA visual para el chip de lentes de la serie CSK6. Solo quería hacer una investigación sobre la solución de IA visual recientemente, así que apliqué directamente . Tuve suerte y recibí el primer lote de solicitudes, pero recientemente he estado ocupado y no he tenido tiempo de comenzar. Si no te das prisa, te devolverán la tabla, así que me tomé un tiempo para probarla durante el fin de semana. Gracias a la comunidad de Jishu por organizar un evento tan bueno, para que todos puedan experimentar las capacidades visuales de IA a bajo costo.

Crear el entorno de desarrollo

Utilicé una nueva computadora portátil con sistema win10, consulte Environment Build | Listening Documentation Center , el primer paso es descargar Git en Windows y el proceso específico no se repetirá. El segundo paso es descargar el paquete de instalación con un solo clic de CSK6 e instalarlo.
Una vez que el entorno de desarrollo se haya configurado correctamente, ejecute lisa info zepel comando y podrá ver información similar a la siguiente, lo que significa que todo fue correcto:

Operating System - Windows 10 Enterprise LTSC 2019, version 10.0.17763 x64

@listenai/lisa - 2.4.5

Account - 未登录或登录已过期

Node.js environment
Node.js - v16.14.0
npm - 8.3.1
yarn - 1.22.19

Global environment
git - git version 2.38.0.windows.1

Plugin info
zep - 1.6.5 (latest: 1.6.8)

Plugin environment
env - csk6
west - West version: v0.14.0
venv - Python 3.9.7
cmake - cmake version 3.21.4
dtc - Version: DTC 1.6.0-dirty
gperf - GNU gperf 3.1
mklfs - v1.0.0 (3640bfb)
ninja - 1.10.2
protoc - libprotoc 3.19.1
xz - xz (XZ Utils) 5.2.5
cskburn - v1.18.1 (265)
zephyr-sdk-0.14.2 - arm-zephyr-eabi-gcc (Zephyr SDK 0.14.2) 10.3.0
gcc-arm-none-eabi-10.3 - arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release)
jlink-venus - V7.58
ZEPHYR_BASE - D:\ListenAI\csk-sdk\zephyr (版本: v1.1.1-alpha.2, commit: 3e15ca75bd)
PLUGIN_HOME - D:\ListenAI\lisa-zephyr
VIRTUAL_ENV - D:\ListenAI\lisa-zephyr\venv
ZEPHYR_TOOLCHAIN_VARIANT - zephyr
ZEPHYR_SDK_INSTALL_DIR - D:\ListenAI\lisa-zephyr\packages\node_modules\@binary\zephyr-sdk-0.14.2\binary
GNUARMEMB_TOOLCHAIN_PATH - D:\ListenAI\lisa-zephyr\packages\node_modules\@binary\gcc-arm-none-eabi-10.3\binary

ejecución de prueba de demostración

Para esta experiencia, elegí el reconocimiento de cabeza, hombros y gestos .

descargar muestra

Primero, use el comando git para descargar la muestra en un directorio sin espacios y en chino:

git clone https://cloud.listenai.com/zephyr/applications/app_algo_hsd_sample_for_csk6.git

modificar el código

Modifique on_receive_hsd_result(...)el código de la función de devolución de llamada para ver el resultado del reconocimiento de manera más intuitiva:

const char *gesture_human_string(int gesture_state)
{
    
    
    switch (gesture_state) {
    
    
    case GESTURE_OTHER:
        return "OTHRE";
        break;
    case GESTURE_LIKE:
        return "LIKE";
        break;
    case GESTURE_OK:
        return "OK";
        break;
    case GESTURE_STOP:
        return "STOP";
        break;
    case GESTURE_YES:
        return "YES";
        break;
    case GESTURE_SIX:
        return "SIX";
        break;
    default:
        return "OTHER";
        break;
    }
}

void on_receive_hsd_result(hsd_t *hsd, hsd_event event, void *data, void *user_data)
{
    
    
    if (event == HSD_EVENT_HEAD_SHOULDER) {
    
    
        hsd_head_shoulder_detect *result = (hsd_head_shoulder_detect *)data;
        if (result->track_count > 0)
            printk("detectedhead shoulder cnt: %d\n", result->track_count);
#ifdef CONFIG_WEBUSB
        webusb_handle_hs_data(result);
#endif
    } else if (event == HSD_EVENT_GESTURE_RECOGNIZE) {
    
    
        head_shoulder_detect *result = (head_shoulder_detect *)data;
        if (result->gesture_state != GESTURE_OTHER) {
    
    
            printk("gesture result: %s\n", gesture_human_string(result->gesture_state));
        }
#ifdef CONFIG_WEBUSB
        webusb_handle_gesture_data(result);
#endif
    }
}

2 cambios principales:

  • Filtre las impresiones de identificación no válidas para evitar impresiones de puerto serie demasiado frecuentes
  • La gesture_human_stringfunción agregada se usa para reemplazar los números en los resultados del reconocimiento con inglés, para ver mejor los resultados del reconocimiento.

compilar firmware

Mientras no haya ningún error en la modificación del código, lisa zep build -b csk6011a_nanoel firmware final se puede compilar usando el comando.

[206/214] Linking C executable zephyr\zephyr_pre0.elf

[209/214] Linking C executable zephyr\zephyr_pre1.elf

[214/214] Linking C executable zephyr\zephyr.elf
Memory region         Used Size  Region Size  %age Used
FLASH:      214228 B        16 MB      1.28%
SRAM:      147856 B       320 KB     45.12%
ITCM:        5532 B        16 KB     33.76%
DTCM:          0 GB        16 KB      0.00%
PSRAMAP:     3108136 B      3968 KB     76.49%
IDT_LIST:          0 GB         2 KB      0.00%
    
√ 构建成功

Como se muestra arriba, si no se ven errores de compilación, y al final se ven las palabras √ compilar correctamente , significa que se aprobó la compilación.

conexión de hardware

Al leer CSK6011-NanoKit V1 | Listening Documentation Center , podemos saber que la placa de desarrollo está equipada con un chip depurador DAPLink, y los desarrolladores pueden realizar programación de firmware , simulación de código y visualización del puerto serie del chip CSK6 a través de la interfaz USB DAPLink . Por lo tanto, usamos el cable tipo c que viene con el kit, conectamos el puerto tipo c al DAPLINK USB de la placa y conectamos el puerto tipo A a la computadora para realizar la grabación de firmware y la visualización del puerto serie.

Grabar firmware

Utilice lisa zep flashel comando para grabar primero el firmware recién compilado. Después de ejecutar el comando, puede ver el progreso de la grabación y, finalmente, ver la palabra final √ , lo que significa que la grabación se realizó correctamente. Sin embargo, tengo el siguiente error durante el proceso de grabación, pero el éxito general es exitoso, por lo que ya no tengo que preocuparme por eso.

PS D:\ListenAI\project\app_algo_hsd_sample_for_csk6> lisa zep flash

The module for runner "csk" could not be imported (No module named 'termios'). This most likely means it is not handling its dependencies properly. Please report this to the zephyr developers.
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner pyocd
-- runners.pyocd: Flashing file: D:\ListenAI\project\app_algo_hsd_sample_for_csk6\build\zephyr\zephyr.hex
Exception ignored in: <function Library.__del__ at 0x00000208C958DCA0>
Traceback (most recent call last):
  File "D:\ListenAI\lisa-zephyr\venv\lib\site-packages\pylink\library.py", line 299, in __del__
    self.unload()
  File "D:\ListenAI\lisa-zephyr\venv\lib\site-packages\pylink\library.py", line 458, in unload
    os.remove(self._temp.name)
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'C:\\Users\\gyl\\AppData\\Local\\Temp\\tmpqlfp78ig.dll'
Exception ignored in: <function Library.__del__ at 0x00000208C958DCA0>
Traceback (most recent call last):
  File "D:\ListenAI\lisa-zephyr\venv\lib\site-packages\pylink\library.py", line 299, in __del__
    self.unload()
  File "D:\ListenAI\lisa-zephyr\venv\lib\site-packages\pylink\library.py", line 458, in unload
    os.remove(self._temp.name)
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'C:\\Users\\gyl\\AppData\\Local\\Temp\\tmpuxg6k6nq.dll'
0001561 I Loading D:\ListenAI\project\app_algo_hsd_sample_for_csk6\build\zephyr\zephyr.hex at 0x18000000 [load_cmd]
[==================================================] 100%
0012743 I Erased 0 bytes (0 sectors), programmed 0 bytes (0 pages), skipped 214272 bytes (837 pages) at 18.96 kB/s [loader]

√ 结束

quemar modelo

Use los siguientes comandos para grabar 2 modelos (entre ellos, COM3 debe modificarse de acuerdo con su propio puerto serie):

lisa zep exec cskburn -s \\.\COM3 -C 6 0x400000 .\resource\cp.bin -b 748800
lisa zep exec cskburn -s \\.\COM3 -C 6 0x500000 .\resource\res.bin -b 748800

Experiencia de efecto

Después de grabar el firmware y los modelos anteriores, presione el botón RSET junto al USB para encenderlo. La impresión después del encendido es la siguiente:

*** Booting Zephyr OS build e32aeccd52a1  ***
[00:00:00.009,000] [1;31m<err> main: device:UART_1 is ready![0m
- Device name: DVPI
GET_PARAMS: 5001 0.400000[00:00:03.164,000] [0m<inf> hsd: Setup resource [head_thinker] which in <0x18500060,0xa6ce0>[0m
[00:00:03.164,000] [0m<inf> hsd: Setup resource [gesture_thinker] which in <0x185a6d40,0x135d40>[0m
[00:00:03.336,000] [0m<inf> hsd: fmt: [VYUY] width [640] height [480][0m
[00:00:03.336,000] [0m<inf> hsd: Alloc video buffer: 921600[0m
[00:00:03.336,000] [0m<inf> hsd: Alloc video buffer: 921600[0m
[00:00:03.336,000] [0m<inf> hsd: Alloc video buffer: 921600[0m

Cuando hay un resultado de reconocimiento, la impresión es la siguiente:

detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
gesture result: LIKE
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
gesture result: SIX
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP
detectedhead shoulder cnt: 1
gesture result: STOP

Mi código modificado solo activará la impresión en la función de devolución de llamada cuando se identifiquen la cabeza, los hombros y los gestos. Como se puede ver en el registro anterior, solo hay una cabeza en la cámara y probé tres gestos: LIKE, SIX y STOP.
Si necesita ver la imagen de la cámara en tiempo real a través del método de vista previa, necesita encontrar otro tipo c, conectar los dos puertos tipo c a la computadora y luego consultar la guía de herramientas de visualización de PC para operar . Tenga en cuenta que antes de usar esta función, debe habilitar WEBUSB ( CONFIG_WEBUSB=ncámbielo en prj.conf CONFIG_WEBUSB=y) y vuelva a compilar el firmware para grabar.

interacción multimodal

En este punto, una experiencia completa ha terminado, pero siempre siento que falta algo.Después de leer las publicaciones de experiencia de otras personas, la mayoría de ellas se combinan con una determinada escena para una integración funcional más profunda. Da la casualidad de que tengo una placa de desarrollo con capacidades de voz en la mano, que puede controlar la activación de voz, la interacción de voz y la reproducción de música Gesto para detener la reproducción de música, gesto LIKE para recopilar música, gesto OK para cambiar al siguiente canción Durante el proceso de depuración, en la muestra de reconocimiento de gestos y cabeza, consulte la muestra de UART , configure UART1 rx, tx como PA9, grupo PA10 de GPIO, use la placa de puerto serie para conectarse a mi placa de desarrollo de interacción de voz, no hay Los datos que salen del puerto serie están conectados a la herramienta del puerto serie en el lado de la PC y no se pueden recibir los datos. Debido al poco tiempo, utilicé temporalmente el puerto serie de impresión para hacer una demostración, que es bastante interesante. Puede agregar un nuevo modo interactivo para algunos dispositivos inteligentes, mejorar la jugabilidad y mejorar la permanencia del usuario. . . El código central también es relativamente simple, que es una comunicación de puerto serie de comandos de control, reducción de énfasis y filtrado de gestos:

void business_uart_action(int gesture_state)
{
    
    
    static int last_gesture_state = GESTURE_OTHER;
    if (last_gesture_state != gesture_state) {
    
    
        last_gesture_state = gesture_state;

        //为数据保密真正的串口指令数据,没有贴出来
        switch (gesture_state) {
    
    
        case GESTURE_LIKE:
            send_control_data(business_uart_dev, favorite_music, sizeof(favorite_music), SYS_FOREVER_US);
            break;
        case GESTURE_OK:
            send_control_data(business_uart_dev, next_music, sizeof(next_music), SYS_FOREVER_US);
            break;
        case GESTURE_STOP:
            send_control_data(business_uart_dev, stop_music, sizeof(stop_music), SYS_FOREVER_US);
            break;
        case GESTURE_YES:
        case GESTURE_OTHER:
        case GESTURE_SIX:
        default:
            break;
        }
    }
}

void on_receive_hsd_result(hsd_t *hsd, hsd_event event, void *data, void *user_data)
{
    
    
    if (event == HSD_EVENT_HEAD_SHOULDER) {
    
    
        hsd_head_shoulder_detect *result = (hsd_head_shoulder_detect *)data;
        if (result->track_count > 0)
            printk("detectedhead shoulder cnt: %d\n", result->track_count);
#ifdef CONFIG_WEBUSB
        webusb_handle_hs_data(result);
#endif
    } else if (event == HSD_EVENT_GESTURE_RECOGNIZE) {
    
    
        head_shoulder_detect *result = (head_shoulder_detect *)data;
        if (result->gesture_state != GESTURE_OTHER) {
    
    
            printk("gesture result: %s\n", gesture_human_string(result->gesture_state));
            business_uart_action(result->gesture_state);
        }
#ifdef CONFIG_WEBUSB
        webusb_handle_gesture_data(result);
#endif
    }
}

Con respecto al tema de la incapacidad de UART1 para lanzar datos, no he seguido estudiándolo por el momento. Dejaré un elemento TODO primero, enviaré el artículo de experiencia y encontraré el problema más tarde.

Resumir

Después de un conjunto de experiencias, descubrí que la velocidad de reconocimiento sigue siendo muy rápida y sensible. Al mismo tiempo, también se encuentra que el reconocimiento erróneo de los gestos STOP y LIKE es relativamente grave, y el nivel general está de hecho en el nivel de demostración, y todavía hay una cierta brecha con respecto a la comercialización. También espero con interés el lanzamiento de las siguientes aplicaciones de reconocimiento de voz,

Supongo que te gusta

Origin blog.csdn.net/weixin_47569031/article/details/129138661
Recomendado
Clasificación