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()
代码现象
运行效果如下图所示:
热门推荐
唐朝十大名将:个个都是战功卓著 第一无异议 秦琼尉迟恭未进榜单
初唐二十四功臣:唐朝开国英雄的传奇
填补月背研究历史空白 嫦娥六号月球样品成分揭秘
智能化与自动化结合:高效养鸡模式的全景解析
中国五种绝版毛主席像章,第四种价值10万,谁家找得到?
Excel信度检验:三种主要方法及应用指南
海南华铁(603300.SH):从设备租赁到算力黑马,一场豪赌背后的资本狂飙
锂电行业极耳激光焊接应用与浅析
从官杀格局—女命从官杀格八字特点解析
又起争议!乘扶梯要不要“左行右立”?科学解释来了~
手扶电梯礼仪新解:左行右立,是传统还是误区?
车上摆件如何固定?固定过程中有哪些关键步骤?
男人俊朗发型和后朋克时代的中性风
高龄备孕二胎,这几条信息一定要注意
违章建筑合法化追认的原则与条件
小区违建举报指南:从证据收集到强制拆除的全流程解析
证人证言的效力与认定是怎么规定的
30句高级不落俗的祝福诗词,建议收藏
初次见面时,怎样的自我介绍符合职场礼仪规范
为什么卖的美版有锁iPhone那么便宜?水太深,劝你看清
河南武校资深教练解读:孩子几岁在武校学武术比较好?
16+8轻断食减肥法,真的有效吗?会有副作用?
雨水节气 探秘节气养生的 “食” 与 “适”
深度睡眠不足怎么办?三个实用解决方案
三种方式计算个人所得税起征点,你知道吗?
国家知识产权局审查员:专利审查的重要角色与责任
轿车钥匙进水后如何处理?这种情况下如何避免进一步损坏?
电信诈骗新套路全解析,教你如何识别与防范,保护个人财产安全。
探索精益生产管理对企业经营的重要性和影响
成功的可复制性商业模式有多重要(可复制的经营模式)