当前位置: 首页 > news >正文

K210视觉识别模块学习笔记7:多线程多模型编程识别

今日开始学习K210视觉识别模块: 图形化操作函数

亚博智能      K210视觉识别模块......  

固件库:        canmv_yahboom_v2.1.1.bin

训练网站:    嘉楠开发者社区

今日学习使用多线程、多模型来识别各种物体

 这里先提前说一下本文这次测试实验的结果吧:
结果是不太成功的,没法同时调用俩个模型进行识别,但单独一条线程还是比较正常的

其次就是有一些不足之处,就是训练集太少了,平均每个物体就30多张图片...

以后如果想识别效果好一点,图片数量要多,使用210拍摄,多角度,多光照条件等

文章提供测试代码讲解、完整代码贴出、测试效果图、完整工程下载

目录

简单的多线程程序:

程序代码:

测试结果:

双线程识别尝试:

修改模型名称示例:

别忘了更改模型名称复制到TF卡:​编辑复制整合代码进线程函数:

测试结果声明:

不注释任何线程: 

 注释掉APPLE的线程:​编辑

网上学习资料贴出:


简单的多线程程序:

之前学习树莓派python编程就接触过多线程编程,这里就不多讲定义函数什么的了,直接贴出文章地址:

树莓派4B学习笔记14:Python多线程编程_线程间的同步通信_(锁‘threading.Lock’)_树莓派4b是否支持多线程-CSDN博客

这部分就简单演示一下简单的双线程 是怎么编程的

程序代码:


import _thread #导入线程模块头文件
import time#定义打印测试 线程函数
def print_test(name):while True:print("hello {}".format(name))time.sleep(1)_thread.start_new_thread(print_test,("1",)) #开启线程1,参数必须是元组
_thread.start_new_thread(print_test,("2",)) #开启线程2,参数必须是元组while True:print_test(3)pass

测试结果:

发现这个定义了双线程的程序其实有三条线程:多出来的是主线程

主线程先运行,然后运行其余线程,这个运行顺序可以变换!

双线程识别尝试:

今天尝试采集训练数据集,然后编程,并同时识别苹果与数字6
数据集-模型-代码都会在文末打包提供下载~~~

注意苹果与数字6的 Kmodul 模型不是同一个,而是俩个分开训练出的模型,分别给俩个线程调用


修改模型名称示例:

之前的文章讲过如何修改部分代码使其适配运行,但这里我们发现它每个训练出的模型貌似都是名称为det.kmodel,因此我要将其作小小修改,将名称变为别的

以识别数字6的模型为例,我将它的模型名称该为了:det_6.kmodel

因此程序中,在加载模型的那一行,也需要进行多一步的改写:

其余的更改在之前的文章中早就提到了,跟着更改就行:

K210视觉识别模块学习笔记5:(嘉楠)训练使用模型_识别人脸_亚博k210-CSDN博客

最后进行上位机测试无误即可:
这里别忘了先把模型文件拖入SD卡~,因为是上位机IDE测试,所以代码文件不需要拖入,改好的代码复制或者在CAN_MV的IDE上打开就好了



测试识别结果图:
感觉识别效果很不稳定,应该是数据集太少的原因``````

对于APPLE识别苹果的模型是同理的.....也先这样修改好在进行单独测试失败无问题即可!


别忘了更改模型名称复制到TF卡:


复制整合代码进线程函数:

这一步就注意一下模型名称都要对应好你修改的名称即可!

import _thread #导入线程模块头文件
import time
import sensor, image, time, lcd, gc, cmath
from maix import KPUlcd.init()                          # Init lcd display
lcd.clear(lcd.RED)                  # Clear lcd screen.# sensor.reset(dual_buff=True)      # improve fps
sensor.reset()                      # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)   # Set frame size to QVGA (320x240)
#sensor.set_vflip(True)              # 翻转摄像头
#sensor.set_hmirror(True)            # 镜像摄像头
sensor.skip_frames(time = 1000)     # Wait for settings take effect.
clock = time.clock()                # Create a clock object to track the FPS.#定义APPLE识别线程函数
def APPLE_detect(name):labels = ["APPLE"] #类名称,按照label.txt顺序填写anchor = (2.59, 2.47, 2.84, 3.03, 3.56, 3.44, 3.77, 3.87, 5.31, 4.94) # anchors,使用anchor.txt中第二行的值kpu = KPU()# 从sd或flash加载模型kpu.load_kmodel('/sd/det_APPLE.kmodel')#kpu.load_kmodel(0x300000, 584744)kpu.init_yolo2(anchor, anchor_num=(int)(len(anchor)/2), img_w=320, img_h=240, net_w=320 , net_h=240 ,layer_w=10 ,layer_h=8, threshold=0.6, nms_value=0.3, classes=len(labels))while True:        gc.collect()clock.tick()img = sensor.snapshot()kpu.run_with_output(img)dect = kpu.regionlayer_yolo2()fps = clock.fps()if len(dect) > 0:for l in dect :a = img.draw_rectangle(l[0],l[1],l[2],l[3],color=(0,255,0))info = "%s %.3f" % (labels[l[4]], l[5])a = img.draw_string(l[0],l[1],info,color=(255,0,0),scale=2.0)print(info)del infoa = img.draw_string(0, 0, "%2.1ffps" %(fps),color=(0,60,255),scale=2.0)lcd.display(img)#定义SIX识别线程函数
def SIX_detect(name):   labels = ["six"] #类名称,按照label.txt顺序填写anchor = (1.06, 1.22, 1.36, 1.56, 1.75, 2.03, 2.41, 2.88, 3.58, 4.45) # anchors,使用anchor.txt中第二行的值kpu = KPU()# 从sd或flash加载模型kpu.load_kmodel('/sd/det_6.kmodel')#kpu.load_kmodel(0x300000, 584744)kpu.init_yolo2(anchor, anchor_num=(int)(len(anchor)/2), img_w=320, img_h=240, net_w=320 , net_h=240 ,layer_w=10 ,layer_h=8, threshold=0.6, nms_value=0.3, classes=len(labels))while(True):gc.collect()clock.tick()img = sensor.snapshot()kpu.run_with_output(img)dect = kpu.regionlayer_yolo2()fps = clock.fps()if len(dect) > 0:for l in dect :a = img.draw_rectangle(l[0],l[1],l[2],l[3],color=(0,255,0))info = "%s %.3f" % (labels[l[4]], l[5])a = img.draw_string(l[0],l[1],info,color=(255,0,0),scale=2.0)print(info)del infoa = img.draw_string(0, 0, "%2.1ffps" %(fps),color=(0,60,255),scale=2.0)lcd.display(img)_thread.start_new_thread(APPLE_detect,("1",)) #开启线程1,参数必须是元组    
_thread.start_new_thread(SIX_detect,("1",)) #开启线程2,参数必须是元组     while True:pass 



测试结果声明:

感觉K210的处理运算能力还是有限的:
当我不注释任何线程时,只有APPLE的检测比较正常,
当我把APPLE检测的线程注释掉时,SIX数字又能比较正常地识别到了~~~

其次我的数据集图片数量确实太少了,平均才30多张,识别精度受影响.....

不注释任何线程: 


 

 注释掉APPLE的线程:

 

完整工程下载地址:

https://download.csdn.net/download/qq_64257614/89574163

 
 

网上学习资料贴出:

K210——thread(线程)_k210多线程是什么-CSDN博客

 

http://www.lryc.cn/news/410448.html

相关文章:

  • Go语言教程(一看就会)
  • 【Golang 面试 - 基础题】每日 5 题(十)
  • OD C卷 - 密码输入检测
  • 【每日一题】【逆推法 + 贪心】【数学】造数 河南萌新联赛2024第(一)场:河南农业大学 A题 C++
  • 刷题计划 day4 【双指针、快慢指针、环形链表】链表下
  • 最高200万!苏州成都杭州的这些AI政策补贴,你拿到了吗?
  • 使用两台虚拟机分别部署前端和后端项目
  • Halcon学习之derivate_gauss
  • 智能优化算法(三):遗传算法
  • Docker部署nacos...用户名密码错误
  • 搭建Vue开发环境
  • 富格林:防范虚假可信投资经验
  • Intent的数据传递
  • 【NPU 系列专栏 3.1 -- - ARM NPU 有哪些型号?】
  • 如何运行别人的vue项目
  • 【Django5】内置Admin系统
  • 汕头 西月 公司的面试
  • Spring Boot 实现不同项目之间的远程
  • 【VS2019安装+QT配置】
  • 敏感信息泄露wp
  • 首屏性能优化
  • HVV | .NET 攻防工具库,值得您拥有!
  • angular入门基础教程(九)依赖注入(DI)
  • 小学生也能听得懂的大模型 - Transformer 1
  • 听说它可以让代码更优雅
  • 自写ApiTools工具,功能参考Postman和ApiPost
  • 《深入浅出WPF》学习笔记一.解析WPF程序
  • Scrapy框架中,如何有效地管理和维护爬虫的日志记录?
  • Laravel Sanctum:简化无状态API认证的新纪元
  • OCC BRepOffsetAPI_ThruSections使用