用于识别图像中对象的对象检测
Object Detection for identifying object in image
我想检测图片内容,我需要做的是
判断图像是衬衫还是裤子。
图片 1
图片 2
如果我提供T恤的图片那么
基于比较形状,我需要给定图像是 T 恤的结果
我尝试的是 Harr 级联,但它没有给出正确的输出。而且对于这个样本量来说,要求的太大
假设您只想分离仅包含感兴趣对象的图像,您可以使用 BOW(视觉词袋),其中将图像呈现为一组特征,然后使用 SVM 或任何其他分类器对其进行分类。
您还可以使用特征检测器+描述符+分类器(例如SURF + SVM)。
虽然现在有更强大和更快的特征检测器......
为了避免训练过程,您甚至可以尝试使用模板匹配(每个大纲)。
提供了一种这样的算法:
Fast template matching - Codeproject
Haar 级联也用于包含其他内容的图像中的对象检测,因为它采用滑动 window 检测 + 它包含在性能和鲁棒性之间进行权衡的阶段 - 它们速度很快,但是有些对象可能会被遗漏,因为每个阶段都容易出现累积的漏分类错误。
如果您的图像包含已分割的对象,如您的示例所示,您可以创建一个二值图像,在其中指示对象与背景像素。
之后,假设物体一般不会旋转或扭曲,就可以使用简单的特征来进行分类。例如,对于上述情况,只需计算有 2 次前景像素的扫描线的百分比。对于衬衫,这应该是一个低值,对于裤子,它应该是高值。
显然,如果给定的示例图像不能代表您实际尝试解决的问题,那么这将行不通。
编辑:一些示例 matlab 代码:
function ratio=TwoRunFeature(I)
g=rgb2gray(I);
b=imdilate(g<255,ones(5));
d=abs(imfilter(b,[-1 1]));
runs=sum(d,2);
ratio=sum(runs==2) / sum(runs==1);
end
function TestImage(name)
I=imread(name);
fprintf('%s: %f\n',name,TwoRunFeature(I));
end
TestImage('pants.jpg');
TestImage('shirt.jpg');
打印:
pants.jpg: 1.947977
shirt.jpg: 0.068627
裤子的号码高,衬衫的号码低。只需在您想要的任何地方设置阈值即可。
我假设这两张图片来自您的数据库。
根据我的经验,由于分割或将背景设置为单色,在此类图像上应用特征(局部描述符)将创建一种人工特征。在您的案例中,第二个要点是这些图像可能具有不同的颜色或纹理,并且大多数检测到的特征将来自对象内的区域。这些区域并不重要,与分类无关。
但是有了分割图像应该会使问题变得容易得多。
针对您的案例的最佳和最简单的解决方案:
1. 将图像转换为灰度,然后通过阈值化转换为二值。
2. 将图像反转,背景为黑色,物体为白色。
3. 填充孔洞:如果对象内图像的任何部分是白色的,这将导致孔洞。
4. 现在只检测边界。
通过 I = 扩张的 IBinary - IBinary
5.采样边界:
Select 每个 window 大小为 4x4 的像素中只有一个非零像素
6. 下一步是使用 Shape context descriptor : 来描述你的图像。
7. 通过使用bag of visual words 或 sparse coding ,重新表示图像。
8. 最大池化以获得丰富的表示。
9- 支持向量机
您要找的就是这个。
它将帮助您解决问题
我想检测图片内容,我需要做的是 判断图像是衬衫还是裤子。
图片 1
图片 2
如果我提供T恤的图片那么 基于比较形状,我需要给定图像是 T 恤的结果
我尝试的是 Harr 级联,但它没有给出正确的输出。而且对于这个样本量来说,要求的太大
假设您只想分离仅包含感兴趣对象的图像,您可以使用 BOW(视觉词袋),其中将图像呈现为一组特征,然后使用 SVM 或任何其他分类器对其进行分类。
您还可以使用特征检测器+描述符+分类器(例如SURF + SVM)。 虽然现在有更强大和更快的特征检测器......
为了避免训练过程,您甚至可以尝试使用模板匹配(每个大纲)。 提供了一种这样的算法: Fast template matching - Codeproject
Haar 级联也用于包含其他内容的图像中的对象检测,因为它采用滑动 window 检测 + 它包含在性能和鲁棒性之间进行权衡的阶段 - 它们速度很快,但是有些对象可能会被遗漏,因为每个阶段都容易出现累积的漏分类错误。
如果您的图像包含已分割的对象,如您的示例所示,您可以创建一个二值图像,在其中指示对象与背景像素。
之后,假设物体一般不会旋转或扭曲,就可以使用简单的特征来进行分类。例如,对于上述情况,只需计算有 2 次前景像素的扫描线的百分比。对于衬衫,这应该是一个低值,对于裤子,它应该是高值。
显然,如果给定的示例图像不能代表您实际尝试解决的问题,那么这将行不通。
编辑:一些示例 matlab 代码:
function ratio=TwoRunFeature(I)
g=rgb2gray(I);
b=imdilate(g<255,ones(5));
d=abs(imfilter(b,[-1 1]));
runs=sum(d,2);
ratio=sum(runs==2) / sum(runs==1);
end
function TestImage(name)
I=imread(name);
fprintf('%s: %f\n',name,TwoRunFeature(I));
end
TestImage('pants.jpg');
TestImage('shirt.jpg');
打印:
pants.jpg: 1.947977
shirt.jpg: 0.068627
裤子的号码高,衬衫的号码低。只需在您想要的任何地方设置阈值即可。
我假设这两张图片来自您的数据库。 根据我的经验,由于分割或将背景设置为单色,在此类图像上应用特征(局部描述符)将创建一种人工特征。在您的案例中,第二个要点是这些图像可能具有不同的颜色或纹理,并且大多数检测到的特征将来自对象内的区域。这些区域并不重要,与分类无关。 但是有了分割图像应该会使问题变得容易得多。 针对您的案例的最佳和最简单的解决方案: 1. 将图像转换为灰度,然后通过阈值化转换为二值。 2. 将图像反转,背景为黑色,物体为白色。 3. 填充孔洞:如果对象内图像的任何部分是白色的,这将导致孔洞。 4. 现在只检测边界。 通过 I = 扩张的 IBinary - IBinary 5.采样边界: Select 每个 window 大小为 4x4 的像素中只有一个非零像素 6. 下一步是使用 Shape context descriptor : 来描述你的图像。 7. 通过使用bag of visual words 或 sparse coding ,重新表示图像。 8. 最大池化以获得丰富的表示。 9- 支持向量机
您要找的就是这个。 它将帮助您解决问题