【机器学习实战高阶】基于深度学习的图像分割

机器学习项目图像分割

你可能已经注意到,大脑如何快速高效地识别并分类眼睛感知到的事物。大脑以某种方式进行训练,以便能够从微观层面分析所有内容。这种能力有助于我们从一篮子橙子中分辨出一个苹果。

计算机视觉是计算机科学的一个领域,它使计算机能够识别和处理视频和图像中的物体,就像人类一样。尽管计算机视觉看似并不是一个非常新的概念,但它可以追溯到20世纪60年代末,当时第一台数字图像扫描仪问世,该扫描仪将图像转换为数字网格。

图像分割示例

什么是图像分割?

你可能听说过物体检测和图像定位。当图像中只有一个物体时,我们使用图像定位技术在该物体周围绘制一个边界框。在物体检测的情况下,它会提供标签和边界框,因此我们可以预测物体的位置和类别。

图像分割可以提供关于图像形状的更详细的微观信息,因此是物体检测概念的延伸。

我们通过将图像分割成不同颜色的区域来区分物体,这有助于在更细微的层面上区分不同的物体。

图像分割的类型

图像分割大致可以分为两种类型:

  1. 语义分割

    语义分割是将图像像素分割成它们各自的类别。例如,在上图中,猫与黄色相关联,因此所有与猫相关的像素都被标记为黄色。同一类别的多个物体被视为一个实体,因此用相同颜色表示。

  2. 实例分割

    实例分割更为细致,通常在处理多个物体时使用。不同之处在于,检测到的物体被用一种颜色标记,因此所有与该物体相关的像素都被赋予相同的颜色。同一类别的多个物体被视为不同的实体,因此用不同的颜色表示。

图像分割应用
  1. 自动驾驶汽车

    图像分割可以用于自动驾驶汽车中,以轻松区分各种物体,如交通信号灯、指示牌、行人和汽车。这有助于驾驶指令算法在生成下一步指令之前更好地评估周围环境。

    居中的图片:

  2. 电路板缺陷检测

    公司需要承担缺陷设备的责任。如果用一个带有图像分割模型的相机不断扫描最终产品的缺陷,可以节省大量时间和金钱来修复有缺陷的设备。

  3. 面部检测

    如今,我们注意到大多数手机的摄像头都支持人像模式。人像模式实际上是图像分割技术的结果。此外,当面部可以从嘈杂的物体中区分出来时,安全监控将更加有效。

  4. 医学成像

    图像分割可以用于从医学报告中提取临床相关的信息。例如,图像分割可以用于分割肿瘤。

Mask R-CNN

我们将使用Mask R-CNN架构进行图像分割。它是Faster R-CNN模型的扩展,后者常用于物体检测任务。

Mask R-CNN可以返回二进制物体掩码,除了类别标签和物体边界框之外。Mask R-CNN擅长像素级别的分割。

Mask R-CNN的工作原理

Mask R-CNN使用与其前身Faster R-CNN类似的架构,并且还利用全卷积网络进行像素级别的分割。

  1. 特征提取

    我们使用ResNet 101架构从输入图像中提取特征。结果是得到特征图,这些特征图被传输到Region Proposal Network(RPN)。

  2. 区域提议网络(RPN)

    在获得特征图之后,确定边界框候选区域,因此RPN提取RoI(感兴趣区域)。

  3. RoI Pool层

    Faster R-CNN使用RoI Pool层来计算从提取的提议中得出的特征,以便推断物体的类别和边界框坐标。

  4. RoI Align层

    由于RoI坐标量化导致在获取感兴趣区域时出现对齐问题。由于像素级别的分割需要精确度,因此Faster R-CNN的作者巧妙地通过实现RoI Align来解决这个问题。

    掩码是通过一个小的全连接网络应用于每个RoI,该网络以像素对像素的方式预测分割掩码。

构建图像分割项目的步骤

下载图像分割项目代码

请下载图像分割项目的源代码:图像分割与机器学习

  1. 克隆Mask R-CNN Github仓库

    首先,我们下载将要实现的模型架构。直接下载:https://download.csdn.net/download/jrckkyy/90291632

  2. 库依赖

    为了使其正常工作,我们需要某些库,你可能还没有安装所有必要的库。

    以下是你需要的库列表:

    • numpy
    • scipy
    • pillow
    • cython
    • matplotlib
    • scikit-image
    • tensorflow
    • keras
    • opencv-python
    • h5py
    • imgaug
    • ipython

    :如果你在Windows上无法成功安装'pycocotools',可以尝试安装这个版本,它在我这里工作得很好。

  3. 预训练权重

    由于训练模型需要数小时甚至几天,因此现在很难训练模型。因此,我们将使用预训练模型来对我们输入的图像进行预测。

    从github下载预训练模型

    跟随这个链接,你会看到Mask-RCNN的发布列表。你可以尝试最新版本,但由于有不一致的问题,我使用了Mask R-CNN 2.0。你可以直接下载h5文件并将其保存到我们在第一步中克隆的Mask R-CNN仓库的samples文件夹中。

  4. 创建新的Jupyter Notebook

    到目前为止,我们已经组装好了引擎,现在是时候利用我们引擎的力量,一路驶向分割后的图像了。

    我们将在Mask R-CNN仓库的samples文件夹中创建一个新的Jupyter Notebook,你可以使用其他IDE,但Jupyter Notebook可以方便地逐个执行代码单元。

    如果你没有强大的系统,可以使用Google Colab来运行代码,但请确保正确上传仓库和h5文件。

  5. 导入必要的库

    python 复制代码
    # 导入必要的库
    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',可以尝试安装这个版本,它在我这里工作得很好。

  6. 预训练权重的路径

    python 复制代码
    # 保存日志和训练模型的目录
    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")
  7. 推理类以推断Mask R-CNN模型

    python 复制代码
    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()

    输出

    python 复制代码
    config

    你看到的是我们将要使用的Mask R-CNN模型的规格。主干是resnet101,它有助于从图像中提取特征。

    下一个重要的观察点是掩码形状,为28×28,因为它是在COCO数据集上训练的,我们总共有81个类别。

    这意味着有81种可能的预测类别,物体可以属于其中的一种。

  8. 加载权重

    python 复制代码
    # 在推理模式下创建模型对象
    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)
  9. 加载图像以测试模型

    python 复制代码
    # 读取图像
    image = skimage.io.imread('../images/4410436637_7b0ca36ee7_z.jpg')
    
    # 显示原始图像
    plt.figure(figsize=(12,10))
    skimage.io.imshow(image)

    输出

    python 复制代码
    选择的图像
  1. 将图像发送到模型以生成预测结果

    python 复制代码
    # 运行检测
    results = model.detect([image], verbose=1)
  2. 将结果掩码应用到图像中

    python 复制代码
    # 可视化结果
    r = results[0]
    visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],

    这是你一直在迫切等待的时刻,以下是输出结果

    python 复制代码
    图像分割输出

    好的!我们成功地分割了图像,并且可以看到我们的代码表现非常出色。如果你成功完成了这一步,那就恭喜你!

  3. 检测到的物体数量

    现在,如果你想知道我们成功检测到的物体数量,只需输入以下代码:

    python 复制代码
    # 获取掩码
    mask = r['masks']
    mask = mask.astype(int)
    mask.shape

    输出

    python 复制代码
    (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。这将帮助你更好地分析问题,并激发你提出新的想法来解决复杂问题。

相关推荐
AI科技星1 分钟前
引力与电磁的动力学耦合:变化磁场产生引力场与电场方程的第一性原理推导、验证与统一性意义
服务器·人工智能·科技·线性代数·算法·机器学习·生活
hkNaruto3 分钟前
【AI】AI学习笔记:OpenAI Tools完全指南:从原理到实战入门
人工智能·笔记·学习
狮子座明仔5 分钟前
MiMo-V2-Flash 深度解读:小米 309B 开源 MoE 模型如何用 15B 激活参数吊打 671B 巨头?
人工智能·语言模型·自然语言处理
xwill*7 分钟前
wandb的使用方法,以navrl为例
开发语言·python·深度学习
紧固件研究社7 分钟前
从标准件到复杂异形件,紧固件设备如何赋能制造升级
人工智能·制造·紧固件
木头左7 分钟前
贝叶斯深度学习在指数期权风险价值VaR估计中的实现与应用
人工智能·深度学习
反向跟单策略7 分钟前
期货反向跟单—高频换人能够提高跟单效率?
大数据·人工智能·学习·数据分析·区块链
哎吆我呸8 分钟前
Android studio 安装Claude Code GUI 插件报错无法找到Node.js解决方案
人工智能
咕噜企业分发小米9 分钟前
独立IP服务器有哪些常见的应用场景?
人工智能·阿里云·云计算
测试者家园14 分钟前
AI 智能体如何构建模拟真实用户行为的复杂负载场景?
人工智能·压力测试·性能测试·智能体·用户行为·智能化测试·软件开发和测试