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.mzph.cn/web/48633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现websocket连接服务器报rejected WebSocket connection: HTTP 401

1. websockets报HTTP 401解决办法 代码如下: #!/usr/bin/env python import asyncio import websockets import requestsuri ws://192.168.20.167/websocket msg {"type":6,"param":{"businessType":3,"cmd":1,"f…

线性代数|机器学习-P25线性规划和两人零和博弈

文章目录 0. 概述1. 线性规划问题1.1 定义1.2 举例 2. 线性规划中的对偶问题3. 最大流 - 最小割问题4. 两人零和博弈 MIT教授教学视频,讲得比较泛,需要另外学习很多知识补充 0. 概述 线性规划[LP]问题 线性规划是问题为线性求最值,约束也是求…

自动驾驶-机器人-slam-定位面经和面试知识系列01之常考公式推导(01)

李群李代数扰动bundle adjustment 这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新,基本涵盖了自己秋招历程被问过的面试内容(除了实习和学校项目相关的具体细节)。在知乎和牛客也会同步更新,全网…

《计算机网络》(学习笔记)

目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…

STM32F0-寄存器ADC配置指南

目录 输入方式: 模拟看门狗功能: ADC中断 配置一个Demo 设置时钟 自校准 通道选择 采样时间选择 转换模式选择 断续模式 启动转换 软件触发 外部触发 转换结束 关于DMA 模拟看门狗 ​编辑ADC数据位置​编辑 在STM32F中,ADC可…

AV1技术学习:Loop Restoration Filter

环路恢复滤波器(restoration filter)适用于64 64、128 128 或 256 256 像素块单元,称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器(Wiener filter)或使用自导滤波器&#…

pyenv-win | python版本管理,无需卸载当前版本

系统:windows,且已安装git。 使用 pyenv-win 在Windows中管理多个python版本,而无需卸载当前版本。安装步骤如下: 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…

Word 导入导出

在实际的开发过程中,也会遇到导入导出的功能,今天就简单的做一下总结。 1.需求:将下面word 数据导入到数据库并进行存储 在Controller中 RequestMapping(value "/ImportWord")public RawResponseBodyObject ImportWord(HttpServl…

深入解析Linux目录结构及其功能

深入解析Linux目录结构 Linux 系统的目录结构采用层次化设计,从根目录 / 开始逐级扩展,了解和掌握这些目录的作用和内容有助于我们更好地管理和维护系统。本文将深入解析每个常见目录的功能,并提供相关命令和示例。 目录结构概览 根目录 / …

【BUG】已解决:ERROR: No matching distribution found for PIL

ERROR: No matching distribution found for PIL 目录 ERROR: No matching distribution found for PIL 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身&#xff0…

css大屏设置中间元素四周渐变透明效果

css大屏设置中间元素四周渐变透明效果 四周透明效果: // 设置蒙版上下左右渐变显示mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%, rgba(0, 0, 0, 1) 90%, rgba(0, 0, 0, 0) 100%),linear-gradient(to bottom, rgba(0, 0, 0…

《Java初阶数据结构》----5.<二叉树的概念及使用>

前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

6.6 使用dashboard商城搜索导入模板

本节重点介绍 : 模板商城中搜索模板导入模板修改模板 大盘模板商城地址 免费的 地址 https://grafana.com/grafana/dashboards 搜索模板技巧 详情 导入dashboard 两种导入模式 url导入id导入json文件导入 导入 node_exporter模板 https://grafana.com/grafana/dashboa…

流量录制与回放:jvm-sandbox-repeater工具详解

在软件开发和测试过程中,流量录制与回放是一个非常重要的环节,它可以帮助开发者验证系统在特定条件下的行为是否符合预期。本文将详细介绍一款强大的流量录制回放工具——jvm-sandbox-repeater,以及如何利用它来提高软件测试的效率和质量。 …

Python | Leetcode Python题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution:def moveZeroes(self, nums: List[int]) -> None:n len(nums)left right 0while right < n:if nums[right] ! 0:nums[left], nums[right] nums[right], nums[left]left 1right 1

SpringCloud之@FeignClient()注解的使用方式

FeignClient介绍 FeignClient 是 Spring Cloud 中用于声明一个 Feign 客户端的注解。由于SpringCloud采用分布式微服务架构&#xff0c;难免在各个子模块下存在模块方法互相调用的情况。比如订单服务要调用库存服务的方法&#xff0c;FeignClient()注解就是为了解决这个问题的…

汽车免拆诊断案例 | 2014 款上汽名爵 GT 车发动机无法起动

故障现象 一辆2014款上汽名爵GT车&#xff0c;搭载15S4G发动机&#xff0c;累计行驶里程约为18.4万km。该车因左前部发生碰撞事故进厂维修&#xff0c;更换损坏的部件后起动发动机&#xff0c;起动机运转有力&#xff0c;但无着机迹象。用故障检测仪检测&#xff0c;发现无法与…

初识c++:string类(2)

#本节主要讲解c&#xff1a;string类的模拟实现 全部代码的实现在最后面&#xff01;&#xff01;&#xff01;有需要的自己往下滑&#xff0c;自取&#xff01;&#xff01;&#xff01;1.string类的模拟实现 2.浅拷贝 3.深拷贝 目录 #本节主要讲解c&#xff1a;string类…

VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器

一、引言 如上图&#xff0c;我有一个解决方案【EtchDevice】&#xff0c;他包含两个&#xff08;甚至更多个&#xff09;子项目&#xff0c;分别是【DeviceRT】和【DeviceWin】&#xff0c;见名知意&#xff0c;我需要一个项目编译运行在RTOS上&#xff0c;譬如一个名叫INTime…

用重建大师进行空三解算时,引擎出现“不能访问目录或文件”怎么解决?

答&#xff1a;之前的工程还有在做的任务&#xff0c;可以更换任务目录重新提交空三试试。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格模型…