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

机器学习项目图像分割

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

计算机视觉是计算机科学的一个领域,它使计算机能够识别和处理视频和图像中的物体,就像人类一样。尽管计算机视觉看似并不是一个非常新的概念,但它可以追溯到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。这将帮助你更好地分析问题,并激发你提出新的想法来解决复杂问题。

相关推荐
新加坡内哥谈技术10 分钟前
本地 AI 模型“不实用”?
人工智能·语言模型·自然语言处理
Scabbards_19 分钟前
用于牙科的多任务视频增强
人工智能·深度学习·算法·机器学习
LPiling34 分钟前
汽车和工业用激光雷达行业分析
人工智能·自动驾驶·汽车
不爱原创的Yoga39 分钟前
自动驾驶汽车需要哪些传感器来感知环境
人工智能·自动驾驶·汽车
Golinie44 分钟前
2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程
人工智能·pytorch·深度学习
周杰伦_Jay1 小时前
Ollama能本地部署Llama 3等大模型的原因解析(ollama核心架构、技术特性、实际应用)
数据结构·人工智能·深度学习·架构·transformer·llama
几道之旅1 小时前
论文阅读笔记:AI+RPA
人工智能
池央1 小时前
GAN - 生成对抗网络:生成新的数据样本
人工智能·神经网络·生成对抗网络
鸭鸭鸭进京赶烤1 小时前
OpenAI秘密重塑机器人军团: 实体AGI的崛起!
人工智能·opencv·机器学习·ai·机器人·agi·机器翻译引擎
ZHOU_WUYI1 小时前
lightrag源码 : Generate chunks from document
人工智能·rag