【问题标题】:Detecting small custom object using keras使用 keras 检测小的自定义对象
【发布时间】:2019-12-11 20:50:34
【问题描述】:

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

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

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

【问题讨论】:

  • 对于 yolo,您需要非常高分辨率的训练,这可能会给您带来一些记忆问题。您如何使用分类器方法? “滑动窗口”方法可能会奏效。

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


【解决方案1】:

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

  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 叉计算锚点。 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 算法对其进行训练,然后寻找深度排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 2021-10-18
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多