机器学习项目图像分割
你可能已经注意到,大脑如何快速高效地识别并分类眼睛感知到的事物。大脑以某种方式进行训练,以便能够从微观层面分析所有内容。这种能力有助于我们从一篮子橙子中分辨出一个苹果。
计算机视觉是计算机科学的一个领域,它使计算机能够识别和处理视频和图像中的物体,就像人类一样。尽管计算机视觉看似并不是一个非常新的概念,但它可以追溯到20世纪60年代末,当时第一台数字图像扫描仪问世,该扫描仪将图像转换为数字网格。
图像分割示例
什么是图像分割?
你可能听说过物体检测和图像定位。当图像中只有一个物体时,我们使用图像定位技术在该物体周围绘制一个边界框。在物体检测的情况下,它会提供标签和边界框,因此我们可以预测物体的位置和类别。
图像分割可以提供关于图像形状的更详细的微观信息,因此是物体检测概念的延伸。
我们通过将图像分割成不同颜色的区域来区分物体,这有助于在更细微的层面上区分不同的物体。
图像分割的类型
图像分割大致可以分为两种类型:
-
语义分割
语义分割是将图像像素分割成它们各自的类别。例如,在上图中,猫与黄色相关联,因此所有与猫相关的像素都被标记为黄色。同一类别的多个物体被视为一个实体,因此用相同颜色表示。 -
实例分割
实例分割更为细致,通常在处理多个物体时使用。不同之处在于,检测到的物体被用一种颜色标记,因此所有与该物体相关的像素都被赋予相同的颜色。同一类别的多个物体被视为不同的实体,因此用不同的颜色表示。
图像分割应用
-
自动驾驶汽车
图像分割可以用于自动驾驶汽车中,以轻松区分各种物体,如交通信号灯、指示牌、行人和汽车。这有助于驾驶指令算法在生成下一步指令之前更好地评估周围环境。
居中的图片: -
电路板缺陷检测
公司需要承担缺陷设备的责任。如果用一个带有图像分割模型的相机不断扫描最终产品的缺陷,可以节省大量时间和金钱来修复有缺陷的设备。
-
面部检测
如今,我们注意到大多数手机的摄像头都支持人像模式。人像模式实际上是图像分割技术的结果。此外,当面部可以从嘈杂的物体中区分出来时,安全监控将更加有效。 -
医学成像
图像分割可以用于从医学报告中提取临床相关的信息。例如,图像分割可以用于分割肿瘤。
Mask R-CNN
我们将使用Mask R-CNN架构进行图像分割。它是Faster R-CNN模型的扩展,后者常用于物体检测任务。
Mask R-CNN可以返回二进制物体掩码,除了类别标签和物体边界框之外。Mask R-CNN擅长像素级别的分割。
Mask R-CNN的工作原理
Mask R-CNN使用与其前身Faster R-CNN类似的架构,并且还利用全卷积网络进行像素级别的分割。
-
特征提取
我们使用ResNet 101架构从输入图像中提取特征。结果是得到特征图,这些特征图被传输到Region Proposal Network(RPN)。 -
区域提议网络(RPN)
在获得特征图之后,确定边界框候选区域,因此RPN提取RoI(感兴趣区域)。 -
RoI Pool层
Faster R-CNN使用RoI Pool层来计算从提取的提议中得出的特征,以便推断物体的类别和边界框坐标。 -
RoI Align层
由于RoI坐标量化导致在获取感兴趣区域时出现对齐问题。由于像素级别的分割需要精确度,因此Faster R-CNN的作者巧妙地通过实现RoI Align来解决这个问题。
掩码是通过一个小的全连接网络应用于每个RoI,该网络以像素对像素的方式预测分割掩码。
构建图像分割项目的步骤
下载图像分割项目代码
请下载图像分割项目的源代码:图像分割与机器学习
-
克隆Mask R-CNN Github仓库
首先,我们下载将要实现的模型架构。直接下载:https://download.csdn.net/download/jrckkyy/90291632 -
库依赖
为了使其正常工作,我们需要某些库,你可能还没有安装所有必要的库。
以下是你需要的库列表:- numpy
- scipy
- pillow
- cython
- matplotlib
- scikit-image
- tensorflow
- keras
- opencv-python
- h5py
- imgaug
- ipython
注:如果你在Windows上无法成功安装‘pycocotools’,可以尝试安装这个版本,它在我这里工作得很好。
-
预训练权重
由于训练模型需要数小时甚至几天,因此现在很难训练模型。因此,我们将使用预训练模型来对我们输入的图像进行预测。从github下载预训练模型
跟随这个链接,你会看到Mask-RCNN的发布列表。你可以尝试最新版本,但由于有不一致的问题,我使用了Mask R-CNN 2.0。你可以直接下载h5文件并将其保存到我们在第一步中克隆的Mask R-CNN仓库的samples文件夹中。
-
创建新的Jupyter Notebook
到目前为止,我们已经组装好了引擎,现在是时候利用我们引擎的力量,一路驶向分割后的图像了。我们将在Mask R-CNN仓库的samples文件夹中创建一个新的Jupyter Notebook,你可以使用其他IDE,但Jupyter Notebook可以方便地逐个执行代码单元。
如果你没有强大的系统,可以使用Google Colab来运行代码,但请确保正确上传仓库和h5文件。
-
导入必要的库
# 导入必要的库 import os import sys import random import math import numpy as np import skimage.io import matplotlib import matplotlib.pyplot as plt # 获取根目录 ROOT_DIR = os.path.abspath("../") # 忽略警告 import warnings warnings.filterwarnings("ignore") # 导入Mask RCNN sys.path.append(ROOT_DIR) # 将库的本地版本添加到路径中 from mrcnn import utils import mrcnn.model as modellib from mrcnn import visualize # 进入coco目录 sys.path.append(os.path.join(ROOT_DIR, "samples/coco/")) # 导入coco.py import coco # 在Jupyter Notebook中显示图像 %matplotlib inline
注1:如果你在定位目录时感到困惑或卡住,可以输入
print(ROOT_DIR)
来查看你引用的目录。
注2:你可能会遇到与‘pycocotools’相关的错误。如果你在Windows上无法成功安装‘pycocotools’,可以尝试安装这个版本,它在我这里工作得很好。 -
预训练权重的路径
# 保存日志和训练模型的目录 MODEL_DIR = os.path.join(ROOT_DIR, "logs") # 预训练权重文件的本地路径 COCO_MODEL_PATH = os.path.join('', "mask_rcnn_coco.h5") # 要进行检测的图像目录 DIR_IMAGE = os.path.join(ROOT_DIR, "images")
-
推理类以推断Mask R-CNN模型
class InferenceConfig(coco.CocoConfig): # 将batch size设置为1,因为我们每次仅处理一张图像。batch size = GPU_COUNT * IMAGES_PER_GPU GPU_COUNT = 1 IMAGES_PER_GPU = 1 config = InferenceConfig() config.display()
输出:
config
你看到的是我们将要使用的Mask R-CNN模型的规格。主干是resnet101,它有助于从图像中提取特征。
下一个重要的观察点是掩码形状,为28×28,因为它是在COCO数据集上训练的,我们总共有81个类别。
这意味着有81种可能的预测类别,物体可以属于其中的一种。
-
加载权重
# 在推理模式下创建模型对象 model = modellib.MaskRCNN(mode="inference", model_dir='mask_rcnn_coco.h5', config=config) # 加载在MS-COCO上训练的权重 model.load_weights('mask_rcnn_coco.h5', by_name=True)
-
加载图像以测试模型
# 读取图像 image = skimage.io.imread('../images/4410436637_7b0ca36ee7_z.jpg') # 显示原始图像 plt.figure(figsize=(12,10)) skimage.io.imshow(image)
输出:
选择的图像
-
将图像发送到模型以生成预测结果
# 运行检测 results = model.detect([image], verbose=1)
-
将结果掩码应用到图像中
# 可视化结果 r = results[0] visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
这是你一直在迫切等待的时刻,以下是输出结果:
图像分割输出
好的!我们成功地分割了图像,并且可以看到我们的代码表现非常出色。如果你成功完成了这一步,那就恭喜你!
-
检测到的物体数量
现在,如果你想知道我们成功检测到的物体数量,只需输入以下代码:# 获取掩码 mask = r['masks'] mask = mask.astype(int) mask.shape
输出:
(426, 640, 7)
从这里我们可以看到,模型在图像中共检测到了7个物体。
参考资料
资料名称 | 链接 |
---|---|
Image Segmentation with Machine Learning | http://www.example.com/image-segmentation-with-machine-learning |
Introduction to Mask R-CNN | https://www.example.com/introduction-to-mask-r-cnn |
Semantic Segmentation in Computer Vision | https://www.example.com/semantic-segmentation-in-computer-vision |
Instance Segmentation in Computer Vision | https://www.example.com/instance-segmentation-in-computer-vision |
ResNet Architecture | https://www.example.com/resnet-architecture |
Faster R-CNN Explained | https://www.example.com/faster-r-cnn-explained |
RoI Pooling vs RoI Align | https://www.example.com/roi-pooling-vs-roi-align |
COCO Dataset | https://cocodataset.org/ |
TensorFlow Official Documentation | https://www.tensorflow.org/ |
Keras Official Documentation | https://keras.io/ |
OpenCV Official Documentation | https://opencv.org/ |
GitHub - Matterport/Mask_RCNN | https://github.com/matterport/Mask_RCNN |
Cornell University - Computer Vision | http://www.cs.cornell.edu/courses/cs5670/2020sp/ |
Stanford University - CS231n | http://cs231n.stanford.edu/ |
PyCocotools Installation Guide | https://www.example.com/pycocotools-installation-guide |
总结
希望我们能够引导你解决你的第一个图像分割问题。我们讨论了整个过程,如果你对细节感兴趣,互联网上有大量的相关信息可供查阅。
我们建议你阅读并理解各种架构,包括我们实现的Mask R-CNN。这将帮助你更好地分析问题,并激发你提出新的想法来解决复杂问题。