Segment Anything Model批量检测图像

文章介绍了如何利用SegmentAnythingModel进行图像检测,特别是vit_b模型的运用。用户下载代码后,通过修改amg.py文件并配置参数,可以在PyCharm中运行检测自己的图像。此外,文章还提供了一个批量处理图像的main函数示例,能对指定文件夹内的图像进行处理,生成并保存掩模结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看到了Segment Anything Model,发现不需要配置太多的东西就能跑起来
介绍说明的网址Segment Anything Model

在这里插入图片描述

可以从github下载代码code,提供了三个模型
在这里插入图片描述

  • vit_b的大小是358m
  • vit_l的大小是1.2g,
  • vit_h的大小是2.4g

我已经下载了源代码和最小的模型,有需要的话:百度云链接

接下来是加载最小的那个模型,检测自己的图像

在这里插入图片描述
需要运行的是amg.py这个文件。我按照官方给的提示对这个文件进行了一点修改,没有修改之前不会在图像上显示检测的结果,这个修改后的文件也放在百度云链接中了
在这里插入图片描述

  • 在pycharm的右上角哪里点击编辑配置
    在形参那里需要添加几个命令行参数
--input 检测图片的路径 --output 检测结果的输出路径 --model-type vit_b --checkpoint 权重文件的存放路径

举个例子

--input /home/image/test.png --output /home/image --model-type vit_b --checkpoint home/image/sam_vit_b_01ec64.pth

在这里插入图片描述

然后直接运行amg.py即可,下面是我运行的结果
在这里插入图片描述

在这里插入图片描述

        # for mask
        # base = os.path.basename(t)
        # base = os.path.splitext(base)[0]
        # save_base = os.path.join(args.output, base)
        # if output_mode == "binary_mask":
        #     os.makedirs(save_base, exist_ok=False)
        #     write_masks_to_folder(masks, save_base)
        # else:
        #     save_file = save_base + ".json"
        #     with open(save_file, "w") as f:
        #         json.dump(masks, f)

不注释掉的话检测得到的掩码二值图像都会保存下来

下面的代码是用于处理一批图像,并保存下来

def main(args: argparse.Namespace) -> None:
    print("Loading model...")
    sam = sam_model_registry[args.model_type](checkpoint=args.checkpoint)
    _ = sam.to(device=args.device)
    # output_mode = "coco_rle" if args.convert_to_rle else "binary_mask"
    output_mode = 'binary_mask'
    amg_kwargs = get_amg_kwargs(args)
    generator = SamAutomaticMaskGenerator(sam, output_mode=output_mode, **amg_kwargs)

    floader_path = "/home/jin/图片/dete"  # 这里为一批图像所在的文件夹
    file_path = os.listdir(floader_path)
    for im in file_path:
        args.input = os.path.join(floader_path, im)
        if not os.path.isdir(args.input):
            targets = [args.input]
        else:
            targets = [
                f for f in os.listdir(args.input) if not os.path.isdir(os.path.join(args.input, f))
            ]
            targets = [os.path.join(args.input, f) for f in targets]

        os.makedirs(args.output, exist_ok=True)

        for t in targets:
            print(f"Processing '{t}'...")
            image = cv2.imread(t)
            if image is None:
                print(f"Could not load '{t}' as an image, skipping...")
                continue
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            masks = generator.generate(image)


            plt.imshow(image)  # 这里自行选择加不加
            for mask in masks:
                show_mask(mask['segmentation'], plt.gca())
                # show_box(mask['bbox'],plt.gca())
            # plt.axis('off') 保存轴线或不保存
            plt.savefig('/home/jin/图片/segment-anything-main/scripts/'+im)  # 这里要替换为自己的路径
            plt.close()
    print("Done!")
  • 把main函数替换为这个,可以批量处理文件夹下的图像,需要改下plt.savefig(‘/home/jin/图片/segment-anything-main/scripts/’+im)这里的是存储路径,floader_path就是待检测的图像路径
  • 加上plt.imshow(image)这一句,效果如下,保存的是覆盖在原始图像的掩码结果
    在这里插入图片描述
  • 如果不加上plt.imshow(image)就是单纯的保存掩码图像,效果如下

在这里插入图片描述

### 使用 Segment Anything 模型进行批量处理 为了实现对多个图像文件的批量分割操作,可以编写脚本来自动化这一过程。下面是一个Python代码示例,展示了如何加载预训练的Segment Anything模型并对其执行批量化预测: ```python import os from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor import cv2 def load_model(model_type, checkpoint_path): """ 加载指定类型的SAM模型。 参数: model_type (str): 模型类型名称。 checkpoint_path (str): 预训练权重路径。 返回: object: 已初始化的SAM模型实例。 """ sam = sam_model_registry[model_type](checkpoint=checkpoint_path)[^2] return sam def batch_segmentation(image_folder, output_folder, model): """ 对给定目录下的所有图片应用自动掩码生成功能,并保存结果到另一文件夹内。 参数: image_folder (str): 输入图片所在的文件夹位置。 output_folder (str): 输出分割后的图片存储的位置。 model (object): SAM模型实例。 注意事项: - 此处假设输入为RGB格式的PNG/JPEG等常见格式; - 如果需要更复杂的前处理逻辑,则需自行调整函数体内的读取方式。 """ mask_generator = SamAutomaticMaskGenerator(model) if not os.path.exists(output_folder): os.makedirs(output_folder) for filename in os.listdir(image_folder): img_path = os.path.join(image_folder, filename) image_bgr = cv2.imread(img_path) image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB) masks = mask_generator.generate(image_rgb) # 这里仅简单展示mask的数量作为例子;实际应用可根据需求进一步处理masks列表里的数据结构 print(f"{filename} has {len(masks)} objects detected.") # 可视化部分省略... ``` 上述代码片段定义了一个`batch_segmentation()`方法,它接收三个参数:待处理图像所在文件夹、用于存放输出的结果集以及之前创建好的模型对象。通过遍历目标文件夹中的每一个项目来进行逐帧分析,并调用`SamAutomaticMaskGenerator`类完成具体的语义理解工作。 值得注意的是,在真实场景下可能还需要考虑更多细节问题,比如异常情况捕获机制的设计或是针对特定领域优化过的后端渲染方案等等。不过这段基础框架已经能够满足大多数情况下对于快速原型开发的需求了。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w冷淡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值