使用keras检测小型自定义对象
Detecting small custom object using keras
我想使用神经网络检测图像(大约 1200x900)中的小物体(9x9 像素)。在网上搜索,我发现了几个带有 keras 代码的网页,这些网页使用自定义对象的自定义图层 classification。在这种情况下,我了解到您需要提供只有您的对象的图像。尽管训练很好并且 class 正确地对它们进行了验证,但不幸的是我还没有找到稍后如何加载这个经过训练的网络来在我的大图像中查找对象的方法。
另一方面,我发现如果我从 Yolov3 网络加载权重,我可以使用 cv 中的 cnn class 来做到这一点。在这种情况下,我为大图像提供了适当的注释,但网络没有经过良好训练...
鉴于这种情况,有人可以告诉我如何在 cnn 中加载使用自定义网络训练的权重以及如何训练该 nrtwork 吗?
经过大量搜索,我找到了更好的方法:
- 将您的图像剪切成子图像(我将其剪切成 2 行 4 列)。
- 为 yolo 提供这些子图像及其适当的注释。我使用 yolov3 tiny,大小为 960x960,步长为 10k。在我的例子中,强度和颜色很重要,因此色调、饱和度和曝光度等随机参数保持为 0。使用随机角度。如果您的对象大小不变,请在 yolo 层禁用随机(cfg 文件中的 random=0。它只会随机化它在每一步中更改训练大小的事实)。为此,我正在使用 Alexey 暗网叉。如果您有一些模糊对象,请在 cfg 文件的 [net] 属性中添加 blur=1(在 hue 之后)。对于模糊,您需要 Alexey fork 并使用 opencv 进行编译(如果可以的话,来自 cuda 的应用程序)。
- 用 Alexey fork 计算锚点。 Cluster_num 是您使用的锚点对数。您可以通过打开您的 cfg 并查看任何 anchors= 行来了解它。锚点是暗网用来预测位置的框的大小。 Cluster_num = 锚点对的数量。
- 用你的新锚改变 cfg。如果您有固定大小的对象,锚点的大小将非常接近。我把那些留给更大的(第一个 yolo 层)但是对于第二个,我修改了 tinies,甚至删除了一对。如果删除一些,则更改掩码 [yolo] 中的顺序(在所有 [yolo] 中)。 Mask 指的是锚点的索引,从 0 索引开始。如果删除一些,还要更改 [yolo].
中的 num=
- 之后,检测相当 good.It 如果您在视频上检测到某些帧中丢失了对象,则可能会发生这种情况。您可以尝试使用 lstm cfg 来避免这种情况。 https://github.com/AlexeyAB/darknet/issues/3114
现在,如果您还想跟踪它们,可以在您的 yolo 预训练网络中应用深度排序算法。例如,您可以使用 https://github.com/allanzelener/YAD2K (add this commit for tiny yolov3 https://github.com/allanzelener/YAD2K/pull/154/commits/e76d1e4cd9da6e177d7a9213131bb688c254eb20) and then use https://github.com/Qidian213/deep_sort_yolov3
将预训练网络转换为 keras
作为替代方案,您可以使用 mask-rcnn 或任何其他更快的 rcnn 算法对其进行训练,然后寻找深度排序。
我想使用神经网络检测图像(大约 1200x900)中的小物体(9x9 像素)。在网上搜索,我发现了几个带有 keras 代码的网页,这些网页使用自定义对象的自定义图层 classification。在这种情况下,我了解到您需要提供只有您的对象的图像。尽管训练很好并且 class 正确地对它们进行了验证,但不幸的是我还没有找到稍后如何加载这个经过训练的网络来在我的大图像中查找对象的方法。
另一方面,我发现如果我从 Yolov3 网络加载权重,我可以使用 cv 中的 cnn class 来做到这一点。在这种情况下,我为大图像提供了适当的注释,但网络没有经过良好训练...
鉴于这种情况,有人可以告诉我如何在 cnn 中加载使用自定义网络训练的权重以及如何训练该 nrtwork 吗?
经过大量搜索,我找到了更好的方法:
- 将您的图像剪切成子图像(我将其剪切成 2 行 4 列)。
- 为 yolo 提供这些子图像及其适当的注释。我使用 yolov3 tiny,大小为 960x960,步长为 10k。在我的例子中,强度和颜色很重要,因此色调、饱和度和曝光度等随机参数保持为 0。使用随机角度。如果您的对象大小不变,请在 yolo 层禁用随机(cfg 文件中的 random=0。它只会随机化它在每一步中更改训练大小的事实)。为此,我正在使用 Alexey 暗网叉。如果您有一些模糊对象,请在 cfg 文件的 [net] 属性中添加 blur=1(在 hue 之后)。对于模糊,您需要 Alexey fork 并使用 opencv 进行编译(如果可以的话,来自 cuda 的应用程序)。
- 用 Alexey fork 计算锚点。 Cluster_num 是您使用的锚点对数。您可以通过打开您的 cfg 并查看任何 anchors= 行来了解它。锚点是暗网用来预测位置的框的大小。 Cluster_num = 锚点对的数量。
- 用你的新锚改变 cfg。如果您有固定大小的对象,锚点的大小将非常接近。我把那些留给更大的(第一个 yolo 层)但是对于第二个,我修改了 tinies,甚至删除了一对。如果删除一些,则更改掩码 [yolo] 中的顺序(在所有 [yolo] 中)。 Mask 指的是锚点的索引,从 0 索引开始。如果删除一些,还要更改 [yolo]. 中的 num=
- 之后,检测相当 good.It 如果您在视频上检测到某些帧中丢失了对象,则可能会发生这种情况。您可以尝试使用 lstm cfg 来避免这种情况。 https://github.com/AlexeyAB/darknet/issues/3114
现在,如果您还想跟踪它们,可以在您的 yolo 预训练网络中应用深度排序算法。例如,您可以使用 https://github.com/allanzelener/YAD2K (add this commit for tiny yolov3 https://github.com/allanzelener/YAD2K/pull/154/commits/e76d1e4cd9da6e177d7a9213131bb688c254eb20) and then use https://github.com/Qidian213/deep_sort_yolov3
将预训练网络转换为 keras作为替代方案,您可以使用 mask-rcnn 或任何其他更快的 rcnn 算法对其进行训练,然后寻找深度排序。