K210程序
阈值设定
K210的程序用的是官方给的五朵花分类的程序,大概流程是摄像头采集图像,与之前在百度飞桨上训练的模型进行对比,当准确率超过设定值时,在屏幕上显示识别的东西。
#define PROB_THRESH (0.85f)
PROB_THRESH 为设定阈值,调试识别准确率时可以参照飞桨训练的预测精度,PROB_THRESH 取值比预测精度大。 如果在飞桨上预测精度值比较大(超过0.7),但是在烧到板子中识别准确度并不高,在排除比如光线,图片是否与实物类似等问题后,建议把PROB_THRESH 再调大。 之前我们组就是这个问题,其他应该没什么问题,预测精度0.75多,图片也是在实验室环境拍摄,但是总是识别不准。把ROB_THRESH 从0.8 变到0.91,就解决了。准确率提高了,时间就会增长,所以需要不断调节达到又快有准的地步。
以下是飞桨训练得到的预测精度:
运行时长: 18秒244毫秒
结束时间: 2021-08-07 17:42:41
total eval count:292 cost time:18.15 sec predict accuracy:0.7191780821917808
串口发送数据
主函数发送数据:
if (features[cls] > PROB_THRESH)
{
if(cls==0)
uart_send_data(UART_USB_NUM,"A", 1);
if(cls==1)
uart_send_data(UART_USB_NUM,"B", 1);
if(cls==2)
uart_send_data(UART_USB_NUM,"C", 1);
if(cls==3)
uart_send_data(UART_USB_NUM,"D", 1);
ram_draw_string(display_image.addr, 150, 20, text, RED);
}
通过K210 识别将数据通过串口发送给ARDUINO,完成垃圾投放。串口通信采取连续发送,ARDUINO接受数据并控制舵机完成投放。并通过一个管脚200ms的高电平,K210识别高电平并在显示屏显示” Waste Launch OK“。
管脚定义:参考官方程序串口通信 ,将pin_config.h文件放在你的工程中,在主函数中引用, #include “pin_config.h” 为了方便后边调程序,我们把串口管脚改到13,14 在pin_config.h文件中更改:
#define PIN_UART_USB_RX (14)
#define PIN_UART_USB_TX (13)
串口通信主要遇到的问题是没办法中断发送,摄像头用到中断,串口中断优先级更改后就陷入死循环,所以就采取了一直发送的方式。这也导致后续调参十分复杂,因为在垃圾下落时K210还在识别,所以就得加延时函数,然后就找最佳延时。总之,好复杂。
投放数量显示
投放数量显示成了最难解决的问题,前面说到投放完成后有200ms高电平,K210识别并显示。 我们最开始选择了 switch (cls)语句,但是单独试没有任何问题,但是一起试,就会卡循环,没办法识别,放什么东西都是一个。到现在也没有解决。我们最后改为if语句就没有问题了。
gpio_pin_value_t key_state = gpiohs_get_pin(KEY_GPIONUM);
if(!key_state)
{
jg[0]+=1;
if (what==9)
{
printf("a is ok/n");
jg[0]-=10;
lcd_draw_string(10, 4,"1", RED);
}
if(cls==0)
{
lcd_draw_string(16, 4,&jg, RED);
lcd_draw_string(30, 4,"Harmful Waste Launch OK", RED);
what++;
sleep(2);
}
if(cls==1)
{
lcd_draw_string(16, 4,&jg, RED);
lcd_draw_string(30, 4,"Recyclable Waste Launch OK", RED);
what++;
sleep(2);
}
if(cls==2)
{
lcd_draw_string(16, 4,&jg, RED);
lcd_draw_string(30, 4,"Kitchen Waste Launch OK", RED);
what++;
sleep(2);
}
if(cls==3)
{
lcd_draw_string(16, 4,&jg, RED);
lcd_draw_string(30, 4,"Other Waste Launch OK", RED);
what++;
sleep(2);
}
}
|