SAM 提示框和 Unet的语义分割的融合:自动驾驶车道线分割

news2024/9/21 16:22:55

1、前言

最近SAM 模型复现的多了,看了不少官方的源码,尝试下SAM和Unet的结合

SAM的提示分割,其实就是在分割的时候,为数据增加一个提示信息,可以是框,点,或者文本等等。这样大模型网络就可以根据提示信息进行分割

SAM模型的复现可以参考:视觉大模型学习笔记_听风吹等浪起的博客-CSDN博客

如下图,就是手动的给出提示框,然后网络分割出框里的内容

需要注意的是,本文不对SAM的原理进行讲解,只是借鉴SAM的提示分割思想,将其和unet结合

其实,思想很简单,一般的图像分割网络是3通道的,因为图像都是RGB的。

而这里需要传入sam的提示信息,所以还要增加一个维度,也就是说最开始输入神经网络的的通道是4维度的!

神经网络输入四维度很好实现,就是更改卷积核的个数罢了。毕竟正常神经网络隐藏层都是上百个,这里一开始和输入和中间隐藏层没啥区别,就是更改个数字罢了

实现了输入,最重要的是怎么把数据传进去!!!这里非常重要!!!

看了 MedSAM 源码实现,发现实现的思路确实很巧妙

大概思路就是,在图像上加上一层canvas,是全黑的。然后对mask的前景分割类别随机挑选一个,变成二值数据,这样就可以求取min和max,就可以得到box,将这个box传给canvas就可以达到提示框的目的

这里后面会根据代码介绍

2、SAM 提示框分割

SAM的提示信息分割有好几种,因为本人是医学图像专业,这里只实现了提示框分割。

其实点提示分割也很简单,明白了提示框分割的思路后,点分割就是怎么对数据处理的问题。或者就是把canvas的提示框换成其他mask模板。

点提示的话,可以用区域生长进行掩膜?

提示框的作用是什么呢?

说白了就是让网络更集中在一块区域, 对指定区域进行分割。

一般的语义分割,就是image和mask 一一对应,然后交叉熵、优化。这样网络同时要预测好几个类别,这也是为啥多类别分割效果不如二值分割好的原因

而提示框的box选定后,不管mask中有几个类别,这样mask都会变成二值的。

就像下面,分割的前景好十来个,但是我们绘制了box圈中小车后,那么对于网络来说,就是二值的分割。也就是前景车1 ,背景是除车的所有区域

代码实现的思路很简单,mask是0 1 2 3 4等等阈值图像,我们随机选中一个值,只取出这个值的数据。例如是3,那么除了3位置(x,y)得其他区域全部是0,3变成了新的阈值前景,这样不就是二值图像了嘛!!

至于二值图像,计算前景的min,max,就可以绘制边界框,这样就是sam提示框分割的精髓。代码实现如下

        label_ids = np.unique(mask)[1:]
        label_id = random.choice(label_ids.tolist())
        mask = np.uint8(mask == label_id)  # only one label

自动添加边界框:

        y_indices, x_indices = np.where(mask > 0)
        x_min, x_max = np.min(x_indices), np.max(x_indices)
        y_min, y_max = np.min(y_indices), np.max(y_indices)

这样输入的数据就不是RGB图像,而是RGB+canvas(矩形边界框)的四通道数据

注意:这里的操作都是在dataset脚本实现的

3、Unet 网络

unet网络分割思想很简单,之前写了很多关于unet分割的介绍,自己参考就行

UNet 网络做图像分割DRIVE数据集-CSDN博客

图像分割_听风吹等浪起的博客-CSDN博客

 

因为datase已经产生了四通道的数据,所有unet的输入是4维的,而输出是二值图像,所有outout是2维的

这里用1,因为后面用了 DiceCELoss 损失,而非交叉熵

Tips:

虽然Unet网络略显过时,什么DenseUne、TransUnet、SwinUnet等等都很好。

这里为了方便只是将sam和Unet结合,如果需要把sam和其他分割网络结合,把上面的model换成想要的分割模型,定义输入4,输出1就行

其他的代码不需要更改!

4、实验准备

环境如下,pip安装即可

matplotlib==3.9.2
monai==1.3.1
numpy==2.1.0
opencv_python==4.10.0.82
Pillow==10.4.0
torch==2.0.0
torchvision==0.15.1
tqdm==4.66.4

4.1 数据集

数据集使用的是自动驾驶车道线的分割,标签如下,可视化如下

0	 background
1	 white_lines
2	 yellow_lines

数据集摆放如下:

--data--train---images   训练集的图像
--data--train---masks    训练集的图像标签
--data--val---images     验证集的图像
--data--val---masks      验证集的图像标签

 

4.2 训练

因为SAM提示框每次都是挑选一个前景分割,对于类别多的话,epoch最好设置的多点

参数如下:

    parser = argparse.ArgumentParser(description="SamUnet segmentation")
    parser.add_argument("--batch-size", default=8, type=int)
    parser.add_argument("--epochs", default=200, type=int)
    parser.add_argument('--lr', default=0.01, type=float)
    parser.add_argument('--lrf',default=0.0001,type=float)                  # 最终学习率 = lr * lrf

    parser.add_argument("--img_f", default='.jpg', type=str)               # 数据图像的后缀
    parser.add_argument("--mask_f", default='_mask.png', type=str)              # mask图像的后缀

    args = parser.parse_args()

训练集和验证集的比例约为3:1

数据的输入效果:

注意,这里前景应该是白色的,但由于白色不太好区别,这里填充为红色

loss和dice的曲线:

4.3 推理

这里编写了简单的ui推理界面,如下

 

这里会打印矩形框的坐标:

 

5、1 项目下载

项目为付费资源,包含数据集、完整代码、训练权重等等

完整测试项目:基于Unet+SAM提示框实现的自动驾驶道路线语义分割、数据集、源码、训练权重资源-CSDN文库

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

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

相关文章

【Python】简单的爬虫抓取

效果:抓取某个学校网站的教授名录,并获取研究方向。 由于网站使用的都是明文,所以抓起来没什么难度,且平时访问量小,很值得用来练习。 代码如下,解释请见注释 import timeimport requests from bs4 impor…

RN开发问题

1、滚动项定位错误 ERROR Invariant Violation: scrollToIndex should be used in conjunction with getItemLayout or onScrollToIndexFailed, otherwise there is no way to know the location of offscreen indices or handle failures. 原因:已修复&#xff0c…

求一个使用C语言将重力加速度gx,gy,gz积分获取到速度的代码

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (一) 依赖库编译、第三方库编译安装

目录 1 jetson-ffmpeg的编译安装与配置--用来做视频编码、视频解码 2 CV-CUDA库的编译安装与配置--用来做图像缩放、裁剪、色域转换 3 cuda cudnn TensorRT相关库的拷贝与配置 3.1将cuda cudnn TensorRT相关的头文件拷贝到工程中 3.2 将cuda cudnn TensorRT相关的库拷贝到…

docker实战基础一

一、docker安装 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 Doc…

FlowUs:强大图表功能与多维表结合,开启便捷办公新时代

在当今数字化办公的浪潮中,我们一直在寻找一款能够高效整合数据、清晰呈现信息的工具。而 FlowUs 以其强大的图表功能结合多维表的能力,为我们带来了前所未有的便捷体验。 一、多维表:数据管理的强大基石 FlowUs 的多维表功能就像是一个数据魔…

016_Save_the_picture_in_Matlab中保存图片

图片文件 Matlab核心功能包括出图,印刷质量的图片输出是Matlab核心竞争力之一,matplotlib疯狂追赶,但还是差距明显。出图的含义就是:打印或者导出图形窗体的内容,可供后续使用。在Matlab中,这个行为被定义…

弗洛伊德(Floyd)算法(C/C++)

弗洛伊德算法(Floyds algorithm),又称为弗洛伊德-沃尔什算法(Floyd-Warshall algorithm),是一种用于在加权图中找到所有顶点对之间最短路径的算法。这个算法适用于有向图和无向图,并且可以处理负…

[YM]课设-C#-WebApi-Vue-员工管理系统 (五)登录

分析: 请求路径:/login 请求方式:POST 接口描述:该接口用于员工登录Tlias智能学习辅助系统,登录完毕后,系统下发JWT令牌。 > api文档中提到JWT令牌 这个相对来说比较复杂 是用来加密,…

那些生意好的厂家如何找到目标客户呢?

寻找并精准定位目标客户是任何一家追求持续发展与业务增长的厂家必须掌握的关键技能。那些生意兴隆的厂家之所以能够脱颖而出,很大程度上得益于他们高效且精准的客户寻找策略。今天,我们将深入探讨这些成功厂家如何精准找到并吸引目标客户。 01明确目标…

基于梯度提升系列算法对二手车价格预测分析与研究

目录 1 引言 1.1 研究背景 1.2 研究目的 1.3 研究意义 1.3 国内外现状 1.4 研究思路与组织框架 2 关键技术理论介绍 2.1 二手车市场介绍 2.2 梯度提升回归系列算法介绍 3 数据来源及预处理 3.1 数据来源及说明 3.2 数据预处理及特征变换 第4章 数据分析及可视化 4.1 分析思路及…

自闭症孩子的康复治疗方法

在星贝育园,我们深知自闭症给孩子和家庭带来的巨大挑战。作为特教老师和生活老师,我们秉持着专业、负责的态度,为自闭症患儿提供全方位的康复治疗。 我们实行 24 小时陪伴,365 天全年无休的密集干预模式。这种模式能够确保孩子在任…

[Leetcode 216][Medium]组合总和 III--回溯

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 对于组合问题,首先要想到回溯法。那么可以根据回溯法模版进行设计。 void backtrace(元素){if(满足题目要求的条件){保存目前路径/状态/结果;return;}for循环,往目前状态相邻的所…

100天带你精通Python——第8天面向对象编程

文章目录 前言面向对象技术简介类(Class)对象(Object)继承(Inheritance)封装(Encapsulation)多态(Polymorphism)Python类详解静态变量(Static Var…

【算法】演员~评论家方法

一、引言 演员-评论家算法(Actors-Critics Method)是一种用于并发编程中的同步机制,用于解决多线程环境下的资源竞争问题。与传统的锁和信号量等同步工具不同,演员-评论家方法采用更加灵活的协作策略。算法结合了策略梯度&#xf…

嵌入式Linux C应用编程指南-进程与线程(速记版)

第九章 进程 9.1 进程与程序 9.1.1 main()函数由谁调用? C 语言程序总是从 main 函数开始执行,main()函数的原型是: int main(void) 或 int main(int argc, char *argv[])。 操作系统下的应用程序在运行 main()函数之前需要先执行一段引导代…

「青鸟」作家导演起飞计划,助人才转型,共铸电影市场新活力

2024年6月,《上海市电影高质量发展三年行动计划》发布「青鸟」作家导演起飞计划应运而生(下文简称「青鸟计划」)。作为全国首个协助作家跨界转型、用画面讲好故事的扶持平台,青鸟计划重视电影的文学性,通过专业人士搭建…

PyQt5:pycharm设置及使用

前言 PyQt5 是一个用于创建图形用户界面的 Python 库,它是 Qt 应用程序框架的 Python 绑定。Qt 是一个广泛使用的跨平台 C 框架,PyQt5 允许开发者使用 Python 编写图形界面应用程序,而不必直接使用 C。 为了方便地使用它,我尝试在…

springboot中分页插件的使用

安装依赖 这里有个版本的报错&#xff0c;循环依赖的问题&#xff0c;大家可以去具体查下&#xff0c;我这是sp3,所以要选择高点的版本&#xff0c;否则启动会报错 <!--mybatis起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId>&l…

5 本顶级LMM和AIGC书籍

本文回顾了五本探讨大型语言模型 (LLM) 和生成式人工智能等快速发展领域的关键书籍,为这些变革性技术提供了重要见解。 《NLP with Transformers》向读者介绍了用于自然语言处理的 Transformer 架构,并提供了使用 Hugging Face 进行文本分类等任务的实用指导。Sebastian Ras…