最近项目中需要有一个高效的目标检测工具及统计各个标签通过视频中的数量,首先高效的目标检测工具当然首选是最新的yolov8,然后统计数量这个也好办,不就是目标跟踪加上一个变量来存储目标跟踪的id不就可以了吗?然而是我把问题想简单了,这个需求中需要统计不同类别标签各自的数量。最开始想不到解决方法,于是面向cdsn编程,然而,找了一圈没有找到相关的方法思路,甚至都没有找到与yolov8改进相关的文章,毕竟yolov8是新面世开源的,得!自己想呗。
最后想到一个最简单的解决方法,在目标跟踪模块增加一个2*n(n代表标签的数量)的二维数组,列标存储是哪个类别,数组的第一行存储目标跟踪得到该类别的id数,第二行存储该类数量。如此简单,直接上代码:
在
在这个函数中,加上数组totol_num
接着在循环
for d in reversed(det):
中的
if self.args.save or self.args.save_crop or self.args.show: # Add bbox to image
加入
if d.id.item() > totol_num[0][c]: # c是类别的下标,判断这个目标是不是已经统计过了
totol_num[0][c] = d.id.item()
totol_num[1][c] = totol_num[1][c] + 1
接着在
magic function中增加
self.totol_num = []
for i in range(2):
self.totol_num.append([])
for j in range(80):
self.totol_num[i].append(0)
用于初始化二维数组
然后在202行调用predict.py的write_results函数中修改变量
最后在
totol_num = (predictor.totol_num).copy()
for i in range(80):
if totol_num[1][int(i)] != 0:
print('class: ' + str(predictor.model.names[i]) + ' num: ' + str(totol_num[1][int(i)]))
最后是随便新建一个main函数,我们就可以快乐的跑代码啦
from ultralytics import YOLO
model = YOLO(“yolov8x.pt”)
model.track(source=”test.mp4”, tracker=”botsort.yaml”, save=True)
最后是跑出来的效果:
这是显示的内容(每一帧图片后都会显示)
不过我用的是官方的训练参数,所以应对我们具体的场景可能识别成功率不算太高,另外还有的问题就是这个验证的速度太慢,达不到实时性的要求,用2080ti都能跑出这么拉跨的速度......
一个大二的学生,正在学习深度学习,觉得我的文章有用请关注哦~~~~