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

2024-04-26 00:35:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个更为普遍的“我在哪里能找到好的资源来做某事”的问题。我正在尝试使用Python(OpenCV或其他)根据训练集对图像进行分类。

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

要分类的图像:这些图像由相似的图像组成,在相同的3个位置拍摄,但缺陷的类型没有分类(虽然缺陷区域是由拍摄图像的工具识别的,但只是工具没有正确分类,我无法更改工具)。

我尝试按照《用Python编程计算机视觉:分析图像的工具和算法》一书中的建议进行分类。在本例中,我使用存储在mySQL数据库(训练数据)中的SIFT描述符。到目前为止,我没有太多的运气(我继续排除故障),我想我会向任何OpenCV专家寻求建议。

任何推荐或建议将不胜感激。

所以,回到这个问题上,我认为分享我学到的东西是值得的。我不知道这是“答案”,但这就是我的归宿。一项正在进行的工作,你总是可以变得更好。

我现在的解决办法是把三种不同的方法结合起来。所有这些都可以在互联网上搜索,所以我不会详细介绍如何。

首先,我使用SIFT方法,使用对VLFeat的命令行调用生成SIFT直方图。这可能是Python中其他地方的一个选项,这正是我所使用的。我使用k-means聚类来做词汇视觉袋的事情,并建立了一个数据库,将质心和与训练图像相关的词汇直方图联系起来。我通过添加根筛选步骤稍微改进了结果。然后我使用密集SIFT(但没有根SIFT调整)创建了一个单独的数据库。最后,根据训练图像的RGB分量建立了一个彩色直方图数据库。我并没有使用所有256个R G B框,而是将单个R、G和B值相加超过8个框,然后将值展平为24个框的直方图。

对未知图像进行同样的处理,然后用欧氏距离比较直方图向量。我也尝试了卡方比较,但在我的情况下,欧几里德提供了更好的结果。我从每一个进程中抽取前三名的结果,根据9票中的5票进行图像分类。如果没有达到多数,那么分析是不确定的。

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


Tags: 工具方法图像数据库类型产品分类视觉
3条回答

研究了基于特征包(BoF)和支持向量机的图像分类问题。我用C++和OpenCV做的,但是我确信你也可以得到类似的Python方法。

概念:

创建BoF字典:

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

培训:

  1. 加载您的BoF字典
  2. 使用上面的BoF字典初始化BoF实例
  3. 从你的训练样本中提取一张图片。
  4. 提取SIFT关键点
  5. 为提取的关键点查找BoF描述符。
  6. 使用此BoF描述符进行支持向量机学习
  7. 对所有训练图像执行上述步骤
  8. 您将得到一个.xml格式的SVM分类器文件…保存它

测试:

  1. 加载支持向量机分类器
  2. 使用上面创建的.xml文件初始化SVM分类器
  3. 捕获图像
  4. 使用字典查找捕获图像的BoF描述符
  5. 使用这些BoF描述符使用支持向量机对其进行分类

你可以参考这个article

Implementing a CNN in Theano可能会给你比OpenCV中任何东西都好的结果。如果你在Google scholar上搜索,有大量关于使用CNNs进行图像分类的文章-这些方法中的大多数应该不难使用Theano实现。

您可以尝试通过将培训数据(有缺陷、没有缺陷)上载到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
    }
  ]
}

相关问题 更多 >