草庐IT

简单易上手YOLOV5-deepsort(Windows)

库先生 2023-05-01 原文

YOLOV5模型训练以及deepsort目标追踪的简单上手操作,并总结了常见问题

目录

文章目录

一、YOLOV5模型训练

1.下载源码文件

2.环境设置

3.准备工作

4.开始运行

 二、YOLOV5-deepsort的目标识别

 1.修改配置

 三、常见问题与解决

 四、如何修改撞线polygon(附加)

总结

一、YOLOV5模型训练

1.下载源码文件

Yolov5源码文件是开源的,点开官网https://github.com/ultralytics/yolov5,选择对应的版本,我这里选择5.0版本,为了和后期的deepsort算法版本对应,点击V5.0,跳转页面后然后点击code,再点击DownloadZIP下载下来代码,解压即可。注意(下载yolov5.pt可能需要单独下载,有时候没有)。

2.环境设置

首先需要新建环境,打开cmd,输入以下代码,我用的是已经装好的torch环境,其中xxxxxx为自己建立的conda环境的名字

conda create -n xxxxxx(环境名字) python=3.8

进入激活环境:

conda activate xxxxxx(环境名字)

然后输入cd+文件夹命令,进入下载的yolov5目标文件夹,然后输入以下代码安装依赖包,并耐心等待。

pip install -r requirements.txt

3.准备工作

建立子文件夹如下:

其中images放.jpg文件,label放.txt文件,其中train为训练集,用来训练,val为验证集,即验证结果是否准确。

在data文件夹下,复制voc.yaml文件,改名为egg.yaml,因为我的训练集是关于鸡蛋的,添加以下代码

第一二行为训练集和测试集对应的文件路径,nc修改为类别数,names修改为具体哪几类。models目录下的yolov5s.yaml复制,改名为yolov5s_egg.yaml,并将其中nc改为5,即自己的类别数这两个文件的类别数要统一。

打开train.py文件,找到第456行主函数,按照如下图对应修改,主要修改前7行即可

4.开始运行

输入以下代码开始运行,如果出现了“页面文件太小,无法完成操作”的报错,即需要在utils路径下,找到datasets.py文件,将里面的第81行里面的参数nw改为0就可以了。

python train.py

跑起来就有“进度显示”,类似下图(只是演示,迭代结果不一定好哦),大家只需要耐心等待哦 

 二、YOLOV5-deepsort的目标识别

 1.修改配置

为了实现yolov5-deepsort 的目标追踪,我们在GitHub搜索yolov5-deepsort,会发现以下内容

 第三个为第一个的最新版本(5.0),点开第一个再跳转到最新版本(5.0)也是一样的。

将代码下载下来,看README.md,发现需要运行demo.py,在此之前

  • 首先需要新建环境conda create -n deepsort(环境名字) python=3.8,我用的是已经装好的torch环境,其中deepsort为自己建立的conda环境的名字,
  • 然后pip install -r requirements.txt安装所有的环境和依赖,
  • 在AIDetector_pytorch.py中第18行修改自己为yolov5训练的权重文件best.pt
  • 在AIDetector_pytorch.py中第19行修改为
 self.device = '' if torch.cuda.is_available() else 'cpu'

即CPU运行

  • 在AIDetector_pytorch.py中第60行修改自己的标签名字
  • 在demo,py第10行修改为自己视频路径

然后python demo.py即可

 三、常见问题与解决

1.问题一:

遇到这个问题,首先可以将下面这个函数的内容完全复制修改,替换原来的tracker.py文件中这个函数的内容,然后要注意的一点是,所有的首行缩进应该保持一致,一旦有错误的话,整个逻辑将会出现错误。

def update_tracker(target_detector, image):
new_faces = []
_, bboxes = target_detector.detect(image)

bbox_xywh = []
confs = []
clss = []
outputs = []   ####################
if len(bboxes):
    for x1, y1, x2, y2, cls_id, conf in bboxes:

        obj = [
            int((x1+x2)/2), int((y1+y2)/2),
            x2-x1, y2-y1
        ]
        bbox_xywh.append(obj)
        confs.append(conf)
        clss.append(cls_id)

    xywhs = torch.Tensor(bbox_xywh)
    confss = torch.Tensor(confs)

    outputs = deepsort.update(xywhs, confss, clss, image)

bboxes2draw = []
face_bboxes = []
current_ids = []
for value in list(outputs):
    x1, y1, x2, y2, cls_, track_id = value
    bboxes2draw.append(
        (x1, y1, x2, y2, cls_, track_id)
    )
    current_ids.append(track_id)
    if cls_ == 'face':
        if not track_id in target_detector.faceTracker:
            target_detector.faceTracker[track_id] = 0
            face = image[y1:y2, x1:x2]
            new_faces.append((face, track_id))
        face_bboxes.append(
            (x1, y1, x2, y2)
        )

ids2delete = []
for history_id in target_detector.faceTracker:
    if not history_id in current_ids:
        target_detector.faceTracker[history_id] -= 1
    if target_detector.faceTracker[history_id] < -5:
        ids2delete.append(history_id)

for ids in ids2delete:
    target_detector.faceTracker.pop(ids)
    print('-[INFO] Delete track id:', ids)

image = plot_bboxes(image, bboxes2draw)

return image, new_faces, face_bboxes

2. 问题二:

AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘XXX
或者model.yolo.xxxxx问题都可以这样解决

由于yolov5目前最新版本为6.2直接从官网上下载yolov5的版本较高,但是yolov5-deepsort版本更新较慢,就会导致自己用yolov5模型训练后的模型权重文件best.pt等与此文件中的yolov5s.pt版本不匹配的问题,就会报错,所以我们需要下载对应的版本,这时我们可以参考如下链接博客。本deepsort使用的是5.0版本的权重文件。

http://t.csdn.cn/l5Q5v

3.问题三:修改测试视频文件路径

 

出现这种问题的原因是没有找到可以运行的测试视频文件这时我们将所需要测试的文件放到当前目录下然后修改demo.py中第十行的cap = cv2.VideoCapture('test2.mp4')视频路径即可。

4. 问题四:

提示load()函数调用的时候缺少参数

解决方法:

deep_sort\deep_sort\utils\parser.py的第23行加上缺少的参数就好了

self.update(float(fo.read(),Loader=yaml.SafeLoader))

 5.问题五:修改为CPU运行

这样的问题是因为修改device时,未修改完全,在AIDetector_pytorch.py中第19行修改为

self.device = '' if torch.cuda.is_available() else 'cpu'

即为cpu运行,还需要将23行half修改为float,如下:

model.float()

36行同理

img = img.float() 

48行同理

pred = pred.float()

 四、如何修改撞线polygon(附加)

Deepsort-speed代码中修改polygon

在代码中的demo.py,可以看到在开头的时候填充了polygon,然后在这个基础上分别画了蓝色polygon和黄色polygon,这两个就是撞线,以下代码即通过经过这两条线判断经过或者返回累计个数。

(1)list_pts_blue就是蓝色这个多边形的左边,可以看到有四个点坐标(x,y),这就说明这是四边形,左边点的顺序依次为左上,左下,右下,右上,即逆时针转一圈。修改位置左边或者添加坐标点的个数即可以实现多边形的切换。

(2)blue_color_plate为多边形的颜色,通过RGB值。可以修改撞线的不同的颜色。

(3)

fps = int(cap.get(5))

print('fps:', fps)

t = int(100/fps)

此代码在demo.py中的第60行,fps就是按照获得的帧数,是按照get(5)的方式进行抽帧,一般都是5,t是定义的一个变量用来在代码第208行cv2.waitKey(t)中调用,实现速度的调试,想修改速度可以修改t = int(100/fps)中的100,变大速度则会变慢,变小速度则会变小,也可以不调用这个变量,直接在下面的cv2.waitKey(t)中不调用t,改为cv2.waitKey(10),或cv2.waitKey(1)都可以,保证内部值为整数即可。

总结


以上就是YOLOV5模型训练以及deep sort目标追踪的简单上手操作,并总结了一些运行过程中可能会出现的问题。

有关简单易上手YOLOV5-deepsort(Windows)的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  3. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  4. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  5. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  6. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  7. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  8. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  9. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

  10. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

随机推荐