实例分割、语义分割和 SAM(Segment Anything Model)

news2024/11/28 21:34:36

实例分割、语义分割和 SAM(Segment Anything Model) 都是图像处理中的重要技术,它们的目标是通过分割图像中的不同对象或区域来帮助识别和分析图像,但它们的工作方式和适用场景各有不同。

1. 语义分割(Semantic Segmentation)

  • 目标: 语义分割的目的是将图像中的每个像素归类到某一个类别中,不区分同类中的不同个体。
  • 特点: 语义分割只关心“类别”,而不关心图像中有多少个对象。换句话说,如果图像中有多辆车,它们都被归类为“车”,但不会区分不同的车。
  • 应用场景: 自动驾驶中的道路、建筑物、行人分割,医学图像中的器官分割。

例子: 在城市街景中,语义分割会将所有的树木标记为同一个类别“树”,所有的道路标记为“道路”,而不会区分某一棵树或某一段路。

2. 实例分割(Instance Segmentation)

  • 目标: 实例分割不仅要将每个像素归类到某个类别,还要区分同类中的不同个体。
  • 特点: 实例分割可以同时进行物体检测和像素级的分割。例如,它不仅会检测图像中的车,还会为每辆车生成单独的掩码,从而区分同一图像中的不同车辆。
  • 应用场景: 实例分割常用于自动驾驶、增强现实(AR)、机器人视觉、视频监控等领域,在这些场景中需要区分同类物体的不同个体。

例子: 在同样的城市街景中,实例分割不仅会识别“车”这个类别,还会区分每一辆车。

3. SAM(Segment Anything Model)

  • 目标: SAM 是一种通用的分割模型,旨在实现“一切的分割”。它结合了语义分割和实例分割的能力,但更加灵活。
  • 特点: SAM 能够在提供提示(如边界框、点)的情况下进行精确的分割,而无需针对特定任务或类别进行专门训练。这意味着你可以通过简单的提示(如边界框、点击目标)来触发分割操作,无论图像中是什么物体,SAM 都可以尝试分割。
  • 应用场景: SAM 可以在任何需要分割的场景下应用,尤其适用于需要用户交互的场景,如图像标注、医疗图像分析、用户定制分割等。它能够分割新类别的物体,而不依赖于预先定义的类别。

例子: SAM 可以根据给定的边界框分割出手、车、动物等,而不需要事先知道物体的类别。用户也可以通过点选某些区域来生成物体的分割掩码。

主要区别

  1. 类别和个体的区分:

    • 语义分割: 只关心类别,所有属于同一类别的物体都会被统一处理,不区分个体。
    • 实例分割: 不仅分割类别,还区分每个个体,即使是同一类别的物体,也会生成单独的掩码。
    • SAM: 可以基于提示(如点、边界框)分割任意物体,具有更大的灵活性,不局限于某一特定类别或预先定义的任务。
  2. 应用场景:

    • 语义分割: 适合场景分类和大范围的物体分割,如识别整个场景中的类别。
    • 实例分割: 适合需要区分多个同类物体的场景,如自动驾驶中的行人、车辆检测。
    • SAM: 适合任意分割任务,可以应对未知类别和灵活的用户交互需求。
  3. 灵活性:

    • 语义分割和实例分割通常依赖于预先定义的类别或特定任务进行训练。
    • SAM 是一种通用分割工具,能够根据用户的提示分割出几乎任何类型的物体,无需预先训练。

小结:

  • 语义分割 是针对类别的分割,适用于大范围的场景分析。
  • 实例分割 通过区分同类个体,提供更精细的对象分割。
  • SAM 则是一种通用分割工具,灵活且不局限于特定类别和任务。

首先我们写一段简单的代码来看一下语义分割,语义分割就是可以把具体的某个像素点分给某个物体,而不是像目标检测一样用一个框标出

 

import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt

# 加载预训练的DeepLabV3模型
model = models.segmentation.deeplabv3_resnet101(pretrained=True).eval()

# 图像预处理
preprocess = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载图像
image_path = "path/000000000257.jpg"  # 替换为你的图片路径
image = Image.open(image_path)
input_tensor = preprocess(image).unsqueeze(0)

# 执行语义分割
with torch.no_grad():
    output = model(input_tensor)['out'][0]
output_predictions = output.argmax(0)  # 获取每个像素的类别

# 将分割结果可视化
plt.figure(figsize=(10, 5))

# 显示原图
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")

# 显示语义分割结果
plt.subplot(1, 2, 2)
plt.imshow(output_predictions.cpu().numpy())
plt.title("Semantic Segmentation")
plt.show()

 

  把物体和背景有效进行区分了

实例分割

import torch
from PIL import Image
from torchvision import models, transforms
import matplotlib.pyplot as plt
import cv2
import numpy as np

# 加载预训练的Mask R-CNN模型
model = models.detection.maskrcnn_resnet50_fpn(pretrained=True).eval()

# 图像预处理
preprocess = transforms.Compose([
    transforms.ToTensor(),
])

# 加载图像
image_path = "path/000000000257.jpg" # 替换为你的图片路径
image = Image.open(image_path)
input_tensor = preprocess(image).unsqueeze(0)

# 执行实例分割
with torch.no_grad():
    output = model(input_tensor)

# 获取分割掩码
masks = output[0]['masks'].cpu().numpy()
boxes = output[0]['boxes'].cpu().numpy()

# 可视化边界框和实例掩码
image_cv = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
for i in range(len(masks)):
    mask = masks[i, 0]  # 获取掩码
    mask = cv2.resize(mask, (image_cv.shape[1], image_cv.shape[0]))  # 将掩码调整为与原图大小一致

    # 将掩码叠加到图像上
    image_cv[mask > 0.5] = [0, 0, 255]  # 红色掩码

    # 绘制边界框
    box = boxes[i].astype(int)
    cv2.rectangle(image_cv, (box[0], box[1]), (box[2], box[3]), (255, 0, 0), 2)  # 蓝色边框

# 显示结果
plt.imshow(cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB))
plt.title("Instance Segmentation (Mask R-CNN)")
plt.show()

 当然小编这里导入的语义分割和实例分割的模型差异导致了识别也有差异

SAM

import matplotlib.pyplot as plt
import numpy as np
from ultralytics import YOLO
from PIL import Image
import cv2
from segment_anything import SamPredictor, sam_model_registry

# 加载图像
image_path = r'F:/photos/photo_1.jpg'  # 替换为你的图片路径
image = Image.open(image_path)

# 将图像转换为 OpenCV 格式以便显示
image_cv = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)

# 加载 YOLO 模型
yolo_model = YOLO("F:/科研学习/yolo系列params/v10/YOLOv10x_gestures.pt")
# yolo_model = YOLO("F:/科研学习/yolov11/yolov11/yolov11/资料/模型文件/yolov8n.pt")
yolo_results = yolo_model(image)

# 加载 SAM 模型
sam_model = sam_model_registry["vit_l"](checkpoint="C:/Users/张佳珲/Downloads/sam_vit_l_0b3195.pth")
predictor = SamPredictor(sam_model)

# 将整个图像传递给 SAM 模型
predictor.set_image(np.array(image))  # 传递整个图像

# 遍历 YOLO 检测结果并绘制边界框
for result in yolo_results:
    if len(result.boxes) > 0:  # 检查是否有检测到物体
        boxes = result.boxes.xyxy  # YOLO 边界框
        for box in boxes:
            # 画出 YOLO 边界框 (蓝色)
            x1, y1, x2, y2 = map(int, box)
            cv2.rectangle(image_cv, (x1, y1), (x2, y2), (255, 0, 0), 2)  # 蓝色框代表 YOLO 的检测

            # 使用 SAM 模型预测分割掩码
            masks, _, _ = predictor.predict(box=np.array([x1, y1, x2, y2]), multimask_output=False)

            # 获取掩码并直接叠加到原图上
            mask = masks[0]  # 使用第一个掩码
            mask_uint8 = mask.astype(np.uint8)  # 将布尔掩码转换为 uint8 类型

            # 调整掩码大小为与原图一致,并直接叠加到原图上
            mask_resized = cv2.resize(mask_uint8, (image_cv.shape[1], image_cv.shape[0]), interpolation=cv2.INTER_NEAREST)
            image_cv[mask_resized == 1] = [0, 0, 255]  # 红色表示分割区域

# 使用 Matplotlib 显示 YOLO 边界框和 SAM 分割的对比
fig, ax = plt.subplots(1, 1, figsize=(10, 10))

# 显示叠加了 SAM 掩码和 YOLO 边界框的原图
ax.imshow(cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB))
ax.set_title("Original Image with SAM Segmentation and YOLO Bounding Box")

plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红黑树学习

红黑树: k v 方式 用在哪里: 1.hash 强查找的过程: 1.rbtree 2.hash 3.b/b tree 4.链表 红黑树: 1.每个结点是红的或者是黑的 2.根结点是黑的 3.每个叶子结点是黑的 4.如果一个结点是红的,则它的两个儿子是黑的 5.对每个节点&…

lrzsz串口文件传输

此时如果需要传输文件,需要借助rz/sz工具,可以使用的传输协议有ZMODEM、YMODEM、XMODEM,默认是ZMODEM。 https://en.wikipedia.org/wiki/ZMODEM https://gallium.inria.fr/~doligez/zmodem/zmodem.txt 这里记录item2下使用rz/sz进行文件传输…

AI驱动的数据智能化:如何提升企业数据处理效率?

在当今数据驱动的时代,企业需要高效、精准的方式来管理和查询日益增长的业务数据。AI技术在这个过程中发挥着至关重要的作用,它通过自动化、智能化的方式处理数据、构建知识模型、实现查询优化,并将复杂的数据结构直观地呈现出来。本文将通过…

Spring Boot 进阶-详解Spring Boot整合数据库

在Java企业级开发中,不可避免的要对数据进行持久化,我们常见的数据持久化的技术又Mybatis技术、Spring自带的JdbcTemplate以及SpringBoot中的JPA技术。但是无论怎么样的持久化技术,其底层都是离不开数据库的支持。 在刚开始学习Java操作数据库的时候,最长用到的技术就是JDB…

SpringBoot中间件Docker

Docker(属于C/S架构软件) 简介与概述 1.Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux …

Mysql数据库原理--查询收尾+索引+事务

文章目录 1.查询收尾1.1自查询1.2合并查询 2.索引事务2.1约束自动生成索引2.2create手动添加索引2.3.删除手动创建的索引2.4索引背后的数据结构2.5B树的结构特点和优点--经典面试题 3.事务--经典面试题3.1基本理解3.2事务的特性3.3隔离级别 1.查询收尾 1.1自查询 子查询就是套…

用Python实现运筹学——Day 13: 线性规划的高级应用

一、学习内容 1. 多目标线性规划 多目标线性规划(MOLP)是线性规划的扩展形式,涉及多个相互冲突的目标函数。这类问题在实际应用中非常普遍,例如在供应链管理中,可能需要同时优化成本、时间、质量等多个目标。由于多个…

MCU8.C51的一些知识补充

由于绝大部分的C语言知识已在C语言学习笔记专栏 点我跳转讲过,本文补充一些没有提到过的(C51标准) 1.C51扩充数据类型 sfr:特殊功能寄存器(special function register) sbit:是特殊功能寄存器(sfr)中的一个位的地址,用于直接定义和访问单个引脚的状态 sfr16:16位特殊功能寄存…

普通程序员如何入手学习大模型(LLM)附学习路线和资源教程

在人工智能(AI)飞速发展的今天,掌握AI技术已经成为了许多高校研究者和职场人士的必备技能。从深度学习到强化学习,从大模型训练到实际应用,AI技术的广度和深度不断拓展。作为一名AI学习者,面对浩瀚的知识海…

深度学习----------------------注意力机制

目录 心理学不随意线索随意线索 注意力机制非参注意力池化层Nadaraya-Watson核回归参数化的注意力机制 总结注意力汇聚:Nadaraya-Watson核回归代码生成数据集核回归非参数注意力汇聚注意力权重该部分总代码 带参数的注意力汇聚将训练数据集转换为键和值训练带参数的…

双11买什么东西比较好?买什么?这份双十一好物清单请查收

​双十一购物节是每年最大的购物狂欢节,很多商品都通过一定的优惠活动进行促销!只不过有些朋友不知道这么大的活动力度,有哪些好物值得放心入手的!于是小编根据这些年在双十一的选购经验,整理了一些实用的购物攻略建议…

新手入门大语言模型学习路线

最近有很多同学想要学习大模型,于是我根据多年的学习经验,总结了一些适合你从 0 到 1 的入门经验,分享给大家呀 1、几个学习大模型必备: 教程:动手学大模型Dive into LLMs 《动手学大模型 Dive into LLMs》:内容丰富&#xff0c…

Linux运维02:WM虚拟机安装Centos7操作系统

Centos7镜像文件下载链接:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)https://mirrors.aliyun.com/centos/7/isos/x86_64/ 1.点击“编辑虚拟机设置”、点击“CD/DVD”、点击“预览”选择镜像文件位置,点击“确定”; 2.点…

【STL】list模拟实现(画图万字解析+代码)

list模拟实现 1 模块分析1.1 list的结构1.2 ListNode的结构1.3 迭代器类 2 ListNode节点设计3 迭代器类设计3.1 迭代器类框架3.2 模板设计3.3 operator()前置和后置3.4 operator--()前置--和后置--3.4 operator*()3.5 operator->()3.6 operator!() 和 operator()3.7 迭代器类…

一张照片变换古风写真,Flux如何做到?

前言 解锁图像创作新体验:ComfyUI指南 在AI图像生成领域,ComfyUI 已成为不可忽视的力量。它是基于Stable Diffusion的图像生成工具,提供了一个节点式图形用户界面(GUI),让用户可以通过简单的拖拽与配置来…

睡眠对于生活的重要性

在快节奏的现代生活中,健康养生不再是遥不可及的概念,而是融入日常每一刻的必需。其中,睡眠作为生命不可或缺的环节,其重要性往往被忽视,实则它是身体修复、能量积蓄的黄金时段。今天,让我们深入探讨“健康…

【橙子老哥】.NetCore 管道模型源码深度解读

hello,大家好,今天又是橙子老哥的分享时间,希望大家一起学习,一起进步。 欢迎加入.net意社区,第一时间了解我们的动态,地址:ccnetcore.com 最近遇到很多小伙伴们问我,自己会.netfr…

【电力系统】Matlab|含风电-光伏-光热电站电力系统N-k安全优化调度模型

摘要 本文提出了一种结合风电、光伏与光热电站的电力系统N-k安全优化调度模型。通过在电力系统中集成多种可再生能源发电技术,优化不同类型电源的调度策略,确保在N-k故障情景下系统的稳定运行。基于Matlab仿真,本文分析了可再生能源发电的功…

路由:ReactRouter

概述 一个路径path对应一个组件component 当我们在浏览器中访问一个path的时候,path对应的组件会在页面中进行渲染。 使用 快速开始 安装依赖 npm i react-router-dom基本使用 import { createBrowserRouter, RouterProvider } from react-router-domconst ro…

【JavaEE初阶】多线程案列之定时器的使用和内部原码模拟

前言: 🌈上期博客:【JavaEE初阶】深入理解多线程阻塞队列的原理,如何实现生产者-消费者模型,以及服务器崩掉原因!!!-CSDN博客 🔥感兴趣的小伙伴看一看小编主页&#xff1…