这更像是一般的"我在哪里可以找到好的资源来做某事"的问题。我正在尝试使用Python (OpenCV或其他)基于训练集对图像进行分类。
我的训练集:这是由大量的产品缺陷图像组成的。每张图像可以在产品上的3个位置中的1个位置拍摄,每张图像将包含5种产品缺陷类型中的1种。缺陷已经由人工进行了分类和验证。
分类图像:这些是由相似的图像组成,在相同的3个位置拍摄,但缺陷的类型没有分类(虽然拍摄图像的工具识别出缺陷区域,但只是工具没有正确分类,我无法更换工具)。
我尝试按照《用Python编程计算机视觉:分析图像的工具和算法》一书中的建议进行这种分类。在这种情况下,我使用了存储在mySQL数据库(训练数据)中的SIFT描述符。到目前为止,我没有太多的运气(我继续排除故障),我想我应该向任何OpenCV专家寻求建议。
如有推荐人或建议,不胜感激。 所以,回到这个问题,我认为这将是值得分享我所学到的。我不知道这是不是"答案",但这就是我的结局。一个正在进行的工作,你总是可以变得更好。我现在的解决方案是结合3种不同的方法。所有这些都可以在互联网上搜索到,所以我不会详细说明如何搜索。
首先,我使用了SIFT方法,使用命令行调用VLFeat生成SIFT直方图。这可能是Python中其他地方的选项,我就是这么用的。我使用k-means聚类来做视觉词汇袋的事情,并建立了一个数据库,将质心与与训练图像相关的单词直方图联系起来。通过添加一个Root SIFT步骤,我稍微改进了一下结果。然后,我使用Dense SIFT创建了一个单独的数据库(但没有根SIFT调整)。最后,我基于训练图像的RGB成分创建了一个颜色直方图数据库。我没有使用所有256个RGB箱,而是将单个R,G和B值加在8个箱上,然后将值扁平化为24个箱的直方图。
对未知图像进行相同的处理,然后使用欧几里得距离比较直方图向量。我也尝试过平方比较,但在我的情况下,欧几里得提供了更好的结果。我从每个过程中获得前3名的结果,并根据9票中的5票进行图像分类。如果没有达到多数,那么分析是不确定的。
对于我的封闭图像群,我的误分类率为3.1%,不确定率为3.1%。
我研究了使用特征袋(BoF)和支持向量机的图像分类问题。我是用c++和OpenCV做的,但我相信你也可以在python上得到类似的方法。
概念:
创建BoF字典:
- 从你的训练样本中取一张图像。
- 提取SIFT关键点 提取SIFT描述符
- 使用k-means聚类对描述符进行聚类
- 创建BoF字典(参考我在下面提到的链接)
培训:
- 加载BoF字典
- 用上面的BoF字典初始化BoF实例
- 从你的训练样本中取一张图像。
- 提取SIFT关键点
- 为提取的关键点查找BoF描述符
- 使用此BoF描述符进行SVM学习
- 对所有训练图像执行上述步骤
- 您将获得.xml格式的SVM分类器文件…保存它
测试:
- 加载SVM分类器 用上面创建的.xml文件初始化SVM分类器<
- 捕捉图像/gh>
- 使用字典查找捕获图像的BoF描述符
- 使用这些BoF描述符使用SVM进行分类
你可以参考这篇文章
您可以尝试通过上传您的训练数据(有缺陷,没有缺陷)来构建模型demo.nanonets.ai(免费使用)
1)上传你的训练数据到这里:
demo.nanonets.ai
2)然后使用以下代码(Python代码)查询API:
import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "http://anzalonelawcolorado.com/wp-content/uploads/2013/10/product.jpg"
files = {'uploadfile': urllib.urlopen(url).read()}
url = "http://demo.nanonets.ai/classify/?appId="+model_name
r = requests.post(url, files=files)
print json.loads(r.content)
3)响应如下:
{
"message": "Model trained",
"result": [
{
"label": "Defective",
"probability": 0.97
},
{
"label": "Not Defective",
"probability": 0.03
}
]
}
在Theano中实现CNN可能会比在OpenCV中实现更好的结果。如果你在Google scholar上搜索,有大量关于使用cnn进行图像分类的论文——这些方法中的大多数应该不难用Theano实现。