首页 > 解决方案 > 使用 keras 检测小的自定义对象

问题描述

我想使用神经网络检测图像(大约 1200x900)中的小物体(9x9 像素)。在网上搜索,我发现了几个网页,其中包含用于自定义对象分类的自定义层的 keras 代码。在这种情况下,我知道您需要提供单独的对象的图像。尽管训练很好并且可以正确分类它们,但不幸的是,我还没有找到以后如何加载这个训练有素的网络来在我的大图像中查找对象。

另一方面,我发现如果我从 Yolov3 网络加载权重,我可以使用 cv 中的 cnn 类来做到这一点。在这种情况下,我为大图像提供了适当的注释,但网络没有经过良好的训练......

鉴于这种情况,有人可以告诉我如何在 cnn 中加载使用定制网络训练的权重,以及如何训练该 nrtwork?

标签: pythonopencvkerasneural-networkobject-detection

解决方案


经过大量搜索,我找到了更好的方法:

  1. 将您的图像剪切为子图像(我将其剪切为 2 行和 4 列)。
  2. 用这些子图像及其正确的注释来喂 yolo。我使用了 yolov3 tiny,尺寸为 960x960,10k 步。就我而言,强度和颜色很重要,因此色调、饱和度和曝光等随机参数保持在 0。使用随机角度。如果您的对象大小没有变化,请在 yolo 层禁用 random(cfg 文件中的 random=0。它只会随机化它在每一步中更改训练大小的事实)。为此,我正在使用 Alexey 暗网叉。如果您有一些模糊对象,请在 cfg 文件的 [net] 属性中添加 blur=1(在色相之后)。对于模糊,您需要 Alexey fork 并使用 opencv 进行编译(如果可以,请从 cuda 进行)。
  3. 使用 Alexey fork 计算锚点。Cluster_num 是您使用的锚对数。您可以通过打开 cfg 并查看任何 anchors= 行来了解它。锚点是暗网用来预测位置的框的大小。Cluster_num = 锚对的数量。
  4. 用你的新锚改变 cfg。如果您有固定大小的对象,则锚点的大小将非常接近。我把那些留得更大(第一层 yolo 层),但第二层,小的,我修改了,我什至去掉了一对。如果删除一些,则更改掩码 [yolo] 中的顺序(在所有 [yolo] 中)。掩码是指锚的索引,从 0 索引开始。如果删除一些,还要更改 [yolo] 中的 num=。
  5. 之后,检测非常好。如果您在视频上检测,可能会发生某些帧中丢失的对象。您可以尝试使用 lstm cfg 来避免这种情况。https://github.com/AlexeyAB/darknet/issues/3114

现在,如果您还想跟踪它们,您可以使用 yolo 预训练网络应用深度排序算法。例如,您可以使用https://github.com/allanzelener/YAD2K将您的预训练网络转换为 keras (为 tiny yolov3 添加此提交https://github.com/allanzelener/YAD2K/pull/154/commits/e76d1e4cd9da6e177d7a9213131bb688c254eb20)然后使用https://github.com/Qidian213/deep_sort_yolov3

作为替代方案,您可以使用 mask-rcnn 或任何其他更快的 rcnn 算法对其进行训练,然后寻找深度排序。


推荐阅读