基于训练集

时间:2015-07-14 18:42:00

标签: python opencv

这更通用"我在哪里找到做某事的好资源"题。我试图使用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%。

3 个答案:

答案 0 :(得分:7)

我使用Bag of features(BoF)和SVM解决了图像分类问题。我是用C ++和OpenCV做的,但我确信你也可以为python获得类似的方法。

<强>概念

创建BoF词典:

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

    1. 加载您的BoF词典
    2. 使用上述BoF字典初始化您的BoF实例
    3. 从训练样本中拍摄一张图片。
    4. 提取SIFT关键点
    5. 查找提取的关键点的BoF描述符。
    6. 将此BoF描述符用于SVM学习
    7. 对所有训练图像执行上述步骤
    8. 您将获得.xml格式的SVM分类器文件...保存
    9. <强>测试

      1. 加载SVM分类器
      2. 使用您在上面创建的.xml文件
      3. 初始化SVM分类器
      4. 捕捉图片
      5. 使用词典查找捕获图像的BoF描述符
      6. 使用这些BoF描述符使用SVM对其进行分类
      7. 您可以参考此article

答案 1 :(得分:0)

Implementing a CNN in Theano可能会比OpenCV中的任何内容都更好。如果您在Google学者上搜索,有大量关于使用CNN进行图像分类的论文 - 使用Theano,大多数这些方法都不难实现。

答案 2 :(得分:0)

您可以尝试通过将您的培训数据(缺陷,非缺陷)上传到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
    }
  ]
}