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()
代码现象
运行效果如下图所示:
热门推荐
B端:空状态页面,消除用户的迷茫和焦虑,一文告诉你。
存在睡眠问题,是否应该服用补剂?
关于颅内高潮,我们到底知道多少?
2025年中国牛肉行业市场供需调查及未来发展趋势展望
提升生活品质的关键策略与实践方法
如何有效利用社交网络技巧寻找适合自己的社群?
CSGO饰品为何持续暴跌?价格下跌后如何应对?
12个方法调节抑郁情绪,拥抱好心情 | 世界精神卫生日
冰心塑造《超人》中主人公何彬的形象以及思想性格特征
手机流量消耗量参考:如何判断使用是否正常?
路由器别放弱电箱,导致信号衰减,改善无线信号的有效方法
数独:逻辑思维挑战之旅,揭秘经典游戏魅力
蜂蜜背后的故事:从蜜蜂采蜜到人类提取的全过程揭秘
一个人如何玩跳绳小游戏?有哪些有趣的玩法?
“子华神”为什么是神?三十年,从退圈到封神!
配电脑是高U低显还是低U高显?马上告诉你
《原神》角色攻略——迪奥娜
蝎子捕捉指南:安全捕捉,科学放生,法律护航
四季护肤全攻略:不同季节的护肤要点和注意事项
河北鸭梨的功效与营养价值
整形医生解析:瘦脸针适合所有大脸吗?详解其适用性与禁忌
深层解读时间的本质,时间到底是什么?
眼睛肿胀怎么办?原因、预防与缓解方法探索
全国首个省级退役军人人力资源市场启用:AI面试官助力,企业高管直接面试
张岱:西湖七月半
宠物疫苗接种全攻略:从幼年到成年的科学免疫计划
液晶显示驱动IC:显示技术的核心
关税摩擦升级,这些电子产品该抢购还是观望?11位美国专家预测
【宏观量化】股市趋势与拐点如何看?
人民币汇率保持基本稳定