首页学习其他【AI工具】使用pytho...

【AI工具】使用python在本地跑个Segment Anything Model (SAM)的Demo


关于Meta发布的第一个致力于图像分割的基础模型Segment Anything Model在昨天发布的文章有简要介绍:

【AI工具】MetaAI发布分割一切的AI模型——Segment Anything Model (SAM)

昨天是在官方在线平台体验了下,那么本次就在本地run个demo:

01

环境安装


首先官方给到的依赖要求如下:

  • python>=3.8

  • pytorch>=1.7

  • torchvision>=0.8

安装完依赖项后,就可以安装Segment Anything:
pip install git+https://github.com/facebookresearch/segment-anything.git

也可以克隆到本地在安装:

git clone git@github.com:facebookresearch/segment-anything.gitcd segment-anything; pip install -e .

另外,还需要下载一个 model checkpoint:

https://github.com/facebookresearch/segment-anything#model-checkpoints


02

运行模型


以下面的图像作为demo示例(使用cv2读取图像,并使用matplotlib可视化图像):

 1import numpy as np
2import matplotlib.pyplot as plt
3import cv2
4
5image = cv2.imread('./images/image_1.jpg')
6image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
7plt.figure(figsize=(20,20))
8plt.imshow(image)
9plt.axis('off')
10plt.show()

加载完图像后,只需几行代码就可以使用模型自动对图像进行语义分割。

代码如下:

 1sam_checkpoint = "下载的model checkpoint存放地址"
2device = "cuda"
3model_type = "模型类别名称(要与下载的model checkpoint对应)"
4
5from segment_anything import sam_model_registry, SamAutomaticMaskGenerator
6sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
7sam.to(device=device)
8mask_generator = SamAutomaticMaskGenerator(sam)
9
10masks = mask_generator.generate(image)

需要注意的是,可以使用以下可调参数,控制采样点的密度或者降低阈值等操作,本次使用默认参数:

1mask_generator_2 = SamAutomaticMaskGenerator(
2    model=sam,
3    points_per_side=32,
4    pred_iou_thresh=0.86,
5    stability_score_thresh=0.92,
6    crop_n_layers=1,
7    crop_n_points_downscale_factor=2,
8    min_mask_region_area=100,  # Requires open-cv to run post-processing
9)

运行上述代码,此时得到的masks 是一个列表,每个元素都是一个包含有关mask的各种数据的字典:

  • segmentation:掩膜mask;

  • area:mask的面积(以像素为单位);

  • bbox:mask的边界框;

  • predicted_iou:置信度;

  • point_coords:生成该mask的采样点;

  • stability_score:mask质量的附加度量值;

  • crop_box:用于生成mask的图像。


 1mask
2# [{'segmentation': array([[False, False, False, ..., False, False, False],
3#          [FalseFalseFalse, ..., FalseFalseFalse],
4#          [FalseFalseFalse, ..., FalseFalseFalse],
5#          ...,
6#          [FalseFalseFalse, ...,  True,  True,  True],
7#          [FalseFalseFalse, ..., FalseFalseFalse],
8#          [FalseFalseFalse, ..., FalseFalseFalse]]),
9#   'area': 380834,
10#   'bbox': [0, 320, 1079, 487],
11#   'predicted_iou': 1.0511808395385742,
12#   'point_coords': [[523.125, 468.28125]],
13#   'stability_score': 0.9827337861061096,
14#   'crop_box': [0, 0, 1080, 810]},
15# ......]
16
17print(len(masks))
1870
19
20print(masks[0].keys())
21# dict_keys(['segmentation', 'area', 'bbox', 'predicted_iou', 'point_coords', 'stability_score', 'crop_box'])

可以通过以下代码,将生成的mask覆盖在原图上:

 1def show_anns(anns):
2    if len(anns) == 0:
3        return
4    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
5    ax = plt.gca()
6    ax.set_autoscale_on(False)
7    polygons = []
8    color = []
9    for ann in sorted_anns:
10        m = ann['segmentation']
11        img = np.ones((m.shape[0], m.shape[1], 3))
12        color_mask = np.random.random((13)).tolist()[0]
13        for i in range(3):
14            img[:,:,i] = color_mask[i]
15        ax.imshow(np.dstack((img, m*0.35)))
16
17plt.figure(figsize=(20,20))
18plt.imshow(image)
19show_anns(masks)
20plt.axis('off')
21plt.show() 

效果如下所示:

与之前本人在论文研究中使用谷歌开源的图形分割模型DeepLab v3+分割的效果对比,可以看出,SAM分割的还是比较细致的。

本次仅是简单跑个demo,更多内容可以查看GitHub页面:

1https://github.com/facebookresearch/segment-anything


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments