图像分割 sam1 - MKT

news/2025/10/22 1:39:52/文章来源:https://www.cnblogs.com/gooutlook/p/19156755

 

版本1

https://github.com/facebookresearch/segment-anything?tab=readme-ov-file#model-checkpoints

最新的是2

https://github.com/facebookresearch/sam2

 

环境 cuda11.8 配置

 

全图检测

image

 

image

 

image

 

image

 

 

import numpy as np
import cv2
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry
import torch
import time
'''
环境
win11 coinda - base  python12官方源码
git clone https://github.com/facebookresearch/segment-anything.git
cd segment-anything权重文件需手动下载​
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pthPyTorch 需要单独安装​
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118依赖库
pip install matplotlib pycocotools opencv-python onnx onnxruntime
# 代码格式工具
pip install flake8 isort black mypy
​
pip install segment_anything[all]'''# 1. 设置设备(GPU/CPU)
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using device: {device}")def get_model_info(size_key):"""根据输入返回模型信息"""return model_mapping.get(size_key, ("未知", "未知"))# 定义模型映射字典
model_ = {"Mode2_4g": ("vit_h", "sam_vit_h_4b8939.pth"),"Mode1_2g": ("vit_l", "sam_vit_l_0b3195.pth"),"Mode300mb": ("vit_b", "sam_vit_b_01ec64.pth")
}# 1 图像缩放倍数
scalse=2 
# 2 模型选择 最大2_4g    中间1_2g  最小300mb
mode_test='Mode300mb'
model_type, checkpoint_path = model_.get(mode_test, ("vit_b", "sam_vit_b_01ec64.pth")) # 默认数据# 1. 初始化模型
'''
vit_b
vit_l
vit_h
'''
#model_type = "vit_b"  # 对应 sam_vit_b_01ec64.pth  
'''
sam_vit_b_01ec64 300mb
sam_vit_l_0b3195 1.2g
sam_vit_h_4b8939 2.4g'''#checkpoint_path = "./sam_vit_b_01ec64.pth"  # 假设权重文件在当前目录
sam = sam_model_registry[model_type](checkpoint=checkpoint_path)
#sam = sam_model_registry[model_type](checkpoint=checkpoint_path).to('cpu')
sam.to(device)  # 将模型移至 GPU(如果可用)# 2. 配置自动分割生成器(参数可根据需求调整)
# mask_generator = SamAutomaticMaskGenerator(
#     sam,
#     points_per_side=40,       # 高空图像需要更密集的点
#     pred_iou_thresh=0.9,      # 提高质量要求
#     min_mask_region_area=200  # 过滤小区域
# )# #Q2: 分割结果过于碎片化​​
# # 调整参数
# mask_generator = SamAutomaticMaskGenerator(
#     sam,
#     points_per_side=20,       # 减少点数
#     pred_iou_thresh=0.9,      # 提高质量阈值
#     stability_score_thresh=0.95
# )mask_generator = SamAutomaticMaskGenerator(model=sam,points_per_side=32,          # 每边生成的点数pred_iou_thresh=0.86,        # 掩膜质量阈值stability_score_thresh=0.92, # 稳定性阈值crop_n_layers=0,             # 不使用多层级裁剪crop_overlap_ratio=0.3,      # 裁剪重叠比例min_mask_region_area=100     # 最小掩膜区域面积(像素)
)# 3. 加载并预处理图像
image_path = "npu5pm.JPG"      # 测试图像路径
image = cv2.imread(image_path)height, width = image.shape[:2]
new_width = int(width // scalse)
new_height = int(height // scalse)image = cv2.resize(image, (new_width, new_height))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转为RGB格式# 4. 生成分割掩膜
start_time = time.time()
masks = mask_generator.generate(image)
end_time = time.time()
print(f"预测耗时:{end_time - start_time:.4f} 秒")  # 保留4位小数# 5. 可视化结果(可选)
output_image = image.copy()
for mask in masks:# 为每个掩膜随机生成颜色color = np.random.randint(0, 256, 3)# 半透明叠加掩膜区域output_image[mask['segmentation']] = color * 0.6 + output_image[mask['segmentation']] * 0.4#Q3: 需要保存掩膜为单独文件# for i, mask in enumerate(masks):
#     cv2.imwrite(f"mask_{i}.png", mask['segmentation'].astype('uint8') * 255)#​提取特定区域的原图内容​# 提取面积最大的前3个对象
# masks_sorted = sorted(masks, key=lambda x: x['area'], reverse=True)[:3]# for i, mask in enumerate(masks_sorted):
#     # 创建透明背景的PNG
#     rgba = cv2.cvtColor(image, cv2.COLOR_RGB2RGBA)
#     rgba[~mask['segmentation']] = [0,0,0,0]  # 非掩膜区域透明
#     cv2.imwrite(f"object_{i}.png", rgba)'''
输出结果解析​​:
每个 mask包含:
segmentation: 二值掩膜矩阵
area: 区域像素面积
bbox: [x,y,width,height] 边界框
predicted_iou: 模型预测的质量分数
stability_score: 稳定性评分
'''# 保存结果
cv2.imwrite("Result_"+mode_test+"_"+str(scalse)+"_"+image_path, cv2.cvtColor(output_image, cv2.COLOR_RGB2BGR))# 打印分割结果统计
print(f"检测到 {len(masks)} 个分割区域")
print("第一个掩膜信息示例:", {k: v for k, v in masks[0].items() if k != 'segmentation'})

  

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

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

相关文章

2022 ICPC Jinan DG and 2022 ICPC Nanjing

2022 ICPC Jinan DG and 2022 ICPC Nanjing 2022 Jinan D 需要考虑的地方是 ? 类型的提交,对于每种这样的提交,我们可以算出它可产生的最小罚时和最大罚时。于是我们单独考虑这样的提交,二进制枚举那些提交过了,…

你的开发服务器在说谎-热重载与热重启的关键区别

GitHub 主页 你的开发服务器在说谎:热重载与热重启的关键区别 🔥🔄🚀 作为开发者,我们都迷恋那种“心流”状态。当你全神贯注,代码从指尖流淌而出,每一次保存,终端里的服务就自动重启,浏览器一刷新,新的变…

SDL-1

1.https://www.cppgamedev.top/courses/sdl-space-shooter/parts/sdl-fundamentals 练习3:添加音效播放功能(使用Mix_LoadWAV和Mix_PlayChannel函数) 1.SDL使用的音频数据结构 chunk完全预先加载进内存的文件 music …

CF1206B Make Product Equal One

CF1206B Make Product Equal One题目描述 给你一个有 n 个数的数组。你可以用 x(x为任意正整数) 的代价将数组中的任意一个数增加或减少 x ,你可以重复多次此操作。现在需要你用若干次操作使得 a_1a_2...a_n = 1 (数组…

关于莫比乌斯函数的应用1

include include include include include using namespace std; // 快速幂算法:计算 (a^b) % mod long long fast_power(long long a, long long b, long long mod) { long long result = 1; a = a % mod; whil…

关于莫比乌斯函数的应用

include include include int main() { constexpr int M = 20101009; int n, m; std::cin >> n >> m; if (n > m) std::swap(n, m); std::vector f(n + 1), vis(n + 1), prime; prime.reserve(n); f…

软件工程第三次作业----结对项目

一、作业信息github网址 https://github.com/easytime2000/MathApp这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/?page=3这个作业要求在哪里 https://edu.cnblogs.com/c…

用deepseek写的一个求原根的程序

include include include include include using namespace std; // 快速幂算法:计算 (a^b) % mod long long fast_power(long long a, long long b, long long mod) { long long result = 1; a = a % mod; whil…

操作备忘:在AE中让视频中间部分变慢

目标效果:一个15秒的视频, 1-5秒的部分1倍速播放 5-10秒的部分以0.5倍速播放 10-15秒的部分1倍速播放。 操作如下: 1. 对素材或预合成启用时间重映射 2. 在5秒、10秒处打关键帧(开始变慢与结束变慢的位置): 3.…

记一次精简系统Windows11英文版离线安装中文语言包的过程

最近折腾上了超级精简的Win11系统,就是没有那些乱七八糟的服务的,也没有乱七八糟自带软件的系统,然后看了一圈,发现一个叫Nano11的精简系统非常不错,系统的项目以及下载地址:https://github.com/ntdevlabs/nano11…

阿里巴巴数据库开发手册

下载地址https://8ma.co/res/RMFS3J81.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0px } .zsleft { float: le…

AI元人文:赋能公共治理、司法与监管的价值权衡新范式

AI元人文:赋能公共治理、司法与监管的价值权衡新范式 在当今复杂多元的社会环境中,公共治理、司法审判与行业监管领域面临着日益复杂的价值权衡挑战。经济发展与环境保护、个人权益与公共利益、创新活力与风险防控等…

数据结构之顺序队列

数据结构之顺序队列数据结构之队列 什么是队列队列是和栈一样操作受限的线性表,栈是只允许在线性表的一端进行入栈和出栈操作,而队列是会允许在线性表的一端进行入队,在另外一端进行出队操作队列的基本操作 bool in…

nginx快速实现平滑版本升级

1、解压并编译新版的nginx # 目前版本为1.18,解压一个1.21版本的nginx包 wget https://nginx.org/download/nginx-1.21.0.tar.gz tar -zxf nginx-1.21.0.tar.gz cd nginx-1.21.0/ [root@ubt-server nginx-1.21.0]# ls…

基础的sql练习,全都理解你就是高手了!

以下sql我都是亲测:大多数用法都会在面试当中被问到,切记一步一个脚印的去实现,结果不重要,重要的是你的实现过程的想法,第一步做什么然后第二步做什么等具体的详细过程!(学东西不能贪多,慢慢来) 先从单表查询…

Luogu P11159 【MX-X6-T5】 再生 题解 [ 蓝 ] [ 前缀和 ] [ 组合计数 ]

再生 笑点解析:一开始乘法原理推错式子胡了个依赖链长种类数 \(\le \sqrt n\) 的做法上去。 有了 \(top\) 数组,显然可以求出每个点所处的长链。对于长链上的点,如果链长为 \(x\),那么这条链有 \((x - 1)!\) 种可能…

王浩宇 102500416

这个作业属于:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500416 姓名:王浩宇 书本作业 第一题第二题第三题第四题第五题第六…

102500416 王浩宇

这个作业属于:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500416 姓名:王浩宇 书本作业 第一题第二题第三题第四题第五题第六…

程序员修炼之路:从小工到专家 读书笔记 2

《程序员修炼之道:从小工到专家》读书笔记(补充篇) 重读《程序员修炼之道》,除了此前感悟的核心原则,书中 “破窗理论”“原型验证”“责任承诺” 等理念,更让我看清从 “完成代码” 到 “掌控开发” 的进阶细节…

程序员修炼之路:从小工到专家 读书笔记 3

《程序员修炼之道:从小工到专家》读书笔记(进阶篇) 三读《程序员修炼之道》,书中 “知识负债”“自动化思想”“沟通协作” 三大被忽略的理念,终于让我触摸到 “专家” 的核心特质 —— 不仅是技术能力的精进,更…