【什么是 SAM】

近日,Meta AI在官网发布了基础模型 Segment Anything Model(SAM)并开源,其本质是用GPT的方式(基于Transform 模型架构)让计算机具备理解了图像里面的一个个“对象”的通用能力。SAM模型建立了一个可以接受文本提示、基于海量数据(603138)训练而获得泛化能力的图像分割大模型。图像分割是计算机视觉中的一项重要任务,有助于识别和确认图像中的不同物体,把它们从背景中分离出来,这在自动驾驶(检测其他汽车、行人和障碍物)、医学成像(提取特定结构或潜在病灶)等应用中特别重要。

官网:
Segment Anything | Meta AI
github:
GitHub - facebookresearch/segment-anything: The repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.
官方论文:
https://arxiv.org/abs/2304.02643

【环境搭建】

首先将源码下载到pytorch环境中:
GitHub - facebookresearch/segment-anything: The repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.
安装依赖库:
pip install opencv-python pycocotools matplotlib onnxruntime onnx
安装SAM
cd segment-anything
pip install -e .

下载权重文件:
下载三个权重文件中的一个,我用的第一个,三个模型从大到小,8G以下显存选vit_b。
default or vit_h: ViT-H SAM model.
vit_l: ViT-L SAM model.
vit_b: ViT-B SAM model.

【推理测试】

源码的 notebooks下面提供了测试代码和图片:

automatic_mask_generator_example.ipynb    : 自动识别图片所有mask
predictor_example.ipynb    :手动选取范围进行识别mask
onnx_model_example.ipynb    :    onnx格式模型工具

下面测试使用的 py 代码:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyter
jupyter nbconvert --to script predictor_example.ipynb
jupyter nbconvert --to script automatic_mask_generator_example.ipynb

测试代码中 matplotlib 库需要使用3.6以下的低版本这里选择3.5.3:

automatic_mask_generator_example(识别所有区域):

区别主要在于引入的Sam预测器:

from segment_anything import sam_model_registry, SamPredictor
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator

SamPredictor    =>    需要传入一个抠图点坐标,也就是 input_point,会扣出包含抠图点的mask以及可能的父mask。
masks, scores, logits = predictor.predict(
    point_coords=input_point,
    point_labels=input_label,
    multimask_output=True,
)

代码如下:

import cv2
import matplotlib.pyplot as plt
import numpy as np
from segment_anything import sam_model_registry, SamPredictor
def show_mask(mask, ax, random_color=False):if random_color:color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)else:color = np.array([30 / 255, 144 / 255, 255 / 255, 0.6])h, w = mask.shape[-2:]mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)ax.imshow(mask_image)
def show_points(coords, labels, ax, marker_size=375):pos_points = coords[labels == 1]neg_points = coords[labels == 0]ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white',linewidth=1.25)ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white',linewidth=1.25)
if __name__ == '__main__':# 配置,vit_h、vit_l、vit_b 从大到小,8G显存选 vit_bsam_checkpoint = "C:\\workspace\\pycharm_workspace\\pytorch\\src\\segment-anything\\sam_vit_b_01ec64.pth"# vit_h(default)、vit_l、vit_bmodel_type = "vit_b"# 模型实例化sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)sam.to(device="cuda")predictor = SamPredictor(sam)image = cv2.imread(r"C:\\workspace\\pycharm_workspace\\pytorch\\src\\segment-anything\\notebooks\\images\\truck.jpg")image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)predictor.set_image(image)input_point = np.array([[500, 375]])input_label = np.array([1])plt.figure(figsize=(10, 10))plt.imshow(image)show_points(input_point, input_label, plt.gca())plt.axis('on')plt.show()masks, scores, logits = predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=True,)# 遍历读取每个扣出的结果for i, (mask, score) in enumerate(zip(masks, scores)):plt.figure(figsize=(10, 10))plt.imshow(image)show_mask(mask, plt.gca())show_points(input_point, input_label, plt.gca())plt.title(f"Mask {i + 1}, Score: {score:.3f}", fontsize=18)plt.axis('off')plt.show()

SamAutomaticMaskGenerator    =>    直接生成所有可能的mask
masks = mask_generator.generate(image)

代码如下:

import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2def show_anns(anns):if len(anns) == 0:returnsorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)ax = plt.gca()ax.set_autoscale_on(False)polygons = []color = []for ann in sorted_anns:m = ann['segmentation']img = np.ones((m.shape[0], m.shape[1], 3))color_mask = np.random.random((1, 3)).tolist()[0]for i in range(3):img[:,:,i] = color_mask[i]ax.imshow(np.dstack((img, m*0.35)))if __name__ == '__main__':sam_checkpoint = "C:\\workspace\\pycharm_workspace\\pytorch\\src\\segment-anything\\sam_vit_b_01ec64.pth"model_type = "vit_b"device = "cuda"sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)sam.to(device=device)mask_generator = SamAutomaticMaskGenerator(sam)image = cv2.imread('images/dog.jpg')image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)masks = mask_generator.generate(image)print(len(masks))print(masks[0].keys())plt.figure(figsize=(20, 20))plt.imshow(image)show_anns(masks)plt.axis('off')plt.show()

【模型导出onnx】

提供了一个onnx转换的脚本:
jupyter nbconvert --to script  onnx_model_example.ipynb
同样修改一下权重类型和文件即可:
checkpoint = "C:\\workspace\\pycharm_workspace\\pytorch\\src\\segment-anything\\sam_vit_b_01ec64.pth"
model_type = "vit_b"

会生成两个onnx文件,quantized是量化过后的权重:

模型参数:


【onnx部署】java

下面是进行 java-onnx 部署的代码,见另外一篇文章:

http://t.csdn.cn/A07aE

【Meta-AI】Sam-分割一切 测试相关推荐

  1. Segment Anything Model (SAM)——分割一切,具有预测提示输入的图像分割实践

    不得不说,最近的AI技术圈很火热,前面的风头大都是chatGPT的,自从前提Meta发布了可以分割一切的CV大模型之后,CV圈也热起来了,昨天只是初步了解了一下SAM,然后写了一篇基础介绍说明的博客, ...

  2. 超越ImageNet预训练,Meta AI提出SplitMask,小数据集也能自监督预训练

    ©作者 | 陈萍 来源 | 机器之心 大规模数据集对自监督预训练是必要的吗?Meta AI 认为,小数据集也能自监督预训练,效果还不错. 目前,计算机视觉神经网络被大量参数化:它们通常有数千万或数亿个 ...

  3. 几分钟让小孩的人物涂鸦「动起来」,Meta AI创建了一个奇妙的火柴人世界

    视学算法报道 编辑:杜伟.陈萍 Meta AI 让儿童手绘「活」了起来. 你有没有想过将一张儿童绘画制作成动画?就如下图,儿童能够绘制出独特和富有创造力的人物和动物:长着双脚的星星.腿超级长的鸟-- ...

  4. VLM:Meta AI CMU提出任务无关视频语言模型视频理解预训练VLM,代码已开源!(ACL 2021)...

    关注公众号,发现CV技术之美 本文分享 ACL 2021 论文『VLM: Task-agnostic Video-Language Model Pre-training for Video Under ...

  5. AI新动向:多模态+自监督!Meta AI一次搞定语音、视觉和文本三个SOTA

    本文转载自新智元. ‍ [导读]人工智能科学伊始,让机器「像人一样学习」始终是所有从业者的目标.人的智能基于多种感官与语言的通用处理能力,一直有研究者致力让机器做到此效果. 人的智识是「多模态学习」的 ...

  6. 纸片人「活」了。Meta AI新作:只需几分钟,手绘小人有了灵魂

    想让画中的「纸片人」有生命,Meta AI来搞定!昨日,Meta AI宣布了一种独创性方法,只需几分钟,就能动画化儿童手绘的角色,效果拔群. 快看,「纸片人」居然自己跳出来了! 小猫学会了hiphop ...

  7. Meta AI:让手绘小人动起来

    来源:公众号 新智元 授权 [导读]想让画中的「纸片人」有生命,Meta AI来搞定!昨日,Meta AI宣布了一种独创性方法,只需几分钟,就能动画化儿童手绘的角色,效果拔群. 快看,「纸片人」居然自 ...

  8. Meta AI西雅图研究负责人Luke Zettlemoyer|万亿参数后,大模型会持续增长吗?

    导读:预训练语言模型正变得越来越大,在惊讶于其强大能力的同时,人们也不禁要问:语言模型的规模在未来会持续增长吗? Meta AI西雅图研究负责人,华盛顿大学计算机科学与工程学院Paul G. Alle ...

  9. Meta AI发布具有200种语言的高品质机器翻译人工智能模型

    Meta AI所打造的NLLB-200是第一个能对200种不同语言提供先进质量翻译的单一人工智能(AI)模型. Meta AI也建立了全新的评价数据集FLORES-200,并衡量NLLB-200在每种 ...

  10. 图像分割的大变革:从SAM(分割一切)到FastSAM、MobileSAM

    前言 SAM就是一类处理图像分割任务的通用模型.与以往只能处理某种特定类型图片的图像分割模型不同,SAM可以处理所有类型的图像. 在SAM出现前,基本上所有的图像分割模型都是专有模型.比如,在医学领域 ...

最新文章

  1. insightface mxnet训练horovod版
  2. MTK的LK代码异常向量表解析
  3. PVM的安装和编译PVM程序
  4. MATLAB中的S-Function的用法(C语言)
  5. 2018最佳GAN论文回顾(下)
  6. poj3249Test for Job(记忆化搜索)
  7. switch的处理方法
  8. django 如何接收bootstrap-table传送的 ajax数组
  9. 东风小康为什么是dfsk_重庆造乘用车首次乘坐专列出口欧洲 100辆东风风光ix5抵达德国...
  10. CloudStack 4.4学习总结之cloudstack-management安装
  11. 【GD32L233C-START】11、GD32 ISP软件还不支持GD32L233
  12. 【侯捷】C++面向对象程序设计
  13. 关于鸿蒙开发系统组件的摘抄及运用1
  14. Scratch少儿编程案例-算法练习-实现加减乘除练习题
  15. USACO-Subset Sums
  16. 按颜色分类:黄绿色系(Yellow Green)
  17. c语言创意作业蜂鸣器,蜂鸣器c语言程序.doc
  18. 【B站弹幕游戏开发笔记01】Win10系统下给Unity项目导入Protobuf
  19. Embedding之padding_idx学习
  20. STL bitset用法小结(详细)附蓝桥杯题:明码

热门文章

  1. Emacs教程 30minutes
  2. 我是如何同时在字节和微信成功拿到实习转正offer
  3. Ruby, JRuby, and Rails Application 免费在线课程
  4. matlab knn,MATLAB的KNN实现
  5. (2)风色从零单排《C++ Primer》 一个简单的书店程序
  6. 输入半径计算出圆的面积和周长
  7. 基于麻雀搜索算法优化的lssvm回归预测
  8. Web应用的测试内容
  9. 网站漏洞扫描工具AWVS相关问题——Access Denied for your user role. Contact your Administrator.
  10. pytorch优化器详解:RMSProp