使用keras检测小型自定义对象

时间:2019-08-03 15:44:18

标签: python opencv keras neural-network object-detection

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

另一方面,我发现,如果我从Yolov3 netwrok加载了weigth,则可以在cv中使用cnn类来完成此操作。在这种情况下,我会为大图像提供适当的注释,但网络的训练不足...

在这种情况下,有人可以向我展示如何在使用自定义网络训练的CNN中加载weigth,以及如何训练nrtwork吗?

1 个答案:

答案 0 :(得分:1)

经过大量搜索,我发现了一种更好的方法:

  1. 将图像剪切为子图像(我将其剪切为2行4列)。
  2. 使用这些子图像及其适当的注释来填充yolo。我使用yolov3 tiny,大小为960x960,可进行10k步操作。在我的情况下,强度和颜色很重要,因此将诸如色调,饱和度和曝光度之类的随机参数保持为0。使用随机角度。如果您的对象的大小没有变化,请在yolo层禁用随机(cfg文件中的random = 0。它只是随机化了它会在每个步骤中调整大小的事实)。为此,我使用了Alexey darknet fork。如果您有一些模糊对象,请在cfg文件的[net]属性中添加blur = 1(在色相之后)。对于模糊,您需要Alexey fork并使用opencv进行编译(如果可以,请使用cuda的appart)。
  3. 用Alexey叉计算锚点。 Cluster_num是您使用的锚点对数。您可以通过打开cfg并查看任何anchors =行来了解这一点。锚点是Darknet用来预测位置的盒子的大小。 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(将提交提交添加到微小的yolov3 https://github.com/allanzelener/YAD2K/pull/154/commits/e76d1e4cd9da6e177d7a9213131bb688c254eb20中),然后使用https://github.com/Qidian213/deep_sort_yolov3

将预先训练的网络转换为keras。

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