草庐IT

YOLO v5, v7, v8 + 各种跟踪器(SORT, DeepSORT, ByteTrack, BoT-SORT)实现多目标跟踪

wjpwjpwjp0831 2023-04-17 原文

最近做了一个小工作, 想着把几种多目标跟踪的tracker用统一的步骤和代码风格写一下, 就以YOLO v7作为检测器, 集成了SORT, DeepSORT, ByteTrack, BoT-SORT, DeepMOT五种tracker. 在MOT17与VisDrone2019-MOT数据集上训练并测试.


更新: 现已经支持MOT17数据集, 并加入了一些其他的改进与优化!

项目地址GitHub,

如果对您有用, 欢迎star!!!

亮点

  1. 统一代码风格, 对多种tracker重新整理, 详细注释, 方便阅读, 适合初学者
  2. 多类多目标跟踪
  3. 各种tracker集成在一个文件夹"./tracker/"内, 方便移植到其他detector.

跟踪效果

TrackerMOTAIDF1IDSfps
SORT26.436.4326412.2
DeepSORT12.126.9386012.4
ByteTrack25.140.8159014.32
DeepMOT15.024.836667.64
BoT-SORT23.041.410145.41

集成的tracker:

SORT,
DeepSORT,
ByteTrack(ECCV2022),
DeepMOT(CVPR2020),
BoT-SORT(arxiv2206),

TODO

  • 集成UAVMOT(CVPR2022)
  • 达到更好的结果(缓解类别不平衡, 小目标等等)…

效果

在VisDrone2019-MOT train训练约10 epochs, 采用YOLO v7 w6结构, COCO预训练模型基础上训练. GPU: single Tesla A100, 每个epoch约40min.
在VisDrone2019-MOT test dev测试, 跟踪所有的类别.

TrackerMOTAIDF1IDSfps
SORT26.436.4326412.2
DeepSORT12.126.9386012.4
ByteTrack25.140.8159014.32
DeepMOT15.024.836667.64
BoT-SORT23.041.410145.41

fps具有一定的随机性

  \space  
  \space  

使用指南:

环境配置

  • python=3.7.0 pytorch=1.7.0 torchvision=0.8.0 cudatoolkit=11.0
  • py-motmetrics (pip install motmetrics)
  • cython-bbox (pip install cython_bbox)
  • opencv

训练

训练遵循YOLO v7的训练方式, 数据集格式可以参照YOLO v5 train custom data
即数据集文件遵循

class x_center y_center width height

其中x_center y_center width height必须是归一化的.
如果您训练VisDrone数据集, 可以直接调用:

python tools/convert_VisDrone_to_yolov2.py --split_name VisDrone2019-MOT-train --generate_imgs

需要您修改一些路径变量.

准备好数据集后, 假如训练YOLO v7-w6模型(single GPU):

python train_aux.py --dataset visdrone --workers 8 --device <$GPU_id$> --batch-size 16 --data data/visdrone_all.yaml --img 1280 1280 --cfg cfg/training/yolov7-w6.yaml --weights <$YOLO v7 pretrained model path$> --name yolov7-w6-custom --hyp data/hyp.scratch.custom.yaml

更多训练信息参考YOLO v7

跟踪

model_path 参数为训练后的detector model, 假设路径为 runs/train/yolov7-w6-custom4/weights/best.pt

SORT :

python tracker/track.py --dataset visdrone --data_format origin --tracker sort --model_path runs/train/yolov7-w6-custom4/weights/best.pt

DeepSORT:

python tracker/track.py --dataset visdrone --data_format origin --tracker deepsort --model_path runs/train/yolov7-w6-custom4/weights/best.pt

ByteTrack:

python tracker/track.py --dataset visdrone --data_format origin --tracker bytetrack --model_path runs/train/yolov7-w6-custom4/weights/best.pt 

DeepMOT:

python tracker/track.py --dataset visdrone --data_format origin --tracker deepmot --model_path runs/train/yolov7-w6-custom4/weights/best.pt

BoT-SORT:

python tracker/track.py --dataset visdrone --data_format origin --tracker botsort --model_path runs/train/yolov7-w6-custom4/weights/best.pt

您也可以通过增加

--save_images --save_videos

来控制保存跟踪结果的图片与视频.

将./tracker应用于其他detector

只需保证detector的输出格式为

(batch_size, num_objects, x_center, y_center, width, height, obj_conf, category)

或经典的yolo格式

(batch_size, num_objects, x_center, y_center, width, height, obj_conf, category_conf0, category_conf1, category_conf2, ...)

注意: 推理的时候batch_size要求为1.

有关YOLO v5, v7, v8 + 各种跟踪器(SORT, DeepSORT, ByteTrack, BoT-SORT)实现多目标跟踪的更多相关文章

  1. ruby - Sort_by Ruby,一个降序,一个升序 - 2

    我已经搜索过这个问题的答案,但没有成功,有一个类似的问题,但答案在这种情况下不起作用,它按数字项目排序。SimilarQuestion-Thatdidnotwork我正在尝试使用ruby​​的sort_by对一个项目进行降序排序和另一个升序排序。我只能找到一个。代码如下:#PrimarysortLastNameDescending,withtiesbrokenbysortingAreaofinterest.people=people.sort_by{|a|[a.last_name,a.area_interest]}任何指导肯定会有所帮助。示例数据:输入罗素,逻辑欧拉,图论伽罗瓦,抽象代

  2. ruby - 如何从 URL 中删除 Google 跟踪参数 (UTM)? - 2

    我有一堆要清理的URL。它们都包含UTM参数,在这种情况下不是必需的,或者是有害的。示例:http://houseofbuttons.tumblr.com/post/22326009438?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+HouseOfButtons+%28House+of+Buttons%29所有可能的参数都以utm_开头。如何使用ruby​​脚本/结构轻松删除它们而不破坏其他潜在的“好”URL参数? 最佳答案 您可以将正则表达式应用于url以清

  3. ruby-on-rails - Rails Asset Pipeline 更好的错误或堆栈跟踪 - 2

    刚刚将应用程序从rails3.0.9升级到3.2.1,当我运行bundleexecrakeassets:precompile时出现错误,这很好,但是回溯没有告诉我在哪里语法问题来self的css或scss文件。我尝试对“0ee5c0e69c92af0”进行greping,但该字符串没有出现在我的项目中。bundleexecrakeassets:precompile:allRAILS_ENV=productionRAILS_GROUPS=assets--trace**Invokeassets:precompile:all(first_time)**Executeassets:precom

  4. ruby - 使用 gmail gem 跟踪一些电子邮件 - 2

    我正在使用gmailgem发送电子邮件,我需要跟踪这些电子邮件。我该怎么做?我正在尝试搜索带有message_id的电子邮件,但它会从我的收件箱中提取所有电子邮件,而我只想要特定电子邮件的回复。这是我的实际代码:*使用message_id保存电子邮件*mail=gmail.deliver(email)Email.create(:message_id=>mail.message_id,:from=>user.email,:to=>annotation.to,:body=>annotation.content,:title=>annotation.title,:annotation=>an

  5. ruby - 如何跟踪 paper_trail 中的自定义事件? - 2

    我正在使用paper_trail进行审计跟踪。除了创建、更新和删除事件外,我还想跟踪一些自定义事件,例如查看(记录)、发送(电子邮件)等。我们如何在审核模型时引入此类自定义事件? 最佳答案 我发现了一个调整,可以在paper_trail管理的Version中添加自定义事件:Version.create(item_type:"Campaign",item_id:campaign.id,event:"Sent")也许这不是正确的解决方案,但它帮助我实现了目标。我想更多地探索paper_trail以找到更好的解决方案。

  6. ruby - Watir-Webdriver 是否支持点击目标为 javascript 的链接? - 2

    我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click

  7. ruby - 跟踪 Ruby 中的代码? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion有没有一种运行脚本并查看所有步骤的好方法:执行了哪些代码代码在哪个文件中返回什么错误信息这将是了解开源项目如何运作的好方法。Ruby没有这样的解决方案吗?例如。require"httparty"HTTParty.get"http://www.google.se"然后它会运行代码并向我展示它正在执行的所有代码,其中的文件和行、返回的对象、错误消息等。

  8. 关于yolov5训练时参数workers和batch-size的理解 - 2

    关于yolov5训练时参数workers和batch-size的理解yolov5训练命令workers和batch-size参数的理解两个参数的调优总结yolov5训练命令python.\train.py--datamy.yaml--workers8--batch-size32--epochs100yolov5的训练很简单,下载好仓库,装好依赖后,只需自定义一下data目录中的yaml文件就可以了。这里我使用自定义的my.yaml文件,里面就是定义数据集位置和训练种类数和名字。workers和batch-size参数的理解一般训练主要需要调整的参数是这两个:workers指数据装载时cpu所使

  9. ruby-on-rails - ruby rails : How to sort a collection_select - 2

    我想按数据库表列“plays”对其进行排序/排序(按我想要的方式降序或升序)我完全糊涂了。刚刚找到了select而不是collection_select的解决方案?我的一些代码不知道如何排序/排序数据库表中还有一些列,如“plays”、“goals”... 最佳答案 只需将实际排序的集合传递给collection_select助手:collection_select(:post,:author_id,Author.order('created_atDESC'),:id,:name_with_initial,:prompt=>true

  10. ruby-on-rails - 如何让 memprof(在 rails 内)跟踪所有之前的过滤器,然后在转储输出之前进行操作? - 2

    根据Memprofgem文档,为了让Memprof::Middleware与rails一起工作,我们需要将每个请求包装在Memprof.track中。问题是:如何让memprof跟踪所有之前的过滤器,然后在转储输出之前执行操作? 最佳答案 在不了解Memprof的情况下,也不了解您要完成的目标,这是我的最佳猜测。在你的application_controller.rb中:before_filter:do_memprof_stuffdefdo_memprof_stuff#makeitreallysweetend这将在调用其他Contr

随机推荐