项目实训(十六)--对SAM进行微调

一、算力的部署

因为我们预计要对SAM模型进行微调的算力还是需要不少的,而我们成员里大家的个人电脑都无法提供比较好的算力支持,因此我们需要去网上租借服务器,进行SAM模型的微调算力部署。

这里我们可以使用AutoDL服务器,实验室的服务器也是在上面租的,因为autodl本身价格并不算太高加上可以按时租借,是比级符合我们的需求的。

学校给我们提供了modelscopre的cpu免费算力,但是如果要微调的话感觉cpu性能还是吃不太消,最好的选择还是使用gpu算力。

我们首先要到Autodl官网进行注册。

接着可以租界适合我们的算力资源,这里我们可以租借4090/3090其实都是够跑的,A100什么的就没太有必要了。

租用后我们就可以使用远程服务器对我们的SAM模型进行微调了。

二、微调代码

我们的微调是在JupyterLab上实现的

首先我们要进行一些依赖包的下载与安装,使用pip install命令即可。

我们还需要准备好我们的数据集,其中包含原始图像和掩码图像。

数据集的获取可以参考之前的博客已经有提到。这里我们就不详细说明数据集了。

原始图像:

用于训练、验证的掩码:

初始化一个空字典bbox_coords,用于存储文件名和对应的边界矩形坐标。
使用Path('scan/').iterdir()获取’scan’目录中的所有文件,并用sorted()函数进行排序。使用列表切片[:1000]获取前一千个文件。
对于每个文件f,执行以下操作:
获取文件名(去掉后缀和可能的数字后缀)并赋值给变量k。
检查k是否不在一个名为stamps_to_exclude的列表中。
使用cv2.imread(f.as_posix())读取图片。
使用cv2.cvtColor()将图片转换为灰度图。
使用cv2.findContours()找到灰度图中的轮廓。cv2.RETR_LIST表示检索所有轮廓,cv2.CHAIN_APPROX_SIMPLE表示压缩水平方向、垂直方向和对角线方向的元素,只保留终点坐标。
从返回值中提取轮廓和层级信息,[-2:]表示只取最后两个返回值,即轮廓和层级。
如果找到的轮廓数量大于1,则:
使用cv2.boundingRect()计算第一个轮廓的最小边界矩形,得到矩形左上角的坐标x,y和矩形的宽w和高h。
获取图片的高度height、宽度width和通道数(这里用_忽略)。
将边界矩形的左上角和右下角坐标保存在bbox_coords字典中,以文件名k作为键。

接着

初始化一个空字典ground_truth_masks,用于存储文件名和对应的真值遮罩。

遍历bbox_coords字典中的所有键(文件名k)。

对于每个键k,执行以下操作:使用cv2.imread()函数读取与文件名对应的遮罩图片。图片路径是通过格式化字符串f'mask/case-0000{k}.png'构建的,其中{k}会被k的值替换。cv2.IMREAD_GRAYSCALE标志表示以灰度模式读取图片。将读取的灰度图片gt_grayscale与0进行比较,得到一个布尔数组,其中值为真的地方表示遮罩上的对应像素为黑色(即对象的一部分),值为假的地方表示遮罩上的对应像素为白色(即背景)。将这个布尔数组作为真值遮罩保存在ground_truth_masks字典中,以文件名k作为键。

我们的训练过程为:

  • 获取并处理输入图像,将其移动到指定的设备(如GPU)。
  • 获取输入图像的大小和原始图像的大小。
  • 使用torch.no_grad()上下文管理器,以便在不需要计算梯度的情况下运行编码器(可能是因为编码器已经预训练或者不需要更新其参数)。
  • 使用sam_model的图像编码器获取图像嵌入(image_embedding)。
  • 转换边界框坐标以适应原始图像大小,并将其转换为PyTorch张量。
  • 使用sam_model的提示编码器(prompt_encoder)获取稀疏和密集的嵌入(sparse_embeddings和dense_embeddings)。
  • 使用sam_model的遮罩解码器(mask_decoder)和上述嵌入来生成低分辨率遮罩(low_res_masks)和交并比(IoU)预测。
  • 将低分辨率遮罩上采样到原始图像大小,并进行归一化和阈值处理以生成二值遮罩(binary_mask)。
  • 调整真值遮罩的大小以匹配生成的遮罩,并将其转换为PyTorch张量。
  • 计算生成的遮罩和真值遮罩之间的损失。
  • 使用优化器optimizer执行反向传播和参数更新。
  • 将当前例子的损失添加到epoch_losses列表中。

我们就可以根据查看epoch:losses判断我们的结果如何。

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值