Segment Anything中将生成的多个mask结果拼接在一起,可视化(批量处理)

该Python代码用于读取一个目录下的多个mask图像,将它们拼接在一起,并随机改变每个png中白色像素点的颜色。使用numpy、PIL和os库进行图像处理和文件操作。

使用提供的amg.py生成测试图片mask
在这里插入图片描述
将多个mask拼接到一起,并改变每个png中白色区域像素值颜色

import numpy as np
from PIL import Image
import os
import matplotlib.pyplot as plt
from PIL import ImageColor
def compose_images(img_path):

    masks_file_list = os.listdir(img_path)

    for mask_file in masks_file_list:
        mask_path = os.path.join(img_path, mask_file)
        png_num = len(os.listdir(mask_path))-1
        # print(png_num)
        img_list = [] 
        color_list = []
        img = np.array(Image.open("./0.png"))  #需要更改,随便一张生成的mask图
        img_list.append(img)
        image_name = mask_file + ".png"
        save_path_ = os.path.join(img_path,"compose")
        os.makedirs(save_path_, exist_ok=True)
        save_path = os.path.join(save_path_, image_name)
        new_img = np.zeros_like(img_list[0])
        Image.fromarray(new_img).save(save_path)
        image_pil = Image.open(save_path)
        image_pil = image_pil.convert("RGB")
        
        for root,dirs,files in os.walk(mask_path):
            for image in files:
                
                # 存储图片的列表
                # color_list = [[255,0,0], [0,255,0], [0,0,255]] # 颜色列表
                
                color = list(np.random.choice(range(256),size=3))
                # for i in range(png_num):   
                if image.endswith(".png"): 
                    image_path =  os.path.join(mask_path, image)
                    # img = np.array(Image.open(image_path))  
                    img = Image.open(image_path)
                    img_rgb = img.convert("RGB")
                    for i in range(img.size[0]):
                        for j in range(img.size[1]):
                            # print(img_rgb.getpixel((i,j)))
                            if img_rgb.getpixel((i,j)) == (255,255,255):
                                image_pil.putpixel((i,j),tuple(color)) 
        # for i in range(x):
        #     for k in range(y):
        #         color = img.getpixel((i, k))
        #         color = color[:-1] + (100, )
        #         img.putpixel((i, k), color)
        # img.save("tologo.png")

        image_pil.convert("RGB")
        image_pil.save(save_path)


img_path = "/segment-anything/out_mask"  #需要更改,mask图的上一级,如下图

compose_images(img_path)

在这里插入图片描述

输出:
在这里插入图片描述

<think>好的,我现在需要帮助用户解决如何在liblib的生成参数中使用Segment Anything(SAM)功能选择mask的问题。根据用户提供的引用内容,特别是引用[2]和[3],用户可能遇到了在导出模型时处理orig_im_size参数的问题,以及OpenMP运行时冲突的错误。 首先,我需要理解用户的问题核心:他们想在liblib的生成参数中配置SAM模型,以便正确选择mask。根据引用[2],用户提到在生成decoder.onnx时,orig_im_size参数无法删除,导致TensorRT无法输出结果。直接删除参数会导致类型错误,因为模型的前向传播需要这个参数。因此,解决方案可能需要修改导出代码,添加默认值或调整输入结构。 其次,引用[3]提到的OpenMP错误,用户可能在运行时遇到这个问题,需要设置环境变量KMP_DUPLICATE_LIB_OK=TRUE作为临时解决方案,或者检查库的链接方式。 接下来,我需要整合这些信息,给出具体的步骤。可能需要指导用户如何修改模型导出代码,处理orig_im_size参数,例如在导出ONNX时提供固定尺寸或修改模型定义。同时,提醒用户注意OpenMP的冲突问题,并提供解决方法。 还需要考虑用户提到的liblib库的具体使用,可能涉及模型配置参数,比如在生成时指定输入尺寸或调整模型结构。要确保步骤清晰,避免技术术语过多,但保持准确性。 最后,生成相关问题,帮助用户进一步解决可能遇到的性能优化、参数调整或环境配置问题。</think>在liblib中集成Segment Anything(SAM)模型选择mask需要重点处理模型输入参数和运行时环境配置,具体步骤如下: 1. **模型导出参数调整** 在导出onnx模型时,需修改前向传播函数的orig_im_size参数处理: ```python # 在导出代码中添加默认参数值 def forward(self, image_embeddings, orig_im_size=None): orig_im_size = orig_im_size if orig_im_size else self.default_size # 后续处理逻辑... ``` 这样导出onnx时可通过设置`--dynamic-axes`参数保持输入灵活性: ```bash torch.onnx.export(..., dynamic_axes={'orig_im_size': {0: 'batch'}}) ``` 2. **生成参数配置** 在liblib的构建配置中需指定: ```shell ./configure --with-sam-mask \ --enable-dynamic-input \ CXXFLAGS="-DKMP_DUPLICATE_LIB_OK=TRUE" # 解决OpenMP冲突[^3] ``` 3. **输入预处理规范** 使用固定输入尺寸时,需保持输入张量与orig_im_size的对应关系: ```python input_size = (1024, 1024) dummy_input = { 'image_embeddings': torch.randn(1, 256, 64, 64), 'orig_im_size': torch.tensor([input_size]) } ``` 4. **运行时环境配置** 在调用库函数前设置环境变量: ```cpp putenv("KMP_DUPLICATE_LIB_OK=TRUE"); // 避免OpenMP库冲突[^3] ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值