YOLO并调整自定义数据集的锚箱数

时间:2018-06-05 20:53:22

标签: tensorflow keras object-detection convolutional-neural-network yolo

我正致力于在自定义数据集上实现YOLO v2和3以进行对象检测。虽然YOLO v2和3使用了大约5个左右的锚箱,但我通常每个图像可能有50-100个检测器。我的感觉是,如果只有5个锚箱,那么每个图像最多有5个检测器吗?所以我试图理解我是否需要调整锚点数量到我的数据集。

我的问题是,锚箱的数量是否需要大于任何训练图像中最大边界框的数量?这样,我就不会遇到没有相应的检测锚箱。这是考虑改编YOLO的正确方法吗?

如果我的直觉是正确的,那么我是否需要做k-means来聚集地面实况图像中的边界框并设置锚框坐标。然后我将使用此blog post中指定的常用回归方法。

感谢任何人提供的任何帮助。

2 个答案:

答案 0 :(得分:4)

  

我的感觉是,如果只有5个锚箱,那么每张图片最多可检测5个?

每个预测单元有五个锚框,而不是整个图像。让我们考虑Yolo v2,其中输入图像的大小为\documentclass{article} \usepackage{fullpage} \begin{document} <<include = FALSE>>= knitr::opts_chunk$set(collapse = FALSE) @ <<>>= library(subprocess) # define a function to identify the R binary R_binary <- function () { R_exe <- ifelse (tolower(.Platform$OS.type) == "windows", "R.exe", "R") return(file.path(R.home("bin"), R_exe)) } @ <<>>= # Start a subprocess running vanilla R. subR <- subprocess::spawn_process(R_binary(), c("--vanilla --quiet")) Sys.sleep(2) # wait for the process to spawn # write to the process subprocess::process_write(subR, "y <- rnorm(100, mean = 2)\n") subprocess::process_write(subR, "summary(y)\n") # read from the process subprocess::process_read(subR, PIPE_STDOUT) # kill the process before moving on. subprocess::process_kill(subR) @ <<>>= print(sessionInfo(), local = FALSE) @ \end{document} ,输出为416x416x3。 13x13中的每一个对应于输入图像中的32x32单元区域(如博客文章下面的图像所示),并且对于13x13单元中的每一个,定义了5个锚点。因此,技术上可以为尺寸为416x416的图像设置13x13x5边界框(您可以使用更大的图像进行训练,因为yolo v2是完全卷积网络,然后您可以获得更多的单元区域)。 enter image description here

假设您的图像中有50个边界框,应根据边界框中心与单元格中心的距离将每个边界框分配给一个单元格。现在为这个单元格选择5个锚箱中的一个,它给出了最好的IOU。对于每个单元格构造,应包含所有5个锚框的置信度分数和框位置和尺寸的标签(选择的锚框除外,其他将标记为零)以及类别分数。

在链接中提到的k-means聚类中,它描述了它们如何到达五个锚箱。最好只使用5个边界框,除非你有任何特定的理由要包含更多或有不同的形状,如果出现任何特定要求。

答案 1 :(得分:3)

锚定框的数量 partilly 影响检测到的框的数量。

YOLOv2的输出具有形状(13,13,B *(5 + C)),其中 B是锚点框的数量,C是您要尝试的类的数量检测。因此,输出具有13 * 13 = 169个网格单元格。您可以将它们视为输入图像按13乘13单元的划分。

每个网格单元最多可以检测到 B个物体或邦定盒。网格单元检测到的绑定盒的数量取决于其信心值。网格单元的每个B边界框的置信度在0到1之间。如果框的置信度大于阈值,则网络最终会告诉我们框(或对象)被检测到

假设网格单元具有以下置信度值,并且阈值为0.1。

[0.02,0.3,0.001,0.9,0.03](B = 5)

在这种情况下,此网格单元将检测2个盒子,并以较小的置信度丢弃其他3个盒子。

因此,如果您想减少检测到的盒子的数量,我建议您增加阈值

The output of the network looks like this. There are 13x13 = 169 grid cells in total, and each grid cell can detect up to B bounding boxes. One bounding box has 5 + C properties, therefore a grid cell has D = Bx(5+C) values (this is depth).