我迈出了为自定义对象识别制作haar级联的第一步。我花时间获得了相当多的数据并编写了一些预处理脚本来将视频转换为帧。我的下一步是裁剪interes的对象,以创建一些积极的训练示例。我有几个问题,我真的在网上寻找答案 - 我有点困惑: -
我读到我的目标应该是保持纵横比相同 - 这是否与我想用于正面训练示例的所有图像的原始帧OR相同(即来自完全不同视频的帧)
尺寸 - 纵横比和尺寸明显不一样。所以我需要确保我的正面样本的高度和宽度都相同(我非常确定它们应该是但是值得仔细检查)。
同样在大小方面 - 我遇到过一些博客推荐例如24 x 24 H x W - 如果我想要检测的对象不是正方形(在我的情况下,它是一个高度约为其两倍的矩形)塑料瓶的宽度)。我是否保持相同的尺寸或者我应该将其转换为24 x 24?
负样品 - 这些样品的长宽比和/或尺寸是否相同?
我知道这可能是一个非常低级/愚蠢的问题,但是目前还不清楚最佳做法是什么!
我在这里遇到了其他几个答案,但我觉得他们没有提供令人满意的答案,而且这个领域在过去几年中已经取得了显着进展
由于
答案 0 :(得分:4)
正样本在.vec文件中生成,这是培训所需的。 createsamples binary将创建这样的.vec文件,并自动将定义的对象区域(在.txt文件中定义)扩展为目标格式。所有正样本对象区域应具有大致相同的宽高比(因为自动缩放会破坏它们)。
目标大小应该是您想要检测对象的mimimun大小(但如果太小则不再是相关的特征),其宽高比应该是对象区域的宽高比。
例如:你有很多带杯子的图像。图像分辨率会有所不同,但每个杯子的纵横比(仅图像中的杯子区域,而不是所有背景)都是1:2(宽度:高度)。因此,您要么裁剪所有图像,只保留杯子和最小背景,并将整个裁剪图像写入txt文件并在那里发布裁剪图像的全尺寸roi,或者选择杯子的ROI,添加完整尺寸将图像映射到txt文件并在那里发布该roi区域。您可以选择目标尺寸,例如20x40或10x20或您认为可以训练的1:2纵横比。
阴性样本应保持原样,训练将自动选择并搜索这些样本的子图像。只需确保其中没有杯子(根据示例)。
我通过在正样本中的对象上绘制黑框并使用生成的图像作为负样本来获得更好的结果,以获得更多负面样本,但这可能取决于您的特殊任务。
作为一个更具体的例子,我从维基媒体拍摄了两张照片。 1. 2.
第一张图片中有1个杯子,第二张图片中有2个杯子。我选择在训练期间不使用手柄,选择长宽比为0.85(1:1.176 w:h) 现在,您可以选择将ROI写入.txt文件,例如
image1.jpg 1 653 154 1295 1523
image2.jpg 2 1068 406 1551 1824 3036 1159 852 1004
然后创建一个这样的txt文件:
cropped_image1_cup1.jpg 1 0 0 1295 1523
cropped_image2_cup1.jpg 1 0 0 1551 1824
cropped_image2_cup2.jpg 1 0 0 852 1004
两者都应该创建相同的.vec文件(如果裁剪没有创建任何工件,如额外的jpeg压缩 - 更好地使用png;)。
然后,您可以选择目标大小为20x24(宽高比1:1.2)。最好编写一个脚本或工具来修复标记输入图像中的纵横比,因此不用标记完美纵横比的对象就更容易,更直观,但是按照它们标记它们并通过调整ROI进行后处理适合纵横比(如有必要,在左/右或上/下添加一些额外的背景)。或者忽略宽高比差异,如果你有一些变形可以。