当前位置: 首页 > news >正文

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

在这里插入图片描述

机器学习项目图像分割

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

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

图像分割示例

什么是图像分割?

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

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

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

图像分割的类型

图像分割大致可以分为两种类型:
在这里插入图片描述

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

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

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

  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. 导入必要的库

    # 导入必要的库
    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. 预训练权重的路径

    # 保存日志和训练模型的目录
    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模型

    class InferenceConfig(coco.CocoConfig):# 将batch size设置为1,因为我们每次仅处理一张图像。batch size = GPU_COUNT * IMAGES_PER_GPUGPU_COUNT = 1IMAGES_PER_GPU = 1config = InferenceConfig()
    config.display()
    

    输出

    config
    

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

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

    这意味着有81种可能的预测类别,物体可以属于其中的一种。
    在这里插入图片描述

  8. 加载权重

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

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

    输出

    选择的图像
    

在这里插入图片描述

  1. 将图像发送到模型以生成预测结果

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

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

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

    图像分割输出
    

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

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

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

    输出

    (426, 640, 7)
    

在这里插入图片描述

从这里我们可以看到,模型在图像中共检测到了7个物体。
参考资料
资料名称链接
Image Segmentation with Machine Learninghttp://www.example.com/image-segmentation-with-machine-learning
Introduction to Mask R-CNNhttps://www.example.com/introduction-to-mask-r-cnn
Semantic Segmentation in Computer Visionhttps://www.example.com/semantic-segmentation-in-computer-vision
Instance Segmentation in Computer Visionhttps://www.example.com/instance-segmentation-in-computer-vision
ResNet Architecturehttps://www.example.com/resnet-architecture
Faster R-CNN Explainedhttps://www.example.com/faster-r-cnn-explained
RoI Pooling vs RoI Alignhttps://www.example.com/roi-pooling-vs-roi-align
COCO Datasethttps://cocodataset.org/
TensorFlow Official Documentationhttps://www.tensorflow.org/
Keras Official Documentationhttps://keras.io/
OpenCV Official Documentationhttps://opencv.org/
GitHub - Matterport/Mask_RCNNhttps://github.com/matterport/Mask_RCNN
Cornell University - Computer Visionhttp://www.cs.cornell.edu/courses/cs5670/2020sp/
Stanford University - CS231nhttp://cs231n.stanford.edu/
PyCocotools Installation Guidehttps://www.example.com/pycocotools-installation-guide

总结

希望我们能够引导你解决你的第一个图像分割问题。我们讨论了整个过程,如果你对细节感兴趣,互联网上有大量的相关信息可供查阅。

我们建议你阅读并理解各种架构,包括我们实现的Mask R-CNN。这将帮助你更好地分析问题,并激发你提出新的想法来解决复杂问题。

相关文章:

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

机器学习项目图像分割 你可能已经注意到,大脑如何快速高效地识别并分类眼睛感知到的事物。大脑以某种方式进行训练,以便能够从微观层面分析所有内容。这种能力有助于我们从一篮子橙子中分辨出一个苹果。 计算机视觉是计算机科学的一个领域,…...

「免填邀请码」赋能各类APP,提升转化率与用户体验

在当前移动互联网的高速发展下,用户获取和留存已成为各类APP成功的关键。传统的注册流程虽然能够有效识别用户来源并进行用户管理,但随着市场竞争的激烈,复杂的注册和绑定步骤往往会成为用户流失的瓶颈。免填邀请码技术,结合自研的…...

基于海思soc的智能产品开发(视频的后续开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们讨论了camera,也讨论了屏幕驱动,这些都是基础的部分。关键是,我们拿到了这些视频数据之后,…...

创建 pdf 合同模板

创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板,学会了后感觉虽然简单,但开始也折腾了好久,这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”,这里命…...

2024 年度学习总结

目录 1. 前言 2. csdn 对于我的意义 3. 写博客的初衷 3.1 现在的想法 4. 写博客的意义 5. 关于生活和博客创作 5.1 写博客较于纸质笔记的优势 6. 致 2025 1. 前言 不知不觉, 来到 csdn 已经快一年了, 在这一年中, 我通过 csdn 学习到了很多知识, 结识了很多的良师益友…...

CSS笔记基础篇02——浮动、标准流、定位、CSS精灵、字体图标

黑马程序员视频地址: 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p70https://www.bilibili.com/video/BV1kM4y127Li?vd_source…...

C++ 面向对象(继承)

三、继承 3.1 继承的概念 基于一个已有的类 去重新定义一个新的类,这种方式我们叫做继承 关于继承的称呼 一个类B 继承来自 类 A 我们一般称呼 A类:父类 基类 B类: 子类 派生类 B继承自A A 派生了B 示例图的语法 class vehicle // 车类 {}class …...

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于RIME-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、R…...

数据结构 数组

1. 常见的错误 这里我要特别纠正一个“错误”。我在面试的时候,常常会问数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度O(1);数组适合查找,查找时间复杂度为O(1)”。 实际上&#xff…...

Kivy App开发之UX控件Bubble气泡

kivy提供了一个提示气泡的小控件Bubble,使用时可以指定气泡箭头的方向以及显示的图像,还可以作为容器添加其他小控件。 常用属性如下 属性说明orientation气泡内子项的排序方式,可设置为vertical或horizontal,默认horizontalarrow_pos箭头相对于气泡的位置,可设置为left_…...

从零到一:打造属于你的AI智能体,支持本地部署

国外卷智能体,国内也都在搞 AI Agent,2025 年也将成为 Agent 的元年。构建智能体主要两种情况,一个是工作流模式,另外一种是直接开发应用,接下来分别给大家介绍一下两种产品和构建过程。工作流模式,以 Coze…...

成就与远见:2024年技术与思维的升华

个人主页:chian-ocean 前言: 2025年1月17日,2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300,虽然与顶尖博主仍有一定差距,但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…...

深搜与回溯——扫地机器人问题解析与代码实现

一、题目内容 题目描述 扫地机器人在一个 nm 的网格中从左上角(1,1)开始清扫。它按照以下规则移动: 如果当前位置的右边(同一行,下一列)没有被清扫过,它会向右移动。 如果右边无法移动&#xf…...

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…...

win内核内部直接irp读取文件写入文件

#include <ntifs.h> #include <ntddk.h> #define TAG_NAME tlfF // FltF in reverse #define BUFFER_SIZE PAGE_SIZE // 驱动设备扩展结构 typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; UNICODE_STRING DeviceName; UNICODE_STRIN…...

1. 基于图像的三维重建

1. 基于图像的三维重建 核心概念三维重建中深度图、点云的区别&#xff1f;深度图点云总结 深度图到点云还需要什么步骤&#xff1f;1. **获取相机内参**2. **生成相应的像素坐标**3. **计算三维坐标**4. **构建点云**5. **处理颜色信息&#xff08;可选&#xff09;**6. **去除…...

如何确保Python爬虫不违反微店规定

在使用Python爬虫获取微店商品详情时&#xff0c;确保爬虫行为符合微店的规定和相关法律法规至关重要。以下是一些关键步骤和注意事项&#xff0c;帮助你合法合规地使用爬虫技术&#xff1a; 一、遵守法律法规 在使用爬虫技术时&#xff0c;必须严格遵守《网络安全法》、《个…...

Spring Event和MQ的区别和使用场景

概念 Spring事件&#xff08;Spring Event&#xff09;是Spring框架的一项功能&#xff0c;它允许不同组件之间通过发布-订阅机制进行解耦的通信。 MQ一般是一个独立的中间件&#xff0c;它可以通过消息队列对消息进行传递和存储&#xff0c;生产者将消息发送到MQ&#xff0c;…...

SpringBoot:websocket 实现后端主动前端推送数据

简单说明下websocket实用场景。 实时通信领域&#xff1a;社交聊天弹幕多玩家游戏协同编辑股票基金实时报价体育实况更新视频会议/聊天基于位置的应用在线教育智能家居等需要高实时性的场景 一、服务端代码 pom.xml&#xff1a; <dependencies><dependency><…...

嵌入式硬件篇---PID控制

文章目录 前言第一部分&#xff1a;连续PID1.比例&#xff08;Proportional&#xff0c;P&#xff09;控制2.积分&#xff08;Integral&#xff0c;I&#xff09;控制3.微分&#xff08;Derivative&#xff0c;D&#xff09;控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...