3228|11

221

帖子

2

TA的资源

纯净的硅(初级)

楼主
 

【基于AI摄像头的场景重现项目】项目提交 [复制链接]

 
  本帖最后由 walker2048 于 2022-10-29 22:12 编辑

 

基于AI摄像头的场景重现项目

作者:李隆

一、作品简介

名称:基于AI摄像头的场景重现项目

照片

 

项目背景和实现:目前AI摄像头可以识别的内容非常多,例如人脸识别,分类识别,姿态检测等等内容。在了解到得捷创新大赛的时候,就有了用AI摄像头实现通过人体姿态识别,在esp32开发板上播放奥特曼照片和攻击特效的想法。但是作为AI新手来说, 人体姿态识别想要在esp32芯片上实现,困难比较大。所以最后调整成通过M2dock套件实现奥特曼分类识别,并将识别信息发送到esp32主控板上,显示图片并播放攻击特效的功能。

 

主要功能

  1. 通过AI摄像头识别奥特曼类型(M2dock套件的屏幕可预览识别结果)
  2. 在esp32开发套件的显示屏上显示奥特曼的图片
  3. 在esp32开发套件播放奥特曼攻击特效(开发中)

 

二、系统框图

硬件说明

 

用到的开发套件

  1. 控制板:ESP32-S2-Kaluga-1 套件
  2. AI识别套件:sipeed的m2dock套件

 

硬件框图

各扩展板通过排针和主控板相连,通过串口与m2dock套件相连:

 

ESP32-S2-Kaluga-1 套件的功能框图如下:

M2dock的引脚图

软件说明

软件分为以下功能:

  1. AI识别模型
  2. AI识别Python脚本
  3. LCD显示模块
  4. 音乐播放模块
  5. 串口命令识别模块

 

 

 

 

三、作品源码

 

Maixhub的AI识别方案为轻代码模式,而AI分类识别部分比较麻烦的地方是模型训练,此处展示的是增加了串口输出的AI识别代码。

# generated by maixhub, tested on maixpy3 v0.4.8

from maix import nn, camera, display, image

import serial
# 初始化串口
ser = serial.Serial("/dev/ttyS1", 115200)

model = "model-17814.awnn.mud"
labels = ['yinhe', 'Victory']

def main():

    camera.config(size=(224, 224))
    print("-- load model:", model)
    m = nn.load(model)
    print("-- load ok")

    while True:
        img = camera.capture()
        out = m.forward(img)
        out = nn.F.softmax(out)
        msg = "{:.2f}: {}".format(out.max(), labels[out.argmax()])
        display.show(img.draw_string(2, 2, msg, scale = 1.2, color = (255, 0, 0), thickness = 2))

        # 若识别率高于0.9,则向串口输出识别到的分类
        if(out.max() >= 0.9)
            ser.write(labels[out.argmax()])

if __name__ == "__main__":
    try:
        main()

    except Exception as e:
        import traceback, time
        msg = traceback.format_exc()
        print(msg)
        img = image.new(size = (240, 240), color = (255, 0, 0), mode = "RGB")
        img.draw_string(0, 0, msg, scale = 0.8, color = (255, 255, 255), thickness = 1)
        display.show(img)
        time.sleep(20)

ESP32主控部分代码:

/* Camera Example



    This example code is in the Public Domain (or CC0 licensed, at your option.)

    Unless required by applicable law or agreed to in writing, this

    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR

    CONDITIONS OF ANY KIND, either express or implied.

*/

#include <stdio.h>

#include <stdint.h>

#include <stddef.h>

#include <string.h>

#include "esp_wifi.h"

#include "esp_system.h"

#include "nvs_flash.h"

#include "esp_event.h"

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "esp_heap_caps.h"

#include "esp_log.h"

#include "esp_spiffs.h"

#include "lcd.h"

#include "esp_camera.h"

#include "board.h"

#include "usart_pars.h"

#include "audio_play.h"





static const char *TAG = "main";

#define IMAGE_MAX_SIZE (100 * 1024)/**< The maximum size of a single picture in the boot animation */

#define IMAGE_WIDTH    320 /*!< width of jpeg file */

#define IMAGE_HIGHT    240 /*!< height of jpeg file */



/**

 * [url=home.php?mod=space&uid=159083]@brief[/url]  rgb -> rgb565

 *

 * @param  r red   (0~31)

 * @param  g green (0~63)

 * @param  b red   (0~31)

 *

 * [url=home.php?mod=space&uid=784970]@return[/url]  data about color565

 */

uint16_t color565(uint8_t r, uint8_t g, uint8_t b)

{

    uint16_t color = ((r  << 11) | (g  << 6) | b);

    return (color << 8) | (color >> 8);

}



void esp_photo_display(const char *name)

{

    ESP_LOGI(TAG, "LCD photo test....");

    esp_vfs_spiffs_conf_t conf = {

        .base_path = "/spiffs",

        .partition_label = NULL,

        .max_files = 5,

        .format_if_mount_failed = false

    };



    /*!< Use settings defined above to initialize and mount SPIFFS filesystem. */

    /*!< Note: esp_vfs_spiffs_register is an all-in-one convenience function. */

    ESP_ERROR_CHECK(esp_vfs_spiffs_register(&conf));

    size_t total = 0, used = 0;

    ESP_ERROR_CHECK(esp_spiffs_info(NULL, &total, &used));



    uint8_t *rgb565 = malloc(IMAGE_WIDTH * IMAGE_HIGHT * 2);

    if (NULL == rgb565) {

        ESP_LOGE(TAG, "can't alloc memory for rgb565 buffer");

        return;

    }

    uint8_t *buf = malloc(IMAGE_MAX_SIZE);

    if (NULL == buf) {

        free(rgb565);

        ESP_LOGE(TAG, "can't alloc memory for jpeg file buffer");

        return;

    }

    int read_bytes = 0;



    if(strcmp(name, "Victory")){

        FILE *fd = fopen("/spiffs/v15.jpg", "r");

    }else if (strcmp(name, "yinhe")) {

        FILE *fd = fopen("/spiffs/y12.jpg", "r");

    }else {

        FILE *fd = fopen("/spiffs/white.jpg", "r");

}



    read_bytes = fread(buf, 1, IMAGE_MAX_SIZE, fd);

    ESP_LOGI(TAG, "spiffs:read_bytes:%d  fd: %p", read_bytes, fd);

    fclose(fd);



    jpg2rgb565(buf, read_bytes, rgb565, JPG_SCALE_NONE);

    lcd_set_index(0, 0, IMAGE_WIDTH - 1, IMAGE_HIGHT - 1);

    lcd_write_data(rgb565, IMAGE_WIDTH * IMAGE_HIGHT * sizeof(uint16_t));

    free(buf);

    free(rgb565);

    vTaskDelay(2000 / portTICK_RATE_MS);

}



void esp_color_display(void)

{

    ESP_LOGI(TAG, "LCD color test....");

    uint16_t *data_buf = (uint16_t *)heap_caps_calloc(IMAGE_WIDTH * IMAGE_HIGHT, sizeof(uint16_t), MALLOC_CAP_SPIRAM);



    while (1) {

        uint16_t color = color565(0, 0, 0);



        for (int r = 0,  j = 0; j < IMAGE_HIGHT; j++) {

            if (j % 8 == 0) {

                color = color565(r++, 0, 0);

            }



            for (int i = 0; i < IMAGE_WIDTH; i++) {

                data_buf[i + IMAGE_WIDTH * j] = color;

            }

        }



        lcd_set_index(0, 0, IMAGE_WIDTH - 1, IMAGE_HIGHT - 1);

        lcd_write_data((uint8_t *)data_buf, IMAGE_WIDTH * IMAGE_HIGHT * sizeof(uint16_t));

        vTaskDelay(2000 / portTICK_RATE_MS);



        for (int g = 0,  j = 0; j < IMAGE_HIGHT; j++) {

            if (j % 8 == 0) {

                color = color565(0, g++, 0);

            }



            for (int i = 0; i < IMAGE_WIDTH; i++) {

                data_buf[i + IMAGE_WIDTH * j] = color;

            }

        }



        lcd_set_index(0, 0, IMAGE_WIDTH - 1, IMAGE_HIGHT - 1);

        lcd_write_data((uint8_t *)data_buf, IMAGE_WIDTH * IMAGE_HIGHT * sizeof(uint16_t));

        vTaskDelay(2000 / portTICK_RATE_MS);



        for (int b = 0,  j = 0; j < IMAGE_HIGHT; j++) {

            if (j % 8 == 0) {

                color = color565(0, 0, b++);

            }



            for (int i = 0; i < IMAGE_WIDTH; i++) {

                data_buf[i + IMAGE_WIDTH * j] = color;

            }

        }



        lcd_set_index(0, 0, IMAGE_WIDTH - 1, IMAGE_HIGHT - 1);

        lcd_write_data((uint8_t *)data_buf, IMAGE_WIDTH * IMAGE_HIGHT * sizeof(uint16_t));

        vTaskDelay(2000 / portTICK_RATE_MS);



    }

}



void app_main()

{

    lcd_config_t lcd_config = {

#ifdef CONFIG_LCD_ST7789

        .clk_fre         = 80 * 1000 * 1000, /*!< ILI9341 Stable frequency configuration */

#endif

#ifdef CONFIG_LCD_ILI9341

        .clk_fre         = 40 * 1000 * 1000, /*!< ILI9341 Stable frequency configuration */

#endif

        .pin_clk         = LCD_CLK,

        .pin_mosi        = LCD_MOSI,

        .pin_dc          = LCD_DC,

        .pin_cs          = LCD_CS,

        .pin_rst         = LCD_RST,

        .pin_bk          = LCD_BK,

        .max_buffer_size = 2 * 1024,

        .horizontal      = 2, /*!< 2: UP, 3: DOWN */

        .swap_data       = 1,

    };



    lcd_init(&lcd_config);



    char *pars_name = (char *)malloc(64);

    while (1) {

        uart_pars_name(pars_name);

        if (strlen(pars_name) >= 0){

            /*< Show a picture */

            esp_photo_display(pars_name);

            audio_play(pars_name);

        }

    }

}

 

四、作品功能演示视频

视频链接:https://training.eeworld.com.cn/video/34706

 

五、项目总结

 

经过本次项目的实践,我学习到了AI识别的一些入门知识,也加深了esp32开发的相关知识。同时也深刻意识到,真正要实现准确的奥特曼识别需要花费非常多的精力。简单的AI模型训练分类的正确识别率还是有限的。特别是在识别奥特曼视频这种特殊场景,以及奥特曼特征码较弱的情况下。

 

活动发帖汇总

 

1. 【基于esp32的姿态识别和场景重现】物料开箱—ESP32-S2-KALUGA-1以及k210

2.  【基于AI摄像头的场景重现项目】基于全志v831的AI识别方案

3. 【基于AI摄像头的场景重现项目】maixhub在线模型训练--奥特曼识别训练过程

4. 【基于AI摄像头的场景重现项目】ESP-IDE 环境 -- 命令行安装过程详细解析

 

 

2022_得捷创新设计大赛_基于AI摄像头的场景重现.docx (534.03 KB, 下载次数: 2)

 

最新回复

Brother Long is qiangility   详情 回复 发表于 2022-11-2 22:56
点赞(1) 关注
 
 

回复
举报

221

帖子

2

TA的资源

纯净的硅(初级)

沙发
 
esp32.zip (94.7 KB, 下载次数: 2)
esp32程序源码
model.zip (8.99 MB, 下载次数: 2)
M2dock的AI识别模型和源码
 
 
 
 

回复

6841

帖子

11

TA的资源

版主

板凳
 

经过本次项目的实践,我学习到了AI识别的一些入门知识,也加深了esp32开发的相关知识。同时也深刻意识到,真正要实现准确的奥特曼识别需要花费非常多的精力。

恭喜完成作品,希望得到大奖!

 
 
 

回复

6773

帖子

2

TA的资源

版主

4
 

识别奥特曼,是为了给那些不看奥特曼的女生用吗

点评

哈哈哈,是女儿喜欢奥特曼,想做给她玩的  详情 回复 发表于 2022-10-30 15:11
 
 
 

回复

221

帖子

2

TA的资源

纯净的硅(初级)

5
 
wangerxian 发表于 2022-10-30 09:50 识别奥特曼,是为了给那些不看奥特曼的女生用吗。

哈哈哈,是女儿喜欢奥特曼,想做给她玩的

 
 
 

回复

4771

帖子

12

TA的资源

版主

6
 

奥特曼识别你得训练 有开源的训练器 你可以试试不难啊的

点评

是PaddleLite这个么?没搞过呀,AI新手,要自己搞训练平台,晚点我再试试,非常感谢  详情 回复 发表于 2022-10-30 21:49
 
 
 

回复

221

帖子

2

TA的资源

纯净的硅(初级)

7
 
吾妻思萌 发表于 2022-10-30 18:43 奥特曼识别你得训练 有开源的训练器 你可以试试不难啊的

是PaddleLite这个么?没搞过呀,AI新手,要自己搞训练平台,晚点我再试试,非常感谢

 
 
 

回复

6060

帖子

6

TA的资源

版主

8
 

AI的实现主要还是机器学习吗?这东西对存储要求高吗?

点评

主要是模型训练,次要的是设备的算力(算力影响识别速度),存储的话,一般都至少要求十几M的模型尺寸。其实也看摄像头的分辨率和哪一种识别模型,比方说也听说过esp32上实现的AI,还有stm32上实现的。具体我不是特  详情 回复 发表于 2022-11-1 09:36
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

221

帖子

2

TA的资源

纯净的硅(初级)

9
 
秦天qintian0303 发表于 2022-11-1 07:23 AI的实现主要还是机器学习吗?这东西对存储要求高吗?

主要是模型训练,次要的是设备的算力(算力影响识别速度),存储的话,一般都至少要求十几M的模型尺寸。其实也看摄像头的分辨率和哪一种识别模型,比方说也听说过esp32上实现的AI,还有stm32上实现的。具体我不是特别清楚。

点评

32系列的这些算力相对来说还是不足的,AI是个潮流啊  详情 回复 发表于 2022-11-1 10:31
 
 
 

回复

6060

帖子

6

TA的资源

版主

10
 
walker2048 发表于 2022-11-1 09:36 主要是模型训练,次要的是设备的算力(算力影响识别速度),存储的话,一般都至少要求十几M的模型尺寸。 ...

32系列的这些算力相对来说还是不足的,AI是个潮流啊

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

253

帖子

3

TA的资源

纯净的硅(初级)

11
 

隆哥太厉害了,多块板子结合,发挥出了1+1>>>2的功效。

ESP32上面播放图片和视频内容,是目前的热点之一,值得好好学习。

 
 
 

回复

156

帖子

1

TA的资源

一粒金砂(中级)

12
 

Brother Long is qiangility

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表