K210图像检测&(1~8)数字卡片识别
创作时间:
作者:
@小白创作中心
K210图像检测&(1~8)数字卡片识别
引用
CSDN
1.
https://blog.csdn.net/m0_60313295/article/details/131142896
本文介绍了一个基于K210开发板的数字卡片识别项目。该项目使用了MaixHub平台和MaixPy IDE进行开发,实现了对1到8的数字卡片的识别功能。文章详细介绍了项目的工程文件、代码实现以及运行效果,适合对AIoT开发感兴趣的读者参考。
前言
这是一个简单的数字卡片识别项目,使用K210Bit开发板、MaixHub平台和MaixPy IDE进行开发。在运行时需要注意摄像头与数字卡片的高度。由于训练集的拍摄高度可能存在不一致,导致在某些高度下个别数字的识别率可能较低。
工程
项目工程文件包含三个主要部分:
- main.py:主程序文件
- model-54796.kmodel:训练好的模型文件
- report.json:模型报告文件
工程文件下载链接:百度网盘 提取码:lypg
代码
原始代码
# generated by maixhub, tested on maixpy3 v0.4.8
# copy files to TF card and plug into board and power on
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
input_size = (224, 224)
labels = ['数字1', '数字2', '数字3', '数字4', '数字5', '数字6', '数字7', '数字8']
anchors = [0.84, 1.22, 1.66, 2.34, 1.31, 1.75, 1.88, 2.59, 1.47, 2.09]
def lcd_show_except(e):
import uio
err_str = uio.StringIO()
sys.print_exception(e, err_str)
err_str = err_str.getvalue()
img = image.Image(size=input_size)
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main(anchors, labels = None, model_addr="/sd/m.kmodel", sensor_window=input_size, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing(sensor_window)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.run(1)
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
if not labels:
with open('labels.txt','r') as f:
exec(f.read())
if not labels:
print("no labels.txt")
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)
lcd.display(img)
return 1
try:
img = image.Image("startup.jpg")
lcd.display(img)
except Exception:
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)
lcd.display(img)
try:
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
pos = obj.rect()
img.draw_rectangle(pos)
img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels[obj.classid()], obj.value()), scale=2, color=(255, 0, 0))
img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0))
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is None:
kpu.deinit(task)
if __name__ == "__main__":
try:
# main(anchors = anchors, labels=labels, model_addr=0x300000, lcd_rotation=0)
main(anchors = anchors, labels=labels, model_addr="/sd/model-54796.kmodel")
except Exception as e:
sys.print_exception(e)
lcd_show_except(e)
finally:
gc.collect()
修改后的代码
在原始代码的基础上进行了以下修改:
- 第8行:显示标签重命名
- 第28行:屏幕显示旋转
- 第64~66行:识别数字后简单的串口打印
# generated by maixhub, tested on maixpy3 v0.4.8
# copy files to TF card and plug into board and power on
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
input_size = (224, 224)
labels = ['1', '2', '3', '4', '5', '6', '7', '8']
anchors = [0.84, 1.22, 1.66, 2.34, 1.31, 1.75, 1.88, 2.59, 1.47, 2.09]
def lcd_show_except(e):
import uio
err_str = uio.StringIO()
sys.print_exception(e, err_str)
err_str = err_str.getvalue()
img = image.Image(size=input_size)
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main(anchors, labels = None, model_addr="/sd/m.kmodel", sensor_window=input_size, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing(sensor_window)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.run(1)
sensor.set_vflip(1) #屏幕垂直翻转
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
if not labels:
with open('labels.txt','r') as f:
exec(f.read())
if not labels:
print("no labels.txt")
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)
lcd.display(img)
return 1
try:
img = image.Image("startup.jpg")
lcd.display(img)
except Exception:
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)
lcd.display(img)
try:
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
pos = obj.rect()
img.draw_rectangle(pos)
OutNum=labels[obj.classid()]
img.draw_string(pos[0], pos[1], "%s : %.2f" %(OutNum, obj.value()), scale=2, color=(255, 0, 0))
print(OutNum)
img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0))
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is None:
kpu.deinit(task)
if __name__ == "__main__":
try:
# main(anchors = anchors, labels=labels, model_addr=0x300000, lcd_rotation=0)
main(anchors = anchors, labels=labels, model_addr="/sd/model-54796.kmodel")
except Exception as e:
sys.print_exception(e)
lcd_show_except(e)
finally:
gc.collect()
代码现象
运行效果如下图所示:
热门推荐
左脚大拇指疼怎么办?原因、预防与就诊指南
凹凸世界雷安:跨越宿命的羁绊与救赎
皮肤有烧灼感但外观正常如何缓解
新的研究表明,引力可以在没有质量的情况下存在
一起来就头晕目眩是什么原因
轻微骨裂严重吗?专业医生这样解答
脚趾骨折后多久能恢复正常走路?这些因素影响恢复时间
深度学习图像分割:U-Net 体系结构
如何在选择房产时做出合理决定?这种决定如何考虑发展潜力?
购房预算,如何合理分配?
OpenLLM | 预训练数据构造方法总结
镜报盘点国际比赛日后英超各队伤情,阿森纳利物浦遭重创
如何开始制作Vlog:2025年实用指南
研究揭示男性长寿老人特有的健康老化表观调控基础
国产汽车电子芯片MCU(微控制器)的发展现状与趋势和芯片封装清洗介绍
【怎麼買便宜機票?】晚買還是早買好?5個必學技巧讓你省更多|尤其最後一種必須會
如何在装修市场中选择环保材料?这种环保材料有哪些特点和优势?
贵州公务员薪酬及年终奖待遇揭秘:2024版
性小众受尽社会压力?性小众定义及性小众群体的精神健康
服用龙胆泻肝丸后体重下降?可能由这5个原因引起
警惕!36岁男子血压总是控制不好,竟然是“打鼾”惹的祸!
中国足球不妨学学近邻日本 日本教练将中国球员的精气神带出来了!
后期思路,用实例详解PS暗光环境下的人像后期思路
近视手术类型、价格、适应人群及优缺点简介!超全建议码住~
足跟痛的锻炼方法
音频功放的种类和基本原理
营养师说:能让记忆力提升的Mind饮食,是什么?
中国人起名的讲究
全球十大辣泡面排行榜 Culley’s夺得第一名
学校如何评估留学申请?如何提高申请成功率?