如何在机器学习中应用图像处理以及使用相对于的技术
Processing 可以用来提高图像质量,或帮助你从图像中提取有用的信息。它在医学成像等领域很有用,甚至可以用于隐藏图像中的数据。
在本文中,我将告诉你有关如何在机器学习中应用图像处理以及可以使用的技术。首先,让我们探索更多现实生活中的图像处理示例。
现实生活中的图像处理
医学影像
在医学上,科学家研究生物的内部结构和组织,以帮助更快地识别异常。医学成像中使用的图像处理可以帮助产生高质量,清晰的图像,以用于科学和医学研究,最终帮助医生诊断疾病。
摄像头监控
汽车经销公司或商店可能会安装安全摄像头,以监视该区域并记录小偷(如果他们出现的话)。但是有时候,需要对安全摄像机生成的图像进行处理,方法是将大小增加一倍,或者增加亮度和对比度,以使细节足够可见以捕获其中的重要细节。
军事与国防
图像处理技术在国防领域的一个有趣应用是隐写术。专家可以将消息或图像隐藏在另一个图像中,然后来回发送信息,而无需任何第三方检测到该消息。
常规图像锐化和还原
这可能是最广泛使用的图像处理应用程序。使用Photoshop之类的工具来增强和处理图像,或者使用Snapchat或Instagram上的滤镜来使我们的照片更酷。
如果您需要自动化和处理大量图像,那么手动进行操作将是一个痛苦而乏味的工作。这是机器学习算法可以提高图像处理速度而又不损失我们所需的最终质量的地方。
机器学习行业中使用的图像处理技术
在继续之前,重要的是要提到图像处理与计算机视觉有所不同,但是人们常常将两者混为一谈。
图像处理只是Computer Vision的一个方面,它们并不相同。图像处理系统专注于将图像从一种形式转换为另一种形式,而Computer Vision系统可帮助计算机理解图像并从图像中获取含义。
许多计算机视觉系统采用图像处理算法。例如,面部增强应用程序可以使用计算机视觉算法来检测照片中的面部,然后将图像处理技术(如平滑或灰度滤镜)应用到其中。
许多先进的图像处理方法都利用诸如深度神经网络之类的机器学习模型来转换各种任务上的图像,例如应用艺术滤镜,调整图像以获得最佳质量或增强特定图像细节以最大程度地提高计算机视觉任务的质量。
卷积神经网络(CNN)接受输入图像并在其上使用过滤器,从而学习诸如对象检测,图像分割和分类之类的事情。
除了进行图像处理外,最新的机器学习技术还使工程师可以扩充图像数据。机器学习模型仅与数据集一样好,但是当您没有必要的训练数据量时,您会怎么做?
无需尝试查找和标记更多的数据集,我们可以从已有数据中构建全新的数据集。我们可以通过应用简单的图像转换技术(水平翻转,色彩空间增强,缩放,随机裁剪)或使用深度学习算法(例如功能空间增强和自动编码器,生成对抗网络(GAN)和元学习)来做到这一点。
使用Keras的示例图像处理任务(带有代码示例)
让我们学习如何应用数据增强来生成图像数据集。我们将拍摄一条狗的单个图像,对其进行像向右移动,向左移动和缩放一样的转换,以创建图像的全新版本,随后可以将其用作计算机视觉任务(如物体检测或目标)的训练数据集。分类。
初始设置
在整个教程中,我们将严重依赖四个Python包:
- Keras:Keras具有图像数据预处理类,该类使我们能够无缝执行数据增强。
- Matplotlib:Python中最受欢迎的数据可视化库之一。它使我们可以创建图和图,并非常容易地生成静态栅格或矢量文件,而无需任何GUI。
- Numpy:一个非常有用的库,用于在数组上执行数学和逻辑运算。在本教程中,我们将使用其expand_dim类扩展数组的形状。
- Pillow:一个Python影像库,在本教程中,我们将使用它来打开和处理我们的图像文件。
让我们继续安装这些库。
在终端/命令提示符下,键入:
pip3 list
查看你已经在电脑上安装的python软件包。然后安装缺少的软件包:
pip3 install numpy matplotlib keras numpy pillow
现在我们已经安装了必要的软件包,让我们继续执行步骤1。
步骤1
创建一个名为的文件夹data-aug-sample。在其中,创建一个名为sample.py的python文件,然后从互联网下载示例狗照片,并将其另存为dog.jpg在此文件夹中。然后像这样导入库:
import matplotlib.pyplot as plt #绘制可视化
from keras.preprocessing.image import ImageDataGenerator #硬数据集生成器类。
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
import cv2
from PIL import Image
# %matplotlib inline
image = Image.open('dog.jpg')
plt.imshow(image)
plt.show()
现在,我们的文件夹结构应该如下所示:
保存此文件,然后在您的终端中运行它,如下所示:python3 sample.py。
您应该会看到类似以下内容的内容:
第2步
现在开始在图像上应用变换操作。
旋转变换将图像从1到359°之间的轴从右向左旋转。在下面的示例中,我们将狗图像旋转90°。KerasImageDataGenerator类允许我们rotation_range 为此目的是传递一个参数:
import matplotlib.pyplot as plt #用于绘图
from keras.preprocessing.image import ImageDataGenerator #图像数据生成器。
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
import cv2
from PIL import Image
image = Image.open('dog.jpg')
#回转
data = img_to_array(image)
samples = expand_dims(data, 0)
data_generated = ImageDataGenerator(rotation_range=90) #在这里,我们指定旋转角度为90
it = data_generated.flow(samples, batch_size=1)
for i in range(9):
plt.subplot(330 + 1 + i)
batch = it.next()
result = batch[0].astype('uint8')
plt.imshow(result)
plt.show()
运行上面的代码为我们提供了一个新的数据集:
我们可以水平,垂直,向左或向右对图像应用平移变换。这种转换对于避免数据中的位置偏差非常有用。例如,在人脸在图像中居中的数据集上训练人脸识别模型会导致位置偏差,从而使得该模型在位于左侧或右侧的新人脸上的表现非常差。我们将使用height_shift_range与width_shift_range parameters该的ImageDataGenerator类此目的。
对我们的图像应用垂直移位变换:
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
import cv2
from PIL import Image
image = Image.open('dog.jpg')
data = img_to_array(image)
samples = expand_dims(data, 0)
data_generator = ImageDataGenerator(height_shift_range=0.5)
it = data_generator.flow(samples, batch_size=1)
for i in range(9):
plt.subplot(330 + 1 + i)
batch = it.next()
result = batch[0].astype('uint8')
plt.imshow(result)
plt.show()
我们的结果如下所示:
对我们的图像应用水平进行移位变换:
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
import cv2
from PIL import Image
image = Image.open('dog.jpg')
data = img_to_array(image)
samples = expand_dims(data, 0)
# data_generator = ImageDataGenerator(width_shift_range=[-100,100])
it = data_generator.flow(samples, batch_size=1)
for i in range(9):
plt.subplot(330 + 1 + i)
batch = it.next()
result = batch[0].astype('uint8')
plt.imshow(result)
plt.show()
我们的结果如下所示:
色彩空间
在这里,我们将对狗图像的颜色通道空间进行变换。此处发生的是,它隔离了单个颜色通道(R,G或B),结果是图像变亮或变暗。通过在类中简单指定brightness_range值(通常是一个元组或两个浮点数的列表)ImageDataGenerator,我们可以设置要从中选择的亮度偏移值。
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
import cv2
from PIL import Image
image = Image.open('dog.jpg')
data = img_to_array(image)
samples = expand_dims(data, 0)
datagen = ImageDataGenerator(brightness_range=[0.2,1.0])
it = datagen.flow(samples, batch_size=1)
for i in range(9):
plt.subplot(330 + 1 + i)
batch = it.next()
result = batch[0].astype('uint8')
plt.imshow(result)
plt.show()
效果如下
缩放
顾名思义,我们可以通过简单地传入类的zoom_range属性,对我们的狗图像进行变换,以放大/缩小图像ImageDataGenerator。
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
import cv2
from PIL import Image
image = Image.open('dog.jpg')
data = img_to_array(image)
samples = expand_dims(data, 0)
datagen = ImageDataGenerator(zoom_range=[0.2,1.0])
it = datagen.flow(samples, batch_size=1)
for i in range(9):
plt.subplot(330 + 1 + i)
batch = it.next()
result = batch[0].astype('uint8')
plt.imshow(result)
plt.show()
我们得出的结果是:
使用我们生成的这个新数据集,我们可以对其进行清理,并消除歪斜的图像或具有无意义信息的图像。然后可以将其用于训练对象检测模型或狗分类器。
结论
机器学习算法使您能够进行大规模,详尽的图像处理。希望您学到了一两个关于如何在机器学习中使用图像处理的知识,并且不要忘记图像处理与计算机视觉是不同的!