【问题标题】:How to reduce number of classes in YOLOv3 files?如何减少 YOLOv3 文件中的类数?
【发布时间】:2019-09-12 01:22:01
【问题描述】:

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

【问题讨论】:

  • 类数对yolo的处理时间影响不大。理论上,使用更少的类,你不需要这么大的特征图,但你必须训练自己的网络。减少给定网络的权重称为剪枝,但有一些限制。
  • 我想尝试,但我不想重新发明轮子。
  • 只需删除每个最后一个 yolo 层和输出层之间的链接,以获取您不想保留的所有类 ID。

标签: opencv object-detection emgucv yolo


【解决方案1】:

对于使用 COCO 数据集的简单方法,请按照以下步骤操作:

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

如需更多使用 COCO 数据集的高级方法,您可以使用此 repo 创建基于 voc、coco 或 open 图像的 yolo 数据集。 https://github.com/holger-prause/yolo_utils .
另请参阅:How can I download a specific part of Coco Dataset?

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

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

【讨论】:

  • 非常感谢。这对我帮助很大。我还在构建我的数据库时使用了这个github.com/AlexeyAB/darknet。这比其他人容易。我建议您将其添加到解决方案中。
  • ...!?修改 .names 文件,然后更改过滤器,以便 Darknet 在加载时不会抱怨不会改变神经网络! 80 个 MSCOCO 课程仍然存在,您根本不允许 Darknet 显示名称!就像从汽车上卸下 2 个轮胎不会把它变成摩托车一样。
  • @Stéphane 是的,你是对的,但这是他需要的捷径。他要求在不训练自己的模型的情况下修改文件。如果你想让神经网络像你说的那样工作,那么他需要训练自己的模型
  • @gameon67 但 1)它不起作用,2)它可能导致 Darknet 出现段错误。不管他是否需要捷径,这不是一个有效的方法。
【解决方案2】:

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

以下是在市中心街角拍摄的图像上的默认 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

假设我们只想要汽车(索引 #3)和卡车(索引 #8)。所以现在我的 .names 文件看起来像这样:

car
truck

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

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

现在,当我对同一张图片进行检测时,我什么也得不到:

-> prediction results: 0

它运行的事实完全是运气!权重的内部不再与配置匹配。该配置决定了如何解释权重,并且您修改了一个而没有更改另一个。说实话,我真的很惊讶它没有段错误,因为我怀疑这会导致暗网遇到一些“未定义的行为”领域。


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

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

如果网址更改或消失,让我在这里发布相关部分:

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

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

免责声明:我是 DarkHelp、DarkMark 和 Darknet/YOLO 常见问题的作者。

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 2019-10-06
    • 2017-03-07
    • 2012-04-27
    • 2020-12-09
    • 2022-06-15
    • 2020-03-27
    • 2021-02-15
    • 2020-09-30
    相关资源
    最近更新 更多