M-Design设计竞赛 - 基于Wio Lite AI视觉开发套件的快餐自助结账系统
该项目使用了Wio Lite AI视觉开发套件,实现了识别食物的设计,它的主要功能为:快餐自助结账系统。
标签
M-Design
Wio Lite AI
快餐自助结账
星辰i
更新2025-04-01
20

项目介绍和创意介绍

随着快餐行业规模持续扩大,传统方式存在很多问题,比如人力成本高、结账速度慢。而现在的自助结账系统的存在很多问题,比如RFID结算系统需改造餐具、云端AI方案依赖网络且延迟高。

为了解决这些问题,本项目采用Wio Lite AI视觉开发套件开发,利用轻量化神经网络,在Wio Lite上完成本地化推理,摆脱云端依赖。用户只需要将取好的餐盘放到摄像头下面,摄像头会自动采集图像,识别出来餐盘里面的食物类型,并自动计算价格,点击结算按钮就会弹出支付二维码。

硬件介绍

image.png



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存储外扩接口
  • 提供全套视觉项目的软件开发包

方案框图和项目设计思路介绍

image.png

设计过程共有4部分:

  1. 图像采集,这里我使用部分网上数据集与自己拍摄的图像作为训练数据集,并做了数据增强增加训练样本数量。
  2. 驱动开发,移植TensorFlow Lite Micro,并编写摄像头与LCD驱动代码。
  3. 模型训练量化,并使用ST的STM32Cube.AI工具进行量化。
  4. 模型部署,编写预处理代码,将摄像头采集的图像数据转换为模型输入的格式,并调整图像的大小、归一化。处理模型的输出,将其转换为具体的菜品识别结果。


软件流程图和关键代码介绍

image.png

初始化外设

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, &params);

/*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);
}

功能展示图及说明

识别可乐

image.png

识别薯条

image.png

识别汉堡

image.png

识别热狗

image.png

设计中遇到的难题和解决方法

对本次竞赛的心得体会

比赛很好,希望下次活动时间可以长一点。




附件下载
STM32H725 _ai_food.7z
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号