我有一组被认为是优质图像的图像和另一组被认为是劣质图像的图像。我必须训练一个分类模型,以便任何新图像都可以说是好/坏。SVM 似乎是最好的方法。我知道如何在 MATLAB 中做到这一点。
但是,谁能建议如何在 python 中做到这一点?图书馆有哪些?对于 SVM scikit,图像和 PCA 的特征提取呢?
我有一组被认为是优质图像的图像和另一组被认为是劣质图像的图像。我必须训练一个分类模型,以便任何新图像都可以说是好/坏。SVM 似乎是最好的方法。我知道如何在 MATLAB 中做到这一点。
但是,谁能建议如何在 python 中做到这一点?图书馆有哪些?对于 SVM scikit,图像和 PCA 的特征提取呢?
由于这个问题与我已经回答的类似问题高度重叠,我将在此处包含该答案(链接在问题下方的评论中):
在图像中,一些常用的特征提取技术是二值化和模糊
二值化:将图像数组转换为 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 中开始学习机器学习。
如果您有一组相当大的“好”和“坏”图像,您可以使用带有 pytorch 或 tensorflow 之类的包的卷积神经网络 (CNN)(pytorch 更符合 Python 风格)。据我了解,如今对于图像任务,CNN 是所有酷孩子都在使用的。
有一个用于预加载模型的包,您可以使用此处所示的 vgg16 之类的小东西,然后将最后一层替换为教程末尾所示的大小为 2 的全连接输出,或者下载笔记本。
很好,在这种情况下,您不必关心“好”和“坏”是什么(因此您的问题可能非常正确),只要您有 10K 图像...