如何减少 YOLOv3 文件中的类数?

Abd*_*tef 9 opencv object-detection emgucv yolo

我正在使用 YOLOv3 来检测视频中的汽车。我下载我的代码中使用了三个文件coco.namesyolov3.cfg并且yolov3.weights被培养为80个不同类别的对象被检测到。代码工作但非常慢,每帧需要超过 5 秒。我相信如果我减少类的数量,它会运行得更快。我可以从 中删除不必要的类coco.names,但不幸的是,我无法理解 中的所有内容yolov3.cfg,甚至无法阅读yolov3.weights. 本来想训练自己的模型,但是遇到了很多问题,所以放弃了这个想法。谁能帮我修改这些文件?

gam*_*n67 19

对于使用COCO的数据集轻松,简单的方式,请按照下列步骤操作:

  • 修改(或复制备份)中的coco.names文件darknet\data\coco.names
  • 删除除汽车以外的所有其他类
  • 修改您的 cfg 文件(例如yolov3.cfg),将第610、696、783 行上的 3 个从 80 更改为 1
  • 将cfg 文件中第 603、689、776 行的 3 个过滤器从 255 更改为 18(源自(classes+5)x3
  • 运行检测器 ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/your_image.jpg

对于使用 COCO 数据集的高级方法,您可以使用此 repo 来创建基于 voc、coco 或开放图像的 yolo 数据集。https://github.com/holger-prause/yolo_utils
另请参阅:如何下载 Coco Dataset 的特定部分?

如果您可以使用自己的数据集训练 YOLO 模型,那就太好了。互联网上有很多关于如何构建自己的数据集的教程。像这个这个这个这个

注意:减少类的数量不会使您的推理速度更快。通过减少类,您将检测到更少的对象,并且如果您对每个检测进行后处理,可能会以某种方式使您的程序运行得更快。

  • @gameon67,但是 1)它不起作用,2)它可能导致暗网出现段错误。如果他需要捷径也没关系,这不是一个有效的方法。 (2认同)

Sté*_*ane 5

我必须回到这里来更好地解释为什么我在另一个答案上留下了评论。这样人们就可以直观地看到该解决方案不起作用的确切原因。

以下是在市中心街角拍摄的图像上的默认 MSCOCO 权重示例。完整的 YOLOv4 神经网络在这张图像中总共发现了 15 个物体,其中一个是不正确的(手提包 22%),其余的都是相当不错的预测:

-> prediction results: 15
-> 1/15: "handbag 22%" #26 prob=0.218514 x=1104 y=388 w=130 h=316 tile=0 entries=1
-> 2/15: "person 24%" #0 prob=0.241557 x=220 y=495 w=17 h=42 tile=0 entries=1
-> 3/15: "traffic light 29%" #9 prob=0.287092 x=1083 y=415 w=30 h=25 tile=0 entries=1
-> 4/15: "traffic light 41%" #9 prob=0.411164 x=832 y=422 w=28 h=20 tile=0 entries=1
-> 5/15: "traffic light 43%" #9 prob=0.428222 x=824 y=368 w=15 h=39 tile=0 entries=1
-> 6/15: "traffic light 48%" #9 prob=0.476035 x=26 y=376 w=17 h=40 tile=0 entries=1
-> 7/15: "person 75%" #0 prob=0.754457 x=842 y=476 w=34 h=82 tile=0 entries=1
-> 8/15: "traffic light 81%" #9 prob=0.80667 x=1077 y=360 w=25 h=44 tile=0 entries=1
-> 9/15: "handbag 96%" #26 prob=0.9597 x=1186 y=583 w=61 h=101 tile=0 entries=1
-> 10/15: "person 96%" #0 prob=0.963756 x=134 y=475 w=32 h=78 tile=0 entries=1
-> 11/15: "traffic light 96%" #9 prob=0.964594 x=527 y=242 w=26 h=53 tile=0 entries=1
-> 12/15: "truck 99%" #7 prob=0.988193 x=313 y=433 w=534 h=160 tile=0 entries=1
-> 13/15: "car 99%" #2 prob=0.989198 x=226 y=493 w=108 h=54 tile=0 entries=1
-> 14/15: "person 99%" #0 prob=0.990569 x=1094 y=394 w=151 h=326 tile=0 entries=1
-> 15/15: "person 99%" #0 prob=0.993613 x=980 y=469 w=38 h=97 tile=0 entries=1
Run Code Online (Sandbox Code Playgroud)

MSCOCO 预测

假设我们只想要汽车(索引#3)和卡车(索引#8)。现在我的 .names 文件如下所示:

car
truck
Run Code Online (Sandbox Code Playgroud)

所有其他 78 个名字均被删除。请注意,此时,您假设 Darknet(或 YOLO?)有一种神奇的方法将索引 #0 和索引 #1 处的两个新类映射到索引 #3 和 #8 处的原始位置。但让我们暂时忽略这个问题,就好像有一种方法可以解决这个问题一样。

我修复了 .cfg 文件以表明我现在只有 2 个类,而不是 80 个,并且我将之前的过滤器[yolo]从 255 修改为 21。

现在,当我对同一张图像运行检测时,我什么也没得到:

-> prediction results: 0
Run Code Online (Sandbox Code Playgroud)

没有预测

它能运行纯属运气! 配重的内部结构不再与配置匹配。该配置决定了如何解释权重,并且您修改了其中一个而不改变另一个。说实话,我实际上很惊讶它没有出现段错误,因为我怀疑这会导致暗网陷入一些“未定义的行为”领域。


回到最初的问题,请注意,类的数量会增加训练神经网络所需的时间,但不会影响应用该神经网络所需的时间。

相反,如果您正在寻找性能,请参阅 Darknet/YOLO 常见问题解答。具体来说,此常见问题解答条目: https://www.ccoderun.ca/programming/darknet_faq/#fps

如果 URL 发生变化或消失,请让我在此处发布相关部分:

如何提高我的 FPS?这取决于几件事:

减少课程数量的唯一真正方法就是以这种方式进行培训。因此,您要么训练自己的神经网络,要么下载 MSCOCO 数据集,修改 .names 文件,编辑所有注释以删除所需的类,对所有类重新编号,使它们按顺序排列并从索引零开始,然后重新训练整个网络。

免责声明:我是 DarkHelp、DarkMark 和 Darknet/YOLO FAQ 的作者。