medsam ,数入xml +img, 根据检测框,原图显示分割效果,加上点的减少处理

1、输入每张图片的多个检测框,得到这张图片的sam 分割结果

import numpy as np
import matplotlib.pyplot as plt
import osjoin = os.path.join
import torch
from segment_anything import sam_model_registry
from skimage import io, transform
import torch.nn.functional as F
import argparse@torch.no_grad()
def medsam_inference(medsam_model, img_embed, box_1024, H, W):box_torch = torch.as_tensor(box_1024, dtype=torch.float, device=img_embed.device)if len(box_torch.shape) == 2:box_torch = box_torch[:, None, :]  # (B, 1, 4)sparse_embeddings, dense_embeddings = medsam_model.prompt_encoder(points=None,boxes=box_torch,masks=None,)low_res_logits, _ = medsam_model.mask_decoder(image_embeddings=img_embed,  # (B, 256, 64, 64)image_pe=medsam_model.prompt_encoder.get_dense_pe(),  # (1, 256, 64, 64)sparse_prompt_embeddings=sparse_embeddings,  # (B, 2, 256)dense_prompt_embeddings=dense_embeddings,  # (B, 256, 64, 64)multimask_output=False,)low_res_pred = torch.sigmoid(low_res_logits)  # (1, 1, 256, 256)low_res_pred = F.interpolate(low_res_pred,size=(H, W),mode="bilinear",align_corners=False,)  # (1, 1, gt.shape)low_res_pred = low_res_pred.squeeze().cpu().numpy()  # (256, 256)medsam_seg = (low_res_pred > 0.5).astype(np.uint8)return medsam_seg# %% load model and image
parser = argparse.ArgumentParser(description="run inference on testing set based on MedSAM"
)
parser.add_argument("-i","--data_path",type=str,default="assets/img_demo.png",help="path to the data folder",
)
parser.add_argument("-o","--seg_path",type=str,default="assets/",help="path to the segmentation folder",
)
parser.add_argument("--box",type=list,default=[95, 255, 190, 350],help="bounding box of the segmentation target",
)
parser.add_argument("--device", type=str, default="cuda:0", help="device")
parser.add_argument("-chk","--checkpoint",type=str,default="work_dir/MedSAM/medsam_vit_b.pth",# default="/home/syy/code/sam/MedSAM-LiteMedSAM/carotid_MedSAM-Lite-Box-20240508-1808/medsam_lite_best1.pth",help="path to the trained model",
)
args = parser.parse_args()device = args.device
medsam_model = sam_model_registry["vit_b"](checkpoint=args.checkpoint)
medsam_model = medsam_model.to(device)
medsam_model.eval()
print("=====================================> 模型加载完毕")import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
import sys
import os
import random import os
import xml.etree.ElementTree as ET
import cv2def parse_xml(xml_path):tree = ET.parse(xml_path)root = tree.getroot()image_name = root.find('filename').textboxes = []labels = []for obj in root.findall('object'):label = obj.find('name').textbbox = obj.find('bndbox')x1 = int(bbox.find('xmin').text)y1 = int(bbox.find('ymin').text)x2 = int(bbox.find('xmax').text)y2 = int(bbox.find('ymax').text)boxes.append((x1, y1, x2, y2))labels.append(label)return image_name, boxes, labelsdef process_xmls(xmls_dir):results = []xml_lists = os.listdir(xmls_dir)xml_lists.sort()for xml_file in xml_lists[0:200]:if xml_file.endswith('.xml'):xml_path = os.path.join(xmls_dir, xml_file)result = parse_xml(xml_path)results.append(result)return resultsdef show_mask(mask, ax, random_color=False):#  mask  模型预测的分割图 01  目标和背景if random_color:color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)else:color = np.array([30/255, 144/255, 255/255, 0.1]) #透明度0.3h, w = mask.shape[-2:]mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1) #将掩码和颜色相乘,得到最终的带有颜色的掩码图像ax.imshow(mask_image) # 不显示mask区域########################################## 找到掩码的轮廓contours, _ = cv2.findContours((mask * 255).astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 对最大的轮廓进行逼近处理,减少轮廓点的数量reduction_factor = 0.002 #0  #0.005if contours:  #没有会返回空areas = [cv2.contourArea(cnt) for cnt in contours]# 找到最大面积的轮廓的索引max_area_index = np.argmax(areas)# 获取最大面积的轮廓largest_contour = contours[max_area_index]           # 对每个轮廓进行逼近处理,减少轮廓if reduction_factor > 0.000001:epsilon = reduction_factor * cv2.arcLength(largest_contour, True)approx = cv2.approxPolyDP(largest_contour, epsilon, True)  # 最大轮廓的操作,平滑轮廓点# 绘制轮廓,减少的点,平滑的不是很好,换一个print("点有没有减少,len(approx),len(contours)",len(approx),len(largest_contour))ax.plot(approx[:, 0, 0], approx[:, 0, 1], color='red', linewidth=1)else:ax.plot(largest_contour[:, 0, 0], largest_contour[:, 0, 1], color='red', linewidth=0.3)def show_points(coords, labels, ax, marker_size=375):pos_points = coords[labels==1]neg_points = coords[labels==0]ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)def show_box(box, ax):x0, y0 = box[0], box[1]w, h = box[2] - box[0], box[3] - box[1]ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='yellow', facecolor=(0,0,0,0), lw=1))def prompt_box_pred(xmls_dir,imgs_dir,save_dir):# 示例用法results = process_xmls(xmls_dir)for ind, res in enumerate(results):image_name, boxes, labels = resprint(ind,': Image:', image_name)# 读取图片和xml 文件,获取坐标img_path = os.path.join(imgs_dir,image_name)# image = cv2.imread(img_path)# if image is None:#     print("=======================> 图片路径不存在",img_path)#     continue# image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # image_height, image_width = image.shape[:2]img_np = io.imread(img_path)if len(img_np.shape) == 2:img_3c = np.repeat(img_np[:, :, None], 3, axis=-1)else:img_3c = img_npH, W, _ = img_3c.shape# %% image preprocessingimg_1024 = transform.resize(img_3c, (1024, 1024), order=3, preserve_range=True, anti_aliasing=True).astype(np.uint8)img_1024 = (img_1024 - img_1024.min()) / np.clip(img_1024.max() - img_1024.min(), a_min=1e-8, a_max=None)  # normalize to [0, 1], (H, W, 3)# convert the shape to (3, H, W)img_1024_tensor = (torch.tensor(img_1024).float().permute(2, 0, 1).unsqueeze(0).to(device))        plt.figure(figsize=(10, 10))  #画布的大小plt.imshow(img_3c)for box, label in zip(boxes, labels):x1, y1, x2, y2 = boxprint('  Label:', label)print('  Box:', x1, y1, x2, y2)input_box = np.array(box) box_np = np.array([box]) # transfer box_np t0 1024x1024 scalebox_1024 = box_np / np.array([W, H, W, H]) * 1024#  预测图片的分割标签with torch.no_grad():image_embedding = medsam_model.image_encoder(img_1024_tensor)  # (1, 256, 64, 64)medsam_seg = medsam_inference(medsam_model, image_embedding, box_1024, H, W)  #分割最后输出原图大小# print(medsam_seg.shape) #(127, 212)# print(img_3c.shape) # (127, 212, 3)show_mask(medsam_seg, plt.gca())show_box(input_box, plt.gca())plt.axis('off')# plt.show()###  bbox_inches='tight'表示将图像边缘紧贴画布边缘,pad_inches=0表示不添加额外的边距plt.savefig(save_dir + image_name,bbox_inches='tight', pad_inches=0) #) # 一张图保存多个框   if __name__ == "__main__":xmls_dir = '/home/syy/data/甲乳/breast/image2/xmls'imgs_dir = '/home/syy/data/甲乳/breast/image2/images' save_dir = "/home/syy/data/甲乳/breast/image2/medsam/"   os.makedirs(save_dir,exist_ok=True)prompt_box_pred(xmls_dir,imgs_dir,save_dir)    

在这里插入图片描述

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

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

相关文章

轧钢测径仪分析软件,四大图表带来产线新视角!

轧钢测径仪是智能化检测设备,除了测径仪主体外,还配有测控软件系统,从这里可对测径仪进行各种设置,亦可从此观测到测径仪获得的各种信息,如检测信息、分析图表、计算尺寸、历史数据等。而从测径仪获得的图表信息主要有…

伦敦银和现货白银是一回事吗

伦敦银和现货白银不能直接完全地画上等号,但如果投资者所指指的是国际市场上的现货白银交易,那么二者应该是等同的——因为在国际贵金属投资市场上,现货白银的别称就是伦敦银,伦敦银和现货白银指的其实是同一回事。 因为早在很多个…

代码随想录-算法训练营day47【动态规划09:打家劫舍、打家劫舍II、打家劫舍III】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part09● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III详细布置 今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。198.打家劫舍 视频讲解:h…

Qt使用setColumnHidden()函数隐藏列后无法再次显示出来,解决方法

调用:setColumnHidden()后,紧接着调用resizeColumnsToContents(),但是这样会改变之前设置的列宽,所以要在写个函数保存之前设置的列宽,然后调用resizeColumnsToContents(),再恢复列宽。 例子: ...........…

ES报错1

ES在kibana的JSON如图: 提交后错误信息如下 所以是什么错误呢: 原来是:json的格式有误改成 这里的错误其实是我在文件传输时,为了节约空间,没有以json格式传递,而是一串字符就传过来了,需要使用josn的格式化工具格式化才行,结果格式化的不正确,才遇到此坑

go语言方法之通过嵌入结构体来扩展类型

我们先来看看这个类型: import "image/color"type Point struct{ X, Y float64 }type ColoredPoint struct {PointColor color.RGBA } 我们完全可以将ColoredPoint定义为一个有三个字段的struct,但是我们却将Point这个类型嵌 入到ColoredPoin…

图片处理软件有哪些?这三款软件好用

图片处理软件有哪些?在当今这个数字化时代,图片处理软件成为了我们日常生活和工作中不可或缺的工具。无论是为了修饰个人照片,还是为了设计专业海报,这些软件都能帮助我们轻松实现创意和美化。那么,究竟有哪些热门的图…

【因果推断python】1_因果关系初步1

目录 为什么需要关心因果关系? 回答不同类型的问题 当关联确实是因果时 为什么需要关心因果关系? 首先,您可能想知道:它对我有什么好处?下面的文字就将围绕“它”展开: 回答不同类型的问题 机器学习目…

数据结构【队列】

队列的的概念 队列是一种特殊的线性表,特殊之处在于它只允许在表的头部进行删除操作,而在表的尾部进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中…

Nginx R31 doc-10-NGINX Reverse Proxy 反向代理

配置 NGINX 作为反向代理 配置 NGINX 作为反向代理用于 HTTP 和其他协议,支持修改请求头和对响应进行细粒度的缓冲。 本文介绍了代理服务器的基本配置。您将学习如何将请求从 NGINX 转发到不同协议的代理服务器上,修改发送到代理服务器的客户端请求头&…

全球首个多语种手语视频生成模型诞生:SignLLM

近日,一项名为 SignLLM 的新型 AI 技术取得了突破性进展,或将彻底改变听障人士的沟通方式。作为全球首个多语种手语生成模型,SignLLM 能够将输入的文本或语音指令,实时转化为对应的手语手势视频,为打破语言障碍、促进信…

TiDB-从0到1-分布式事务

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCC 一、事务定义 这属于老生常谈了,无论不管是传统事务还是分布式事务都离不开ACID A:原子性C:一致性I:隔离性D:…

怎么查看 iOS ipa包 mobileprovision 改动

查看 iOS .ipa 包中的 .mobileprovision 文件(即配置文件或描述文件)的改动,可以通过以下步骤进行: 重命名 .ipa 文件:将 .ipa 文件扩展名改为 .zip。例如,如果文件名为 MyApp.ipa,则重命名为 M…

A 股涨停板实时数据 API 数据接口

A 股涨停板实时数据 API 数据接口 股票 / A股 / 涨停数据,所有A股涨停板实时数据,A 股涨停数据 / 实时数据。 1. 产品功能 支持所有 A 股涨停板实时数据查询;包含 A 股实时交易多项指标数据;毫秒级查询性能;全接口支…

Linux系统编程(五)多线程创建与退出

目录 一、基本知识点二、线程的编译三、 线程相关函数1. 线程的创建(1)整型的传入与接收(2)浮点数的传入与接收(3)字符串的传入与接收(4)结构体的传入与接收 2. 线程的退出3. 线程的…

机器学习笔记——线性回归、梯度下降

线性回归 什么是线性回归就不说了,直接说线性回归的目标就是首先需要一个损失函数,使得损失函数最小化来训练得出的模型,最常用的损失函数是均方误差 例子 如果要预测房屋平均售价之前需要对数据标准化,用到StandarScalar这个类&…

FastGPT私有化部署+OneAPI配置大模型

介绍 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! 官网地址 https://doc.fastai.site/docs/intro/ 部署 FastGPT提供…

frp转发服务

将内网服务转发到外网,我准备了一台阿里云ubuntu22.04服务器,两台内网ubuntu22.04服务器 下载frpc和frps以及配置文件 链接: https://pan.baidu.com/s/1auvcWWnyfpYPYatYhHFYag?pwdqkgh 提取码: qkgh 复制这段内容后打开百度网盘手机App,操作…

如何实现数据的正确拆分?

我们知道在传统的单块架构中,一个系统中只存在一个独立的服务和数据库实例。 上图中的系统架构实现起来比较简单,但是扩展性和伸缩性都比较差。因此,越来越多的系统开始采用了微服务架构。在微服务架构中,一个系统被拆分成多个服务…

6种经典的网页布局设计,你最喜欢哪个?

信息时代,我们每天都会浏览很多网页,但你有没有想过,让你停留在一个新网页的关键因素有哪些?毫无疑问,网页布局一定是关键因素之一。一个优秀的网页布局不仅可以让网站看起来更美观、更专业,还能够抓住用户…