当前位置:   article > 正文

Grounded-Segment-Anything本地部署_grounded-segment-anything 部署

grounded-segment-anything 部署

  • 源码链接:https://github.com/IDEA-Research/Grounded-Segment-Anything
  • 介绍
    • Segment Anything Model,简称 SAM。
    • SAM 已经学会了关于物体的一般概念,可以为任何图像或视频中的任何物体生成 mask,甚至包括在训练过程中没有遇到过的物体和图像类型。
    • SAM 足够通用,可以涵盖广泛的用例,并且可以在新的图像领域即开即用,无需额外的训练

1.本地部署源码

1.1 克隆源码

  • 克隆命令
    git clone https://github.com/IDEA-Research/Grounded-Segment-Anything.git
    
    • 1
  • 问题一
    • 克隆下来后发现下面的三个文件夹是空的
      在这里插入图片描述

    • 在源码链接中有这两行命令,应该是把这三个文件夹文件下载下来,但是我的报错
      在这里插入图片描述

    • 解决 :手动下载,然后放在相应的文件夹
      在这里插入图片描述

  • 问题二【手动放在相应的文件夹后,调用里面的文件路径是错的】
    • 解决:修改相关路径,运行代码将不对的路径全部改掉
    • 修改路径 【segment_anything】
      在这里插入图片描述
    • 修改路径 【GroundingDINO】
      在这里插入图片描述

1.2 下载初始参数

2. 创建虚拟环境

  • 创建虚拟环境
    conda create -n env_grounded_segment_anything python==3.8.10
    
    • 1
  • 进入虚拟环境
    conda activate env_grounded_segment_anything
    
    • 1
  • 安装pytorch
    pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
    
    • 1
  • 安装requirements.txt
    pip install -r requirements.txt 
    
    • 1
  • 使用pycharm打开项目
    在这里插入图片描述
  • 选择虚拟环境
    在这里插入图片描述

3. 测试相关文件

3.1 运行grounding_dino_demo.py文件

  • gpu,将DEVICE 值改为 cpu
  • gpu,无需修改参数
  • 生成标注图片
    在这里插入图片描述

3.2 运行grounded_sam_demo.py文件

  • 添加参数,电脑没有gpudevice 参数使用默认的cpu
    --config GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py  
    --grounded_checkpoint groundingdino_swint_ogc.pth  
    --sam_checkpoint sam_vit_h_4b8939.pth 
    --input_image assets/demo1.jpg  
    --output_dir "outputs"  
    --box_threshold 0.3  
    --text_threshold 0.25  
    --text_prompt "bear"  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

在这里插入图片描述

  • 输出结果
    • 文件说明
      在这里插入图片描述
    • 图片显示
      在这里插入图片描述

3.3 运行grounded_sam_simple_demo.py文件

  • 无cuda报错
    在这里插入图片描述
  • inference.py修改device值改为cpu
    在这里插入图片描述
  • 测试demo4.jpg【无需修改代码】
    在这里插入图片描述
  • 测试demo7.jpg
    • 修改关于demo.jpg信息
      在这里插入图片描述
    • 结果
      在这里插入图片描述

3.4 grounded_sam_inpainting_demo.py文件

  • 修复图片文件

  • 添加参数

    --config
    GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py
    --grounded_checkpoint
    groundingdino_swint_ogc.pth
    --sam_checkpoint
    sam_vit_h_4b8939.pth
    --input_image
    assets/inpaint_demo.jpg
    --output_dir
    "outputs"
    --box_threshold
    0.3
    --text_threshold
    0.25
    --det_prompt
    "bench"
    --inpaint_prompt
    "A sofa, high quality, detailed"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

  • 报错 【下载远程文件失败】
    在这里插入图片描述

  • 解决:手动下载

  • 重新运行:报错 【原因:我没有gpu】
    在这里插入图片描述

  • 解决,将cuda换为cpu
    在这里插入图片描述

  • 重新运行:报错

    • RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'
      在这里插入图片描述

    • 解决方式:解决链接

    • float16改为float32
      在这里插入图片描述

  • 结果
    在这里插入图片描述

3.5 运行automatic_label_ram_demo.py`文件

  • 添加参数

    --ram_checkpoint
    ram_swin_large_14m.pth
    --grounded_checkpoint
    groundingdino_swint_ogc.pth
    --sam_checkpoint
    sam_vit_h_4b8939.pth
    --input_image
    assets/demo9.jpg
    --output_dir
    "outputs"
    --box_threshold
    0.25
    --text_threshold
    0.2
    --iou_threshold
    0.5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 结果
    在这里插入图片描述

3.6 运行automatic_label_demo.py文件

  • 自动标注文件

  • 添加参数

    --config
    GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py
    --grounded_checkpoint
    groundingdino_swint_ogc.pth
    --sam_checkpoint
    sam_vit_h_4b8939.pth
    --input_image
    assets/demo9.jpg
    --output_dir
    "outputs"
    --box_threshold
    0.25
    --text_threshold
    0.2
    --iou_threshold
    0.5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

  • 报错
    在这里插入图片描述

  • 原因:下载文件失败,手动下载

  • 报错Resource punkt not found. Please use the NLTK Downloader to obtain the resources

  • 结果
    在这里插入图片描述

3.7. 批量自动标注图片

  • 修改automatic_label_demo.py文件
  • 文件太长,其他的地方还要改
    if __name__ == "__main__":
        root_path=''  # 根目录
        images_name='images'   # 图片文件夹名
        images_path=os.path.join(root_path,images_name)
        images_outputs_path=os.path.join(root_path,'grounded_segment_anything_images')
        output_json = os.path.join(images_outputs_path,'json')
        output_orig = os.path.join(images_outputs_path,'orig')
        output_mask = os.path.join(images_outputs_path,'mask')
        output_automatic_label = os.path.join(images_outputs_path,'automatic_label')
        for i in [output_json,output_mask,output_orig,output_automatic_label]:
            os.makedirs(i, exist_ok=True)
        images_list=os.listdir(images_path)
        parser = argparse.ArgumentParser("Grounded-Segment-Anything Demo", add_help=True)
        parser.add_argument("--config", type=str, default='GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py',
                            help="path to config file")
        parser.add_argument("--grounded_checkpoint", type=str, default='groundingdino_swint_ogc.pth', help="path to checkpoint file")
        parser.add_argument("--sam_checkpoint", type=str, default='sam_vit_h_4b8939.pth', help="path to checkpoint file")
        parser.add_argument("--split", default=",", type=str, help="split for text prompt")
        parser.add_argument("--openai_key", type=str, help="key for chatgpt")
        parser.add_argument("--openai_proxy", default=None, type=str, help="proxy for chatgpt")
        parser.add_argument("--box_threshold", type=float, default=0.25, help="box threshold")
        parser.add_argument("--text_threshold", type=float, default=0.2, help="text threshold")
        parser.add_argument("--iou_threshold", type=float, default=0.5, help="iou threshold")
        parser.add_argument("--device", type=str, default="cpu", help="running on cpu only!, default=False")
        args = parser.parse_args()
    
        # cfg
        config_file = args.config  # change the path of the model config file
        grounded_checkpoint = args.grounded_checkpoint  # change the path of the model
        sam_checkpoint = args.sam_checkpoint
        # image_path = args.input_image
        split = args.split
        openai_key = args.openai_key
        openai_proxy = args.openai_proxy
        box_threshold = args.box_threshold
        text_threshold = args.text_threshold
        iou_threshold = args.iou_threshold
        device = args.device
        openai.api_key = openai_key
        if openai_proxy:
            openai.proxy = {"http": openai_proxy, "https": openai_proxy}
    
        # load model
        model = load_model(config_file, grounded_checkpoint, device=device)
     
        processor = BlipProcessor.from_pretrained("config_data/blip-image-captioning-large")
        if device == "cuda":
            blip_model = BlipForConditionalGeneration.from_pretrained("config_data/blip-image-captioning-large",
                                                                      torch_dtype=torch.float16).to("cuda")
        else:
            blip_model = BlipForConditionalGeneration.from_pretrained("config_data/blip-image-captioning-large")
        for img_name in images_list:
     
            image_path=os.path.join(images_path,img_name)
            image_pil, image = load_image(image_path)
            image_pil.save(os.path.join(output_orig, img_name))
            args = parser.parse_args()
            caption = generate_caption(image_pil, device=device)
            text_prompt = generate_tags(caption, split=split)
            print(f"Caption: {caption}")
            print(f"Tags: {text_prompt}")
            # visualize raw image
            image_pil.save(os.path.join(output_orig,img_name ))
            # run grounding dino model
            boxes_filt, scores, pred_phrases = get_grounding_output(
                model, image, text_prompt, box_threshold, text_threshold, device=device
            )
    
            # initialize SAM
            predictor = SamPredictor(build_sam(checkpoint=sam_checkpoint).to(device))
            image = cv2.imread(image_path)
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            predictor.set_image(image)
    
            size = image_pil.size
            H, W = size[1], size[0]
            for i in range(boxes_filt.size(0)):
                boxes_filt[i] = boxes_filt[i] * torch.Tensor([W, H, W, H])
                boxes_filt[i][:2] -= boxes_filt[i][2:] / 2
                boxes_filt[i][2:] += boxes_filt[i][:2]
    
            boxes_filt = boxes_filt.cpu()
            # use NMS to handle overlapped boxes
            print(f"Before NMS: {boxes_filt.shape[0]} boxes")
            nms_idx = torchvision.ops.nms(boxes_filt, scores, iou_threshold).numpy().tolist()
            boxes_filt = boxes_filt[nms_idx]
            pred_phrases = [pred_phrases[idx] for idx in nms_idx]
            print(f"After NMS: {boxes_filt.shape[0]} boxes")
            caption = check_caption(caption, pred_phrases)
            print(f"Revise caption with number: {caption}")
    
            transformed_boxes = predictor.transform.apply_boxes_torch(boxes_filt, image.shape[:2]).to(device)
    
            masks, _, _ = predictor.predict_torch(
                point_coords = None,
                point_labels = None,
                boxes = transformed_boxes.to(device),
                multimask_output = False,
            )
    
            # draw output image
            plt.figure(figsize=(10, 10))
            plt.imshow(image)
            for mask in masks:
                show_mask(mask.cpu().numpy(), plt.gca(), random_color=True)
            for box, label in zip(boxes_filt, pred_phrases):
                show_box(box.numpy(), plt.gca(), label)
    
            plt.title(caption)
            plt.axis('off')
            plt.savefig(
                os.path.join(output_automatic_label,img_name),
                bbox_inches="tight", dpi=300, pad_inches=0.0
            )
    
            save_mask_data(output_mask,output_json,img_name, caption, masks, boxes_filt, pred_phrases)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116

5. 总结

  • 文件太多了,其他的不像测试了,因该都没有很大的问题
  • 文件初始化参数太大了,一个项目占了几十个G
  • 效果也不好,不想做了,摆烂
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/294692
推荐阅读
相关标签
  

闽ICP备14008679号