内容介绍
内容介绍
项目介绍和创意介绍
随着快餐行业规模持续扩大,传统方式存在很多问题,比如人力成本高、结账速度慢。而现在的自助结账系统的存在很多问题,比如RFID结算系统需改造餐具、云端AI方案依赖网络且延迟高。
为了解决这些问题,本项目采用Wio Lite AI视觉开发套件开发,利用轻量化神经网络,在Wio Lite上完成本地化推理,摆脱云端依赖。用户只需要将取好的餐盘放到摄像头下面,摄像头会自动采集图像,识别出来餐盘里面的食物类型,并自动计算价格,点击结算按钮就会弹出支付二维码。
硬件介绍
Wio Lite AI是基于STM32H725AE芯片的微控制器视觉开发工具,该芯片是一款Arm Cortex®-M7 32位550 MHz高性能微处理器。单个开发板配有16 MB SPI NOR Flash存储器、8 MB PSRAM,支持双频2.4 GHz/5 GHz Wi-Fi和Bluetooth® 5.1。此外,该套件还包含200万像素DCMI相机模块和2.8英寸电阻式触摸屏RGB LCD,具有开箱即用的特性,便于轻松应用到视觉项目中。
特性
- 基于Cortex-M7内核的STM32H725AE高性能微控制器,主频高达550Mhz
- 外扩16MB SPI 串行Flash以及8MB PSRAM
- 内含2.8寸、分辨率为240x320的电阻式触控显示屏及2百万像素的DCMI 摄像头(OV250)
- 双频段无线连接:2.4GHz / 5GHz WIFI和蓝牙5.1
- 1个USB Type-C供电接口及Micro-SD存储外扩接口
- 提供全套视觉项目的软件开发包
方案框图和项目设计思路介绍
设计过程共有4部分:
- 图像采集,这里我使用部分网上数据集与自己拍摄的图像作为训练数据集,并做了数据增强增加训练样本数量。
- 驱动开发,移植TensorFlow Lite Micro,并编写摄像头与LCD驱动代码。
- 模型训练量化,并使用ST的STM32Cube.AI工具进行量化。
- 模型部署,编写预处理代码,将摄像头采集的图像数据转换为模型输入的格式,并调整图像的大小、归一化。处理模型的输出,将其转换为具体的菜品识别结果。
软件流程图和关键代码介绍
初始化外设
MPU_Config();
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
SCB->CACR|=1<<2; //强制D-Cache透写,如不开启,实际使用中可能遇到各种问题
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_LTDC_Init();
MX_USART3_UART_Init();
MX_I2C4_Init();
MX_DMA_Init();
MX_DCMI_Init();
MX_TIM2_Init();
MX_CRC_Init();
MX_OCTOSPI1_Init();
/* USER CODE BEGIN 2 */
Psram_Init();
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK
OV2640_Init(&OV2640);
OV2640_ReadID(&(OV2640.ID));
OV2640_UXGAConfig();
OV2640_Start();
ai_init();
AI功能初始化
ai_handle ai_init(void)
{
network_handle = AI_HANDLE_NULL;
/* Creating the network */
ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);
/* Initialize param structure for the activation and weight buffers */
const ai_network_params params = AI_NETWORK_PARAMS_INIT(
AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),
AI_NETWORK_DATA_ACTIVATIONS(activations)
);
/* Initializing the network */
ai_network_init(network_handle, ¶ms);
/*Retrieve network descriptor*/
ai_network_get_info(network_handle, &desc_report);
/*Copy descriptor info*/
ai_input[0]= desc_report.inputs[0];
ai_output[0]= desc_report.outputs[0];
return desc_report.inputs->data;
}
摄像头中断与模型识别部分
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
uint8_t person_flag;
if(checkout_flag == 0){
//转换图像为模型可处理的大小
int i,j;
if(mode == 1)
{
for(i=0; i<224; i++)
{
for(j=0; j<224; j++)
{
uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];
network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;
network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;
network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;
}
}
ai_run(network_input, network_output);
mode = 0;
}
else
{
mode = 1;
}
LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
uint8_t numm = network_max();
if(numm_his == numm) numm_count++;
else {numm_count = 0;}
numm_his = numm;
if(numm_count >= 3)
{
numm_play = numm;
}
if(numm_play != 0)
{
if(price_flag == 0)
{
price_flag = 1;
price += jiage[numm_play];
}
for(int i=0;i<5;i++)
{
if(output_labels[numm_play][i] == -1)
{
sprintf(str,"%d",jiage[numm_play]);
LCD_Draw_String(i*32, 0, 320, 240, 32, (char*)str);
LCD_Draw_hanzi(i*32+16*strlen(str), 0, 44, 0);
break;
}
LCD_Draw_hanzi(i*32, 0, output_labels[numm_play][i], 0);
}
}
else
{
price_flag=0;
}
if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0)
{
checkout_flag = 1;
}
if(price != 0)
{
sprintf(str,"%d",price);
LCD_Draw_String(0, 200, 320, 32, 32, (char*)str);
LCD_Draw_hanzi(16*strlen(str), 200, 44, 0);
}
}
if(checkout_flag == 1)
{
LCD_Draw_rectangle(80, 20, 200, 200, 0xFFFF);
LCD_Draw_rectangle(80+5, 20+5, 40, 40, 0x0000);
LCD_Draw_rectangle(80+10, 20+10, 30, 30, 0xFFFF);
LCD_Draw_rectangle(80+15, 20+15, 20, 20, 0x0000);
LCD_Draw_rectangle(80+5, 20+5+150, 40, 40, 0x0000);
LCD_Draw_rectangle(80+10, 20+10+150, 30, 30, 0xFFFF);
LCD_Draw_rectangle(80+15, 20+15+150, 20, 20, 0x0000);
LCD_Draw_rectangle(80+5+150, 20+5, 40, 40, 0x0000);
LCD_Draw_rectangle(80+10+150, 20+10, 30, 30, 0xFFFF);
LCD_Draw_rectangle(80+15+150, 20+15, 20, 20, 0x0000);
}
LCD_Frame_Show();
OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
}
功能展示图及说明
识别可乐
识别薯条
识别汉堡
识别热狗
设计中遇到的难题和解决方法
无
对本次竞赛的心得体会
比赛很好,希望下次活动时间可以长一点。
附件下载
STM32H725 _ai_food.7z
团队介绍
无
评论
0 / 100
查看更多
猜你喜欢
M-Design设计竞赛 -基于ESP32S3的语音唤醒AI助手该项目使用了esp32s3和其他附属元件,实现了语音唤醒的ai助手的设计,它的主要功能为:通过mic接收语音,转文字后发送到大模型,回复的内容通过tts进行语音输出,从而实现AI对话。。
xusp99
56
M-Design设计竞赛-基于Grove Vision AI V2视觉模块的火焰警报系统该项目使用了Grove Vision AI V2视觉模块和Xiao ESP32c3单片机,实现了可以识别火焰并发出警报的设计,它的主要功能为:当识别到火焰的时候单片机就会驱动LED灯和蜂鸣器发出声光提醒,控制继电器模块开启水泵,OLED屏幕上会显示“发现火焰请拨打电话119!!!”。
sycztmdk
30
M-Design设计竞赛 - 基于无线雷达实现物体检测的系统设计该项目使用了FMCW雷达,实现了物体检测的设计,它的主要功能为:采用单向 chirp 的 FMCW 雷达物体检测系统,通过信号处理分析出前方的物体。
void
42