如何减少 YOLOv3 文件中 类 的数量?
How to reduce number of classes in YOLOv3 files?
我正在使用 YOLOv3 检测视频中的汽车。我下载了我的代码 coco.names
、yolov3.cfg
和 yolov3.weights
中使用的三个文件,这些文件针对 80 种不同的 类 待检测对象进行了训练。代码工作但非常慢,每帧需要 5 秒以上。我相信如果我减少 类 的数量,它会 运行 快得多。我可以从coco.names
中删除不需要的类,但不幸的是,我无法理解yolov3.cfg
中的所有内容,甚至无法阅读yolov3.weights
。
本来想训练自己的模型,但是遇到了很多问题,所以放弃了这个想法。
谁能帮我修改这些文件?
对于使用 COCO 数据集的简单方法,请按照以下步骤操作:
- 修改(或复制备份)
darknet\data\coco.names
中的coco.names
文件
- 删除所有其他 类 除了 car
- 修改你的cfg文件(例如
yolov3.cfg
),将第610、696、783行的3类从80改为1
- 将第 603、689、776 行的 cfg 文件中的 3 filters 从 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.
另请参阅:How can I download a specific part of Coco Dataset?
如果您可以使用您自己的数据集训练 YOLO 模型,那就太好了。互联网上有很多关于如何构建自己的数据集的教程。喜欢 this, this, this or this.
注意:减少 类 的数量不会使您的推理速度更快。通过减少 类,您将检测到更少的对象,并且如果您对每次检测进行 post 处理,不知何故可能会使您的程序 运行 更快。
我不得不回到这里来更好地解释为什么我留下了我对另一个答案所做的评论。这样人们就可以直观地了解该解决方案为何不起作用的确切原因。
这里是拍摄市中心街角图像的默认 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 运行 进入某些“未定义行为”领域。
回到最初的问题,请注意 类 的数量增加了 训练 神经网络所需的时间长度,但不会影响应用该神经网络所需的时间长度。
相反,如果您正在寻找性能,请参阅 Darknet/YOLO 常见问题解答。具体来说,这个 FAQ 条目:https://www.ccoderun.ca/programming/darknet_faq/#fps
如果 URL 发生变化或消失,请让我 post 将相关部分放在这里:
How can I increase my FPS? This depends on several things:
- Probably the biggest impact on FPS is the configuration you use. See What configuration file should I use? at the top of this FAQ.
- The network dimensions. The larger the dimensions, the slower it will be. See Does the network have to be perfectly square? at the top of this FAQ.
- Whether your video frames or images need to be resized due to the network dimensions you are using. Resizing video frames is very expensive.
- The hardware you use. Don't attempt to use the CPU. Get a GPU that has CUDA support.
- Whether you are using Darknet+CUDA, or OpenCV DNN+CUDA.
- Prefer the C or C++ API over using Python. ("Statistically, C++ is 400 times faster than Python [...]")
减少 类 数量的唯一真正方法是以这种方式训练它。所以你要么训练你自己的神经网络,要么你下载 MSCOCO 数据集,修改 .names 文件,编辑所有注释以删除你想要的 类,重新编号所有 类 所以他们是顺序并从索引零开始,重新训练整个网络。
免责声明:我是 DarkHelp、DarkMark 和 Darknet/YOLO 常见问题解答的作者。
我正在使用 YOLOv3 检测视频中的汽车。我下载了我的代码 coco.names
、yolov3.cfg
和 yolov3.weights
中使用的三个文件,这些文件针对 80 种不同的 类 待检测对象进行了训练。代码工作但非常慢,每帧需要 5 秒以上。我相信如果我减少 类 的数量,它会 运行 快得多。我可以从coco.names
中删除不需要的类,但不幸的是,我无法理解yolov3.cfg
中的所有内容,甚至无法阅读yolov3.weights
。
本来想训练自己的模型,但是遇到了很多问题,所以放弃了这个想法。
谁能帮我修改这些文件?
对于使用 COCO 数据集的简单方法,请按照以下步骤操作:
- 修改(或复制备份)
darknet\data\coco.names
中的 - 删除所有其他 类 除了 car
- 修改你的cfg文件(例如
yolov3.cfg
),将第610、696、783行的3类从80改为1 - 将第 603、689、776 行的 cfg 文件中的 3 filters 从 255 更改为 18(派生自
(classes+5)x3
) - 运行检测器
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/your_image.jpg
coco.names
文件
要了解更多使用 COCO 数据集的高级方法,您可以使用此 repo 创建基于 voc、coco 或开放图像的 yolo 数据集。 https://github.com/holger-prause/yolo_utils.
另请参阅:How can I download a specific part of Coco Dataset?
如果您可以使用您自己的数据集训练 YOLO 模型,那就太好了。互联网上有很多关于如何构建自己的数据集的教程。喜欢 this, this, this or this.
注意:减少 类 的数量不会使您的推理速度更快。通过减少 类,您将检测到更少的对象,并且如果您对每次检测进行 post 处理,不知何故可能会使您的程序 运行 更快。
我不得不回到这里来更好地解释为什么我留下了我对另一个答案所做的评论。这样人们就可以直观地了解该解决方案为何不起作用的确切原因。
这里是拍摄市中心街角图像的默认 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 运行 进入某些“未定义行为”领域。
回到最初的问题,请注意 类 的数量增加了 训练 神经网络所需的时间长度,但不会影响应用该神经网络所需的时间长度。
相反,如果您正在寻找性能,请参阅 Darknet/YOLO 常见问题解答。具体来说,这个 FAQ 条目:https://www.ccoderun.ca/programming/darknet_faq/#fps
如果 URL 发生变化或消失,请让我 post 将相关部分放在这里:
How can I increase my FPS? This depends on several things:
- Probably the biggest impact on FPS is the configuration you use. See What configuration file should I use? at the top of this FAQ.
- The network dimensions. The larger the dimensions, the slower it will be. See Does the network have to be perfectly square? at the top of this FAQ.
- Whether your video frames or images need to be resized due to the network dimensions you are using. Resizing video frames is very expensive.
- The hardware you use. Don't attempt to use the CPU. Get a GPU that has CUDA support.
- Whether you are using Darknet+CUDA, or OpenCV DNN+CUDA.
- Prefer the C or C++ API over using Python. ("Statistically, C++ is 400 times faster than Python [...]")
减少 类 数量的唯一真正方法是以这种方式训练它。所以你要么训练你自己的神经网络,要么你下载 MSCOCO 数据集,修改 .names 文件,编辑所有注释以删除你想要的 类,重新编号所有 类 所以他们是顺序并从索引零开始,重新训练整个网络。
免责声明:我是 DarkHelp、DarkMark 和 Darknet/YOLO 常见问题解答的作者。