YOLOv5实现目标分类计数并显示在图像上

        有同学后台私信我,想用YOLOv5实现目标的分类计数,因此本文将在之前目标计数博客的基础上添加一些代码,实现分类计数。阅读本文前请先看那篇博客,链接如下:

YOLOv5实现目标计数_Albert_yeager的博客

1. 分类实现

        以coco数据集为例,其类别如下(共80类)。注意,每个类别都对应着一个序号,如: 'person' 序号为0,  'bicycle' 序号为1,  'car'  序号为2...这个在之后的调用中会用到。

         找到之前写的的计数模块(详见之前的博客),将其替换为下面的代码,即可实现分类计数功能,下面我将进行详细的讲解。

# Write results+计数
# count=0
person_count = 0
tie_count = 0
for *xyxy, conf, cls in reversed(det):if save_txt:  # Write to filexywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywhline = (cls, *xywh, conf) if opt.save_conf else (cls, *xywh)  # label formatwith open(txt_path + '.txt', 'a') as f:f.write(('%g ' * len(line)).rstrip() % line + '\n')if save_img or view_img:  # Add bbox to image#c = int(cls)# integer class分类数#label = '%s %.2f  num: %d' % (names[int(cls)], conf, person_count)label = f'{names[int(cls)]} {conf:.2f}'plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)##########################分类计数##########################if int(cls) == 0:person_count += 1if int(cls) == 27:tie_count += 1# count = count+1

         添加的主要代码为1、2、4,其中1、2是初始化两个类别的个数,这里我选择人('person')和领带('tie')作为两个计数的类(可以根据需求添加自己的类)。3是显示标签的格式,下面那一行是官方的,你也可以改成自己喜欢的样子。

        重点来了!4中的代码是两个判断,int(cls)表示类别的序号。在coco的类别中,'person' 的序号为0,因此当 int(cls) == 0 时也就是当识别到人时,人的计数器 person_count+1;'tie' 的序号为27,因此当 int(cls) == 27 时也就是当识别到领带时,领带的计数器 tie_count+1。这样就能实现分类计数。

         这里用的推断模型是yolov5s.pt,是用coco数据集训练出来的,因此识别的类就是上面展示的80类,序号就是依次从0-79(这是一句废话)。那么如果要对自己的数据集进行分类计数,那么就要用自己训练出来的模型进行推断,序号就是按训练部署时names数组中的序列,从0开始,依次递增。

        为了讲得更清楚,我再举一个例子(点赞关注一下呗(>﹏<) ,555~)

        下面是我自己训练部署时的数据集文件内容,可以看到我要识别五个目标,分别是HEWSN,那么根据names数组中的序列,‘H’对应的序号为0,E对应1,W对应2,S对应3,N对应4。

         如果我想对W和S进行分类计数,那么上面的代码应该改成下面这样,首先定义W_count,S_count两个计数器,然后当int(cls) == 2时W_count+1,int(cls) == 3时S_count+1。当然,推断模型记得改成自己的(更改 '--weights' 参数的默认值)。

# Write results+计数
# count=0
W_count = 0
S_count = 0
for *xyxy, conf, cls in reversed(det):if save_txt:  # Write to filexywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywhline = (cls, *xywh, conf) if opt.save_conf else (cls, *xywh)  # label formatwith open(txt_path + '.txt', 'a') as f:f.write(('%g ' * len(line)).rstrip() % line + '\n')if save_img or view_img:  # Add bbox to image#c = int(cls)# integer class分类数#label = '%s %.2f  num: %d' % (names[int(cls)], conf, person_count)label = f'{names[int(cls)]} {conf:.2f}'plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)##########################分类计数##########################if int(cls) == 2:W_count += 1if int(cls) == 3:S_count += 1# count = count+1

2. 图片/视频识别显示计数内容

        为了将计数结果显示在图像上,需要使用 cv2.putText() 函数,具体添加方法如下:

       在 “if save_img:” 后添加下面这几行代码即可,这里我就只打印人和领带的计数了,大家可以根据自己的需求改。

##############################视频识别显示计数内容####################################
text = 'person_num:%d ' % (person_count)
cv2.putText(im0, text, (180, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 5)
text = 'tie_num:%d ' % (tie_count)
cv2.putText(im0, text, (180, 120), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 5)
####################################################################################

        另外注意cv2.putText()函数的几个参数意义,然后慢慢调参,让打印出来的图片美观就行了。

cv2.putText(im0, text, (40, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 4)
# 要绘制的图像(im0)
# 要绘制的文本字符串(text)
# 文本的位置(x, y),窗口左上角为(0,0)
# 要使用的字体类型(font),这里用OpenCV的内嵌字体
# 字体大小(font_scale),在此处为1
# 字体颜色(font_color),在此处为红色(0, 0, 255)
# 字体线宽(thickness),在此处为4   

        最后实现效果如下(视频识别同理):

         

3. 实时检测窗口打印计数内容

        为了将计数结果显示在实时检测的窗口中,同样需要使用 cv2.putText() 函数,具体的修改方法如下:

        在 “if view_img:” 后添加下面这几行代码(这里我就只打印人的计数了,大家可以根据自己的需求改)。

##############################实时检测窗口打印计数内容#################################
text = 'person_num:%d ' % (person_count)
cv2.putText(im0, text, (180, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 4)
####################################################################################

        

        希望这篇文章可以帮助到大家,其他评论区和私信问我问题的同学们也不要急,你们的问题我一直在研究,如果完成了我会第一时间发出来并通知你的(≧∇≦)/

求学路上,你我共勉(๑•̀ㅂ•́)و✧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/179060.shtml

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

相关文章

深入理解 Java Bean 的生命周期及各个阶段解析

目录 引言&#xff1a;一、什么是Java Bean二、Bean的生命周期概述三、Bean的创建阶段四、属性设置阶段初始化阶段六、使用阶段七、销毁阶段 引言&#xff1a; Java Bean是Java编程中经常使用的重要概念&#xff0c;它是可重用、可移植、可序列化的组件。在Java开发中&#xf…

最新的外贸自建站教程?做外贸如何建网站?

外贸自建站教程步骤有哪些&#xff1f;海洋建站如何做网站搭建&#xff1f; 想要了解关于外贸自建站的最新教程吗&#xff1f;外贸自建站不再是高不可攀的难题&#xff0c;相反&#xff0c;它为企业提供了更多的机会和自主掌握业务的空间。海洋建站将为您提供一份全面的指南&a…

Android 编译的配置文件:android.mk 和android.bp

Android.bp文件首先是Android系统的一种编译配置文件&#xff0c;是用来代替原来的Android.mk文件的。在Android7.0以前&#xff0c;Android都是使用make来组织各模块的编译&#xff0c;对应的编译配置文件就是Android.mk。在Android7.0开始&#xff0c;Google引入了ninja和kat…

什么是大数据测试?有哪些类型?应该怎么测?

随着目前世界上各个国家使用大数据应用程序或应用大数据技术场景的数量呈指数增长&#xff0c;相应的&#xff0c;对于测试大数据应用时所需的知识与大数据测试工程师的需求也在同步增加。 针对大数据测试的相关技术已慢慢成为当下软件测试人员需要了解和掌握的一门通用技术。…

SPSS生存分析:寿命表分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

15 网关实战: 微服务集成Swagger实现在线文档

上节介绍了网关层面聚合API文档,通过网关的路由信息找到了各个服务的请求地址,这节讲一下微服务如何集成Swagger。 网关的API文档默认调用的是微服务的**/v2/api-docs**这个接口获取API详细信息,比如文章服务的URL:http://localhost:9000/blog-article/v2/api-docs,返回信…

Python分享之字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能&#xff0c;比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时&#xff0c;Python使用一个字符串作为模板。模板中有格式符&#xff0c;这些格式符为真实值预留位置&#xff…

Python二叉树用法介绍

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 二叉树是一种常见的数据结构&#xff0c;具有树形结构&#xff0c;每个节点最多有两个子节点。Python中有多种方式来表示和操作二叉树&#xff0c;本文将介绍二叉树的基本概念、构建、遍历和一些常见操作&#x…

3个.NET开源免费的仓库管理系统(WMS)

前言 今天给大家推荐3个.NET开源免费的WMS仓库管理系统&#xff08;注意&#xff1a;以下排名不分先后&#xff09;。 仓储管理系统介绍 仓储管理系统&#xff08;Warehouse Management System&#xff0c;WMS&#xff09;是一种用于管理和控制仓库操作的软件系统&#xff0…

F5社区学习心得分享:如何克服云迁移挑战?

伴随数字时代的快速发展&#xff0c;很多企业都会借助云迁移&#xff0c;踏上转型之旅。尽管云迁移被认为是一种能够节约成本&#xff0c;且不会影响正常运营的现代化改造举措&#xff0c;然而我们并不能低估它的复杂性。正如有研究表明&#xff0c;约有41%的企业并没有通过云迁…

lv11 嵌入式开发 WDT实验 12

目录 1 WDT简介 2 Exynos4412下的WDT控制器 2.1 概述 2.2 WDT的特性 2.3 工作原理 2.4 其他细节 3 WDT寄存器详解 3.1 WTCON控制寄存器 3.2 WTDAT 实时中断寄存器 3.3 WTCNT 递减计数器 3.4 WTCLRINT清除中断寄存器 4 WDT编程 1 WDT简介 Watch Dog Timer即看门狗定…

ZKP15.2 Formal Methods in ZK (Part I)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 15: Secure ZK Circuits via Formal Methods (Guest Lecturer: Yu Feng (UCSB & Veridise)) 15.2 Formal Methods in ZK (Part I) Circuits Workflow Source Code: Witness Generation and ConstraintsWitness Generatio…

【力扣】 209. 长度最小的子数组

【力扣】 209. 长度最小的子数组 文章目录 【力扣】 209. 长度最小的子数组1. 题目介绍2. 解法2.1 暴力求解2.2 前缀和 二分查找2.3 滑动窗口2.4 贪心回溯 3. Danger参考 1. 题目介绍 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 …

ubuntu安装远程桌面

ubuntu安装远程桌面 xrdp远程桌面访问 #用windows远程桌面连接成功,只能用root用户,用普通用户连接是灰色 sudo apt install xrdp systemctl status xrdpsystemctl stop xrdp解决普通用户连接是灰色 参考链接: https://blog.csdn.net/leegh1992/article/details/51160864 s…

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具&#xff0c;而在Python中则使用PyQt这一工具包&#xff0c;它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包&#xff0c;主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Desig…

C或C++报错:ld returned 1 exit status报错的原因

C或C报错&#xff1a;ld returned 1 exit status&#xff08;ld返回1&#xff0c;退出状态&#xff09; 可能是以下原因: 1&#xff09;程序正在运行&#xff0c;无法编译&#xff0c;上次运行的窗口未关闭。 程序窗口重复运行没有及时关闭&#xff0c;存在多个打开窗…

Python中的sys模块详解

1. 简介 sys模块是Python标准库中的一个内置模块&#xff0c;提供了与Python解释器和运行环境相关的功能。它包含了一些与系统操作和交互相关的函数和变量&#xff0c;可以用于获取命令行参数、控制程序的执行、管理模块和包、处理异常等。 2. 常用函数和变量 2.1 命令行参数…

二叉树之推排序(升序)

目录 1.思路1.1大堆的建立方法1.2排序的方法 2.代码实现以及测试代码 1.思路 如何将一个堆进行排序&#xff0c;并变成升序&#xff1f;首先&#xff0c;如果要完成升序&#xff0c;那我们可以建立一个大堆&#xff0c;因为大堆可以选出一个最大的值放在堆的最上面&#xff0c…

数组中的第 K 个最大元素(C++实现)

数组中的第 K 个最大元素 题目思路代码 题目 数组中的第 K 个最大元素 思路 通过使用优先队列&#xff08;最大堆&#xff09;来找到数组中第k大的元素。通过弹出最大堆中的前k-1个元素&#xff0c;留下堆中的顶部元素作为结果返回。 代码 class Solution { public:int find…

Java17(LTS Long Term Support)特性

支持JDK17的主流技术框架 spring framework 6.xspringboot 3.xkafka 3.0(不在支持jdk8)jenkins 2.357&#xff08;必须jdk11起步&#xff09;James Gosling表示赶紧弃用Java8&#xff0c;使用性能最好的JDK17Chart GPT也推荐JDK17&#xff0c;从长期到性能来说。 JDK17的特性 …