haar级联正例图像大小调整
haar cascade positive example image sizing
我正在迈出为自定义对象识别制作 haar 级联的第一步。我花了一些时间获取大量数据并编写了一些预处理脚本以将视频转换为帧。我的下一步是裁剪感兴趣的对象,以创建一些积极的训练示例。我有几个问题,我确实在网上四处寻找答案 - 我有点困惑:-
我读到我的目标应该是保持纵横比相同 - 这是否意味着与原始帧相同,或者对于我想用于正面训练示例的所有图像(即来自完全不同视频的帧)
尺寸 - 纵横比和尺寸显然不一样。因此,我是否需要再次确保我的阳性样本的高度和宽度都相同(我很确定它们应该是,但认为值得仔细检查)。
同样在尺寸方面——我遇到过一些推荐 24 x 24 H x W 的博客——如果我想要检测的对象不是正方形(在我的例子中它是一个矩形,高度大约是例如塑料瓶的宽度加倍)。我是保持尺寸不变还是应该将其转换为 24 x 24?
负样本 - 这些都应该具有相同的纵横比和/或大小吗?
我知道这可能是一个非常低级/愚蠢的问题,但目前还不清楚这里的最佳实践是什么!
我在这里遇到了其他几个答案,但我觉得他们没有提供令人满意的答案,而且该领域在过去几年中取得了长足的进步
谢谢
正样本生成在一个.vec文件中,这是训练所需要的。 createsamples 二进制文件将创建这样一个 .vec 文件,并自动将您定义的对象区域(在 .txt 文件中定义)缩放为目标格式。您所有的正样本对象区域应该具有大致相同的纵横比(否则自动缩放会破坏它们)。
目标大小应该是你想要检测物体的最小尺寸(但如果太小,就不会有相关的特征了),它的纵横比应该是你的物体区域的纵横比。
例如:你有很多带杯子的图片。图像分辨率各不相同,但每个杯子的纵横比(只有图像中的杯子区域,而不是所有背景)是一个 out 1:2(宽度:高度)。因此,您要么裁剪所有图像以仅容纳杯子和最小背景,然后将整个裁剪图像写入 txt 文件,然后 post 那里裁剪图像的全尺寸 roi,或者您 select ROI杯子,将全尺寸图像添加到 txt 文件和 post 那里的 roi 区域。您 select 目标大小,如 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)。最好编写一个脚本或工具来修复标记的输入图像中的纵横比,因此不使用完美的纵横比标记对象会更容易、更直观,而是按原样标记它们 post通过调整 ROI 以适应宽高比来进行处理(如有必要,在 left/right 或 top/bottom 处添加一些额外的背景)。或者忽略纵横比差异,如果一些变形对你来说没问题。
我正在迈出为自定义对象识别制作 haar 级联的第一步。我花了一些时间获取大量数据并编写了一些预处理脚本以将视频转换为帧。我的下一步是裁剪感兴趣的对象,以创建一些积极的训练示例。我有几个问题,我确实在网上四处寻找答案 - 我有点困惑:-
我读到我的目标应该是保持纵横比相同 - 这是否意味着与原始帧相同,或者对于我想用于正面训练示例的所有图像(即来自完全不同视频的帧)
尺寸 - 纵横比和尺寸显然不一样。因此,我是否需要再次确保我的阳性样本的高度和宽度都相同(我很确定它们应该是,但认为值得仔细检查)。
同样在尺寸方面——我遇到过一些推荐 24 x 24 H x W 的博客——如果我想要检测的对象不是正方形(在我的例子中它是一个矩形,高度大约是例如塑料瓶的宽度加倍)。我是保持尺寸不变还是应该将其转换为 24 x 24?
负样本 - 这些都应该具有相同的纵横比和/或大小吗?
我知道这可能是一个非常低级/愚蠢的问题,但目前还不清楚这里的最佳实践是什么!
我在这里遇到了其他几个答案,但我觉得他们没有提供令人满意的答案,而且该领域在过去几年中取得了长足的进步
谢谢
正样本生成在一个.vec文件中,这是训练所需要的。 createsamples 二进制文件将创建这样一个 .vec 文件,并自动将您定义的对象区域(在 .txt 文件中定义)缩放为目标格式。您所有的正样本对象区域应该具有大致相同的纵横比(否则自动缩放会破坏它们)。
目标大小应该是你想要检测物体的最小尺寸(但如果太小,就不会有相关的特征了),它的纵横比应该是你的物体区域的纵横比。
例如:你有很多带杯子的图片。图像分辨率各不相同,但每个杯子的纵横比(只有图像中的杯子区域,而不是所有背景)是一个 out 1:2(宽度:高度)。因此,您要么裁剪所有图像以仅容纳杯子和最小背景,然后将整个裁剪图像写入 txt 文件,然后 post 那里裁剪图像的全尺寸 roi,或者您 select ROI杯子,将全尺寸图像添加到 txt 文件和 post 那里的 roi 区域。您 select 目标大小,如 20x40 或 10x20 或任何您认为可以训练的 1:2 纵横比。
负样本应该保持原样,训练会自动选择和搜索这些样本的子图像。只需确保其中没有杯子(根据示例)。
我通过在正样本中的对象上绘制黑框并将生成的图像也用作负样本来获得一些不错的结果,以获得更多的负样本,但这可能取决于您的特殊任务。
作为一个更具体的例子,我从维基媒体上截取了两张杯子图片。
1.
第一张图片有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)。最好编写一个脚本或工具来修复标记的输入图像中的纵横比,因此不使用完美的纵横比标记对象会更容易、更直观,而是按原样标记它们 post通过调整 ROI 以适应宽高比来进行处理(如有必要,在 left/right 或 top/bottom 处添加一些额外的背景)。或者忽略纵横比差异,如果一些变形对你来说没问题。