SAM-Med2D 大模型学习笔记(续):训练自己数据集

news2024/9/19 10:45:37

1、前言、数据集介绍

SAM-Med2D大模型介绍参考上文:第三章:SAM-Med2D大模型复现-CSDN博客

本文将使用SAM-Med2D大模型训练自己的数据集

关于SAM-Med2D大模型官方demo数据集的介绍上文已经介绍过,这里简单回顾下

  • 其中data_demo为数据集的目录,下面有images和masks两个目录,分别存放数据和标签
  • 其中images,就是正常的数据图像,格式是png格式
  • masks格式值得注意,正常的mask是灰度等级的阈值图像【0 1 2 3】,这里把每个类别单独提取出来,变成【0 255】的二值图像,有几个类别就有几张对应的mask模板

例如mask是【0 1 2 2 1】,mask模板有两个,分别是1对应的模板【0 255 0 0 255】,就是只分割前景1。以及只是分割2的模板【0 0 255 255 0】。

mask的命名可以是image名字加上灰度,例如image_1.png和image_2.png

两个json文件如下:

训练数据就是单张image对应的一组mask标签字典

测试集是mask对应的image

2、生成数据的脚本

有了上面介绍,就很简单了,也就是说我们只需要把自己的数据集换成上面格式就可以正常训练了!

其他补充,因为官方的image和mask都是png格式的。

格式需要是png,因为之前本人做过实验只有png保存的二值图像,灰度值才不会乱掉(比如你保存【0 255 0】的jpg读取,np.unique读取可能变成【0 224 223】之类的)

更改文件后缀可以参考:PYTHON 自动化办公:更改图片后缀_改变文件夹里面图片后缀名的pytorch代码-CSDN博客

这里需要把自己的数据集摆放如下:

划分数据集的脚本参考:关于图像分割任务中按照比例将数据集随机划分成训练集和测试集_图像数据划分训练集-CSDN博客

然后运行下面代码就行了:

这个代码会生成image对应mask不同类别的掩膜数据,并且生成两个json文件。这里的目录命名一定要和上面对应

import json
import numpy as np
from tqdm import tqdm
import os
import shutil
from PIL import Image
import cv2


def mkdir():
    root = 'data_demo'
    if os.path.exists(root):
        shutil.rmtree(root)
    os.mkdir(root)
    os.mkdir(os.path.join(root,'images'))
    os.mkdir(os.path.join(root,'masks'))


# 生成训练集
def gen_trainSet(img_suff,msk_suff):
    p = 'RawData/train/images'
    image_list = [os.path.join(p,i) for i in os.listdir(p)]

    with open('data_demo/image2label_train.json', 'a') as jf:
        json_all ={}        # json文件
        for i in tqdm(image_list,desc='generate train set'):
            j = i.replace('images','masks').replace(img_suff,msk_suff)
            assert os.path.exists(j)        # 判断label是否存在

            shutil.copy(i,'data_demo/images')

            mask = np.array(Image.open(j).convert('L'))     # 标签图像
            gray_list = np.unique(mask)

            img_list = []
            for gray in gray_list[1:]:          # 遍历mask所有的分割前景
                ret_mask = np.zeros(mask.shape,dtype=np.uint8)

                ret_mask[mask==gray] =255      # 指定前景为255,其余为背景
                ret_mask[ret_mask<255] = 0

                # 去除小的分割区域
                h,w = ret_mask.shape
                total_pixel = h*w
                if (np.sum(ret_mask!=0)/total_pixel) < 0.005:
                    continue

                ret_name =i.replace(img_suff,'_'+str(gray)+img_suff).replace('RawData/train/images','data_demo/masks')
                cv2.imwrite(ret_name,ret_mask)  # 保存生成的数据

                img_list.append(ret_name)
            if len(img_list) == 0:
                continue
            json_all[i.replace('RawData/train/images','data_demo/images')] = img_list

        json_str = json.dumps(json_all,indent=4)
        jf.write(json_str)


# 生成测试集
def gen_testSet(img_suff,msk_suff):
    p = 'RawData/test/images'
    image_list = [os.path.join(p,i) for i in os.listdir(p)]

    with open('data_demo/label2image_test.json', 'a') as jf:
        json_all ={}        # json文件
        for i in tqdm(image_list,desc='generate test set'):
            j = i.replace('images','masks').replace(img_suff,msk_suff)
            assert os.path.exists(j)        # 判断label是否存在

            shutil.copy(i,'data_demo/images')

            mask = np.array(Image.open(j).convert('L'))     # 标签图像
            gray_list = np.unique(mask)

            for gray in gray_list[1:]:          # 遍历mask所有的分割前景
                ret_mask = np.zeros(mask.shape,dtype=np.uint8)

                ret_mask[mask==gray] =255      # 指定前景为255,其余为背景
                ret_mask[ret_mask<255] = 0

                # 去除小的分割区域
                h,w = ret_mask.shape
                total_pixel = h*w
                if (np.sum(ret_mask!=0)/total_pixel) < 0.005:
                    continue

                ret_name =i.replace(img_suff,'_'+str(gray)+img_suff).replace('RawData/test/images','data_demo/masks')
                cv2.imwrite(ret_name,ret_mask)  # 保存生成的数据

                json_all[ret_name] = i.replace('RawData/test/images','data_demo/images')

        json_str = json.dumps(json_all,indent=4)
        jf.write(json_str)


if __name__ == '__main__':
    imgFormat = '.png'          # image 的后缀
    maskFormat = '.png'         # mask 的后缀

    mkdir()         # 生成目录

    gen_trainSet(img_suff=imgFormat,msk_suff=maskFormat)        # 生成训练数据

    gen_testSet(img_suff=imgFormat,msk_suff=maskFormat)         # 生成测试数据

Tips

运行过程如下

如下:

可以看到image生成了三个对应的mask数据,命名是image的名字加上类别。

下图的8 9 17后缀是原来mask中8 9 17的像素值

测试代码的时候,训练会报错误,大概是len(box)什么分母为零,不能被除的bug。本人猜测可能是生成的组mask里面,前景区域太小之类的,所有脚本里增加点处理

代码会将不足千分之五的分割前景区域删除

3、训练脚本

因为生成的数据就是data_demo目录,所有train脚本不需要任何更改,直接运行即可

这里的parser.add_argument("--mask_num", type=int, default=5, help="get mask number")参数还是没懂

生成的结果如下:每个权重大约2G左右吧

4、测试脚本

代码如下:

python test.py --sam_checkpoint workdir/models/sam-med2d/epoch10_sam.pth

测试结果如下:

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

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

相关文章

你的工作环境,选对劳保鞋了吗?守护安全,从脚下开始!

在众多的工作场所中&#xff0c;我们穿梭于不同的工作环境&#xff0c;从繁忙的工厂车间到复杂的建筑工地&#xff0c;再到需要精细操作的实验室……每一步都承载着对安全的期许和对效率的追求。但你是否意识到&#xff0c;脚下那双不起眼的劳保鞋&#xff0c;其实是守护你安全…

洞见优维「全面可观测」:从85%的AI项目败率说起

一直以来&#xff0c;优维都坚信AI有潜力改变运维行业并促进创新&#xff0c;这是我们的A面。但从行业和客户那里&#xff0c;我们所看到的B面也不容忽视。 自从去年底发布优维全面可观测以来&#xff08;点击回顾&#xff09;&#xff0c;我们的团队在服务客户的进程中常常感…

国内下载gradle慢,下载gradle超时问题解决【笔记】

下载gradle超时、慢 修改 找到项目中的gradle-wrapper.properties文件 修改 替换默认下载链接地址 distributionUrlhttps\://services.gradle.org/distributions替换为腾讯或阿里的链接地址 厂商链接阿里https://mirrors.aliyun.com/macports/distfiles/gradle腾讯https://…

vue请求springboot接口下载zip文件

说明 其实只需要按照普通文件流下载即可&#xff0c;以下是一个例子&#xff0c;仅供参考。 springboot接口 RestController RequestMapping("/api/files") public class FileController {GetMapping("/download")public ResponseEntity<Resource>…

C++ 多态三

1.多态的概念 多态的前提的是继承。当不同的对象去完成同一种行为时会产生不同的结果就是多态的通俗意义。 例如学生、成人两个对象去完成买票这个行为&#xff0c;那么学生的结果是获得半价&#xff0c;而成人获得的结果的是全价。 2.多态的定义及实现 2.1构成多态的两个硬…

自闭症学校排名前十,揭秘顶级干预学校

在当今社会&#xff0c;自闭症儿童的数量不断上升&#xff0c;众多家庭都在全力以赴地为孩子寻找适宜的自闭症学校。当面临这一重要抉择时&#xff0c;家长们常常首先想到的便是查看自闭症学校排名前十的榜单。然而&#xff0c;网络上此类排名繁多&#xff0c;其真实性与可靠性…

国产光耦的工作原理、优势以及应用介绍

国产光耦作为一种关键的电子元件&#xff0c;因其卓越的光隔离特性&#xff0c;被广泛应用于电气隔离和信号隔离领域。其可靠的性能使其在电源管理、数据通信和音频处理等领域发挥重要作用。 国产光耦是由发光二极管&#xff08;LED&#xff09;和光敏器件&#xff08;如光敏晶…

查理三世的假期并不理想 对泰勒·斯威夫特主题舞会引发的骚乱未采取其他行动遭各方批评

当查理三世国王在苏格兰巴尔莫勒尔堡享受一年一度的夏日假期时&#xff0c;英国其他地区却在应对由 7 月 29 日泰勒斯威夫特主题舞会上持刀袭击而引发的骚乱。王室成员在宫殿高墙内休息&#xff0c;而暴力事件却不断增多&#xff0c;这种对比让许多原本忠实的粉丝感到不安。 由…

C# 在Word中插入或删除分节符

在Word中&#xff0c;分节符是一种强大的工具&#xff0c;用于将文档分成不同的部分&#xff0c;每个部分可以有独立的页面设置&#xff0c;如页边距、纸张方向、页眉和页脚等。正确使用分节符可以极大地提升文档的组织性和专业性&#xff0c;特别是在长文档中&#xff0c;需要…

BCrypt加密算法的使用及原理

系列文章目录 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&#xff1e;实现自定义字符串排序&#xff08;key排序、Val…

69、zabbix自动、代理、snmp监控

一、zabbix 1.1、自动发现 [roottest1 ~]# systemctl stop firewalld [roottest1 ~]# setenforce 0 [roottest3 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 [roottest1 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 ------------…

AI智能名片B2B2C商城系统:优化三度空间渠道布局与避免渠道冲突的新策略

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;品牌商面临着前所未有的市场挑战与机遇。为了应对这些挑战并抓住机遇&#xff0c;品牌商需要构建并优化一个高效、协同的三度空间&#xff08;线下实体店、线上电商平台、数字营销渠道&#xff09;渠道布局。本文深入探讨了AI…

【多线程-从零开始-玖】内核态,用户态,线程池的参数、使用方法详解

文章目录 1. 为什么会有线程池2. 内核态和用户态2.1 场景构造 3. 标准库的线程池3.1 构造方法的参数3.1.1 核心线程数和最大线程数3.1.2 非核心线程允许摸鱼的最大时间3.1.3 工作队列&#xff08;阻塞队列&#xff09;3.1.4 线程工厂工厂设计模式 3.1.5 拒绝策略四种拒绝策略 3…

极投影ax.contourf

我想用极投影画个类似下面这样的效果图&#xff0c;首先底图是一个这样的&#xff0c;然后再有需要的地方做标记&#xff0c;比如斜线和渔网状的东西。 但是我怎么尝试都是得到了一个下面这样的图这样肯定有问题 我调整为画轮廓线之后变成下面这样的图&#xff0c;我猜想应该是…

Python酷库之旅-第三方库Pandas(073)

目录 一、用法精讲 296、pandas.Series.dt.as_unit方法 296-1、语法 296-2、参数 296-3、功能 296-4、返回值 296-5、说明 296-6、用法 296-6-1、数据准备 296-6-2、代码示例 296-6-3、结果输出 297、pandas.Series.dt.days属性 297-1、语法 297-2、参数 297-3、…

Ansys Mechanical|解决温度场-电场耦合问题

一.多物理场耦合分析的必要性 你是否曾经碰到过你的模型受到两个或者更多物理因素影响的情况吗&#xff1f;这些物理因素不仅会相互影响&#xff0c;还会影响计算结果。 这时多物理场分析就有用了。在解决多物理场影响的工程问题时&#xff0c;多物理场耦合分析是必要的。 举…

IO进程----标准IO

目录 IO进程 标准IO 1. 概念&#xff1a; 2. 特点&#xff1a; 3. 缓存区 3.1. 行缓存&#xff1a;和终端操作相关 刷新缓存的条件&#xff1a; 1) 程序正常退出 2) \n刷新 3) 缓存区满刷新 4) 强制刷新 fflush 3.2. 全缓存&#xff1a;和文件操作相关 3.…

【C++】模版详解

1、概念 C模版分两类&#xff1a;函数模版和类模版 1&#xff09;函数模板的格式 template <class 形参名&#xff0c;class 形参名&#xff0c;......> 返回类型 函数名(参数列表) {函数体 }例如&#xff1a; template <class T> void swap(T& a, T& b…

android13 关闭selinux 临时关闭或者永久关闭

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 2.1 临时关闭 2.2 永久关闭 3.修改方法 3.1 临时修改 3.2 永久关闭 4.编译测试 5.彩蛋 1.前言 在Android操作系统中,SELinux(Security-Enhanced Linux)是一种安全模块,用于提供强制访问控制(MAC)安全…

为什么不用postman做自动化

面试的时候被问到&#xff1a;为什么不用postman做自动化 打开postman&#xff0c;看到用例集管理、API 管理、环境管理这三个功能&#xff0c;用户体验感算得上品牌等级了 为什么不用呢&#xff0c;文心一言给了一些答案 不适合大规模自动化测试&#xff1a;Postman 主要是为…