理想三旬 · 2022年11月27日 · 广东

【聆思CSK6 视觉AI开发套件试用】+LVGL+头肩检测体验

1.引言

之前一直想玩AI,一直没找到机会,正好在极术社区看见这次AI活动,非常Nice,也非常感谢社区给这次机会。这里先放结果:
1669483195519.jpg.jpg

2.芯片简介

CSK6 是聆思科技新一代的 AI 芯片 SoC 产品系列,采用多核异构架构,集成了 ARM Star MCU,HiFi4 DSP,以及聆思全新设计的 AI 神经网络处理内核 NPU,算力达到 128 GOPS。

  • 1MB SRAM
  • 最高 8MB PSRAM
  • 内置最高支持8MB Flash,可选外置
  • 多达33个可灵活配置的GPIO
  • USB、UART、SDIO、I2C、I2S、SPI、PWM等外设接口
  • 2个定时器,8个独立通道
  • 支持4路LEDC与8路PWM输出
  • 内置6路触控按钮检测
  • SWD、JTAG调试接口

    3.开发准备

    环境搭建挺简单的,离线安装包+Git。
    https://docs.listenai.com/chi...
    搭建.jpg
    接下来参考AI这个小节,拉取SDK,用VSCODE打开代码,编译,下载
    VS.jpg
    接下来根据官方有个浏览器插件,用于查看摄像头的输出以及检测结果,但是在我这里就没能成功的显示。于是就想着为何不用屏幕显示出来呢?
    根据官方例子中有屏幕显示,支持ST7789,ili9488,ST7735,于是我就买了几块。
    屏幕.jpg
    尝试用官方的例子点亮屏幕,失败了,不知为何使用lisa zep create 创建的程序编译会报错,可能是刚接触这个系统,出了问题还不知道怎么解决,其中把报错最多的就是这个。
    错.jpg
    后面修修改改终于点亮了,同时也多谢技术支持,非常热心,帮助解决了不少问题。
    接下来找到头肩识别分支,使用git branch -a ,也可以用浏览器
    https://cloud.listenai.com/ze...
    lvgl.jpg

4.代码

在头肩识别的基础上需要添加LVGL的部分代码,分别是以下几个文件
修改.jpg
需要打开LVGL模拟器
模拟.jpg
主函数中直接删掉使用USB的部分,不实用,使用屏幕更方便


#include <stdio.h>
#include <stdlib.h>

#include <zephyr/device.h>
#include <zephyr/drivers/video.h>
#include <zephyr/kernel.h>
#include <zephyr/zephyr.h>

#include <csk_malloc.h>
#include <licak/licak.h>

#include <lvgl.h>


#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <logging/log.h>
LOG_MODULE_REGISTER(main);

#define VIDEO_DEV DT_LABEL(DT_NODELABEL(dvp))

// 240p
// #define IMAGE_HEIGHT 240
// #define IMAGE_WIDTH 320
// 480p
#define IMAGE_HEIGHT 480
#define IMAGE_WIDTH  640
#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT * 3)

const struct device *video;

extern int lv_render_init(void);
extern void lvgl_invalidate_canvas(void);
extern void lvgl_handle_hs_data(hsd_head_shoulder_detect *result);
extern void lvgl_handle_gesture_data(head_shoulder_detect *result);



int64_t time;

#define PRINT_HEAP_INFO()                                                                          \
    {                                                                                          \
        extern struct k_heap _system_heap;                                                 \
        sys_heap_print_info(&_system_heap.heap, 0);                                        \
    }

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;
        // LOG_INF("head shoulder cnt: %d", result->track_count);

        lvgl_handle_hs_data(result);


    } else if (event == HSD_EVENT_GESTURE_RECOGNIZE) {
        head_shoulder_detect *result = (head_shoulder_detect *)data;
        // LOG_INF("gesture result id: %d ,state: %d", result->id, result->gesture_state);

        lvgl_handle_gesture_data(result);

    }
}

void main(void)
{
    if (0 != licak_init()) {
        LOG_ERR("LICAK init failed,exit.\n");
        return;
    }

    video = device_get_binding(VIDEO_DEV);

    if (video == NULL) {
        LOG_ERR("Video device %s not found, "
            "fallback to software generator.",
            VIDEO_DEV);

        return;
    }

    struct video_format fmt;
    fmt.pixelformat = VIDEO_PIX_FMT_VYUY;
    fmt.width = IMAGE_WIDTH;
    fmt.height = IMAGE_HEIGHT;
    fmt.pitch = fmt.width * 2;
    if (video_set_format(video, VIDEO_EP_OUT, &fmt)) {
        LOG_ERR("Unable to set video format");
        return;
    }

    if (0 != lv_render_init()) {
        LOG_ERR("LVGL Init failed.");
        return;
    }
    hsd_t *hsd = hsd_create(HSD_FLAG_HEAD_SHOULDER | HSD_FLAG_GESTURE_RECOGNIZE);

    if (hsd == NULL) {
        LOG_ERR("Create HSD instance failed.");
        return;
    }

    hsd_event_register(hsd, HSD_EVENT_HEAD_SHOULDER, on_receive_hsd_result, NULL);
    hsd_event_register(hsd, HSD_EVENT_GESTURE_RECOGNIZE, on_receive_hsd_result, NULL);

    printk("- Device name: %s\n", VIDEO_DEV);

    hsd_start(hsd, video);

    while (1)
     {
        k_msleep(10);
        lv_task_handler();
        lvgl_invalidate_canvas();
    }

    hsd_stop(hsd);

    LOG_DBG("AP EXEC END\n");
}

5.总结

系统不错,但是需要花时间去学一下,官方的FAQ可以更新一下,使用到现在不可能就那几个问题吧,让接下来的人少花一下时间,同时也能减少你们的工作量,同时期待语音识别的DEMO。

推荐阅读
关注数
5165
内容数
98
聆思科技官方专栏,专注AIOT芯片,持续分享有趣的解决方案。商务合作微信:listenai-csk 技术交流QQ群:825206462
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息