基于训练集的OpenCV(Python)图像分类

这更像是“我在哪里可以找到做某事的好资源”的问题.我试图使用
Python(OpenCV或其他)基于训练集对图像进行分类.

我的训练集:这是由许多产品缺陷图像组成的.每张图像可以在产品上的3个位置中的1个位置拍摄,每个图像将包含5种类型的产品缺陷中的1种.这些缺陷已经由人工分类和验证.

要分类的图像:这些图像由相似的图像组成,在相同的3个位置拍摄,但缺陷的类型未被分类(虽然缺陷区域是由工具识别的图片识别,但只是工具没有正确地对它们进行分类我无法改变工具).

我按照“使用Python编程计算机视觉:用于分析图像的工具和算法”一书中的建议尝试进行此分类.在这种情况下,我使用存储在mySQL数据库(训练数据)中的SIFT描述符进行Bag of Words方法.到目前为止,我没有太多的运气(我继续排除故障),并认为我会向那里的任何OpenCV专家寻求建议.

任何参考或建议将不胜感激.

所以,回到这个问题,我认为值得分享我所学到的东西.我不知道这是“答案”,但这是我最终的结果.正在进行的工作,你总能变得更好.

我现在的解决方案是结合3种不同的方法.所有这些都可以在互联网上搜索到,所以我不会详细介绍如何.

首先,我使用SIFT方法,使用对VLFeat的命令行调用生成SIFT直方图.这可能是Python中其他地方的一个选项,它就是我使用的.我使用k-means聚类来做词汇词汇的视觉包,并建立了一个数据库,将质心与训练图像相关的单词直方图联系起来.我通过添加Root SIFT步骤改进了一些结果.然后我使用Dense SIFT创建了一个单独的数据库(但没有Root SIFT调整).最后,我根据训练图像的RGB分量创建了一个颜色直方图数据库.我没有使用所有256个RGB区域,而是将8个区间内的R,G和B值相加,然后将这些值展平为24 bin直方图.

对未知图像进行相同的处理,然后使用欧几里德距离比较直方图矢量.我也尝试了Chi Squared比较,但在我看来,Euclidean提供了更好的结果.我从每个过程中获得前3个结果,图像分类基于9投票中的5个.如果未达到多数,则分析是不确定的.

对于我封闭的图像群体,我的误分类率为3.1%,不确定率为3.1%.

最佳答案 我使用Bag of features(BoF)和SVM研究了图像分类问题.我是用C和OpenCV做的,但我确信你也可以得到类似python的方法.

概念:

创建BoF词典:

>从训练样本中拍摄一张图像.
>提取SIFT关键点
>提取SIFT描述符
>使用k-means聚类来聚类描述符
>创建BoF字典(请参阅下面提到的链接)

训练:

>加载您的BoF字典
>使用上面的BoF字典初始化您的BoF实例
>从训练样本中拍摄一张图像.
>提取SIFT关键点
>为提取的关键点查找BoF描述符.
>使用此BoF描述符进行SVM学习
>对所有训练图像执行上述步骤
>您将获得.xml格式的SVM分类器文件…保存

测试:

>加载SVM分类器
>使用您在上面创建的.xml文件初始化SVM分类器
>捕获图像
>使用字典查找捕获图像的BoF描述符
>使用这些BoF描述符使用SVM对其进行分类

你可以参考这个article

点赞