python中的图像分类

数据挖掘 Python 图像分类
2021-10-06 20:13:57

我有一组被认为是优质图像的图像和另一组被认为是劣质图像的图像。我必须训练一个分类模型,以便任何新图像都可以说是好/坏。SVM 似乎是最好的方法。我知道如何在 MATLAB 中做到这一点。

但是,谁能建议如何在 python 中做到这一点?图书馆有哪些?对于 SVM scikit,图像和 PCA 的特征提取呢?

4个回答

由于这个问题与我已经回答的类似问题高度重叠,我将在此处包含该答案(链接在问题下方的评论中):

在图像中,一些常用的特征提取技术是二值化模糊

二值化:将图像数组转换为 1 和 0。这是在将图像转换为 2D 图像时完成的。甚至也可以使用灰度。它为您提供图像的数字矩阵。存储在光盘上时,灰度占用的空间要少得多。

这就是你在 Python 中的做法:

from PIL import Image

%matplotlib inline  

#Import an image
image = Image.open("xyz.jpg")

image

示例图像:

在此处输入图像描述

现在,转换成灰度:

im = image.convert('L')

im

将返回此图像:

在此处输入图像描述

通过运行这个矩阵可以看到:

array(im)

数组看起来像这样:

array([[213, 213, 213, ..., 176, 176, 176],
       [213, 213, 213, ..., 176, 176, 176],
       [213, 213, 213, ..., 175, 175, 175],
       ..., 
       [173, 173, 173, ..., 204, 204, 204],
       [173, 173, 173, ..., 205, 205, 204],
       [173, 173, 173, ..., 205, 205, 205]], dtype=uint8)

现在,使用直方图和/或等高线图查看图像特征:

from pylab import *

# create a new figure
figure()
gray()
# show contours with origin upper left corner
contour(im, origin='image')
axis('equal')
axis('off')


figure()


hist(im_array.flatten(), 128)

show()

这将返回一个情节,看起来像这样:

在此处输入图像描述 在此处输入图像描述

模糊:模糊算法采用相邻像素的加权平均,将周围的颜色融入每个像素。它可以更好地增强轮廓,并有助于更好地理解特征及其重要性。

这就是你在 Python 中的做法:

from PIL import *


figure()
p = image.convert("L").filter(ImageFilter.GaussianBlur(radius = 2))
p.show()

模糊的图像是:

在此处输入图像描述

因此,这些是您可以进行特征工程的一些方法。对于高级方法,您必须了解计算机视觉和神经网络的基础知识,以及不同类型的过滤器及其意义和背后的数学原理。


整个分析是使用PIL 包完成的。我不会声称它是图像分析的一站式商店,但对于初学者到新手来说,它几乎就是它。

opencv库中有一定的特征提取算法。其中一些是 SURF 或 SIFT,opencv 中的 HOG。Python sklearn 库中的本地二进制模式(LBP)。另一种技术是创建视觉词袋。opencv 中也存在 BOW 类。要了解视觉词袋的概念,您可以查找一些研究论文。

opencv Python中的冲浪:

surf = cv2.SURF(400)
kp, des = surf.detectAndCompute(img,None)

您可以查看 opencv文档了解更多详细信息。同样,您可以了解所有其他特征提取方法。是关于 HOG 特征提取的另一篇博客。

从训练数据集图像中提取所有特征后,您可以使用sklearn的svm来训练分类器。有很多资源可以帮助您在 python 中开始学习机器学习。

您能告诉我们您使用哪些标准来考虑图片“优质图像”或“劣质图像”吗?

例如,如何处理它的一个想法可能是选择不聚焦的图片作为坏图片。区分它的一种方法是在图像上计算Sobel 算子以获得边缘。一张模糊的图像比一张好的图像包含更少的边缘,但它也取决于图像的类型(这与只有大海和沙子的风景和一张满桌子的照片不同),所以你会需要标准化您的图像,但还不知道如何处理这种标准化。

我对 python 库的建议是OpenCv几年前我尝试使用它时,它的 Python 语言文档很糟糕,但从那时起它肯定已经有了很大的改进。

如果您有一组相当大的“好”和“坏”图像,您可以使用带有 pytorch 或 tensorflow 之类的包的卷积神经网络 (CNN)(pytorch 更符合 Python 风格)。据我了解,如今对于图像任务,CNN 是所有酷孩子都在使用的。

有一个用于预加载模型的包,您可以使用此处所示的 vgg16 之类的小东西,然后将最后一层替换为教程末尾所示的大小为 2 的全连接输出,或者下载笔记本。

很好,在这种情况下,您不必关心“好”和“坏”是什么(因此您的问题可能非常正确),只要您有 10K 图像...