了解FastSam:一个通用分割模型(草记)(1)

简介: 一、FastSam下载与体验1 问题记录似乎从网页上下载压缩包,会比使用git clone要方便很多。1 CLIP是什么?

一、FastSam下载与体验

1 问题记录

似乎从网页上下载压缩包,会比使用git clone要方便很多。

1 CLIP是什么?

46bcd6f3dbcc40c58f73eadc7b45751f.png

参考:openai clip安装 - 知乎 (zhihu.com)

2 运行带提示词的指令时,突然就开始下载什么东西,它下载到哪儿啦?

(fastsam) PS D:\code_all\gitCode\FastSAM-main> python Inference.py --model_path ./weights/FastSAM.pt --img_path ./images/dogs.jpg  --text_prompt "the yellow dog"
0: 576x1024 21 objects, 3532.2ms
Speed: 14.6ms preprocess, 3532.2ms inference, 85.6ms postprocess per image at shape (1, 3, 1024, 1024)
 22%|████████▍                             | 75.3M/338M [00:32<03:59, 1.15MiB/s]


我使用everything工具,通过文件创建时间排序,找到了如下文件路径,这个文件有300MB作用。.cache目录下还有名为paddle的文件夹。

C:\Users\ThinkPad\.cache\clip\ViT-B-32.pt

3 点提示词的指令效果是什么?

:原来这里也是给黄狗加了mask(掩码)的,原图中黄狗是明亮的色彩,下图中给它套了一层灰色。下图中点提示*应该左蓝点表示前景,右紫点表示背景。*

image.png4 运行segment.py时报错了

prompt_process.plot(
    annotations=ann,
    output='./output/',
    mask_random_color=True,
    better_quality=True,
    retina=False,
    withContours=True,
)
prompt_p


查看plot()方法的文档中并没有output参数。

(method) plot(annotations: Any, output_path: Any, bboxes: Any | None = None, points: Any | None = None, point_label: Any | None = None, mask_random_color: bool = True, better_quality: bool = True, retina: bool = False, withContours: bool = True) -> None

改成output_path后出现另一个报错:

File "d:\code_all\gitCode\FastSAM-main\fastsam\prompt.py", line 219, in plot
    cv2.imwrite(output_path, result)
cv2.error: OpenCV(4.8.1) D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:696: error: (-2:Unspecified error) could not 
find a writer for the specified extension in function 'cv::imwrite_'

然后又修改output_path参数的值,指定了文件名后成功。

output_path='./output/dogs_2.jpg',

参考:(已解决)could not find a writer for the specified extension in function ‘cv‘-CSDN博客

5 从这张图的效果看,有点像只是从图片中寻找边缘而已?

6 运行app_gradio.py出问题。

不知道是出什么状况了,运行之后的页面可以打开,但无法成功在上面进行图片分割。

Running on local URL:  http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
ERROR:    Exception in ASGI application
......
  File "D:\anaconda\envs\FastSAM\lib\site-packages\gradio\blocks.py", line 518, in get_api_info
    serializer = serializing.COMPONENT_MAPPING[type]()
KeyError: 'dataset'

小问题合集

  • 开梯子时conda会报错,比如此时使用conda create -n 名字 python=3.9
  • cpu下推理得很慢,大概需要6秒。
  • 不能读取中文文件名的图片。
  • 似乎由于图片尺寸问题?有的图片运行后不报错也不产生输出。
  • clip模型与fast-sam之间是怎么一种关系?
  • 点提示词的使用?

2 知识记录

pip导出requirements.txt

pip freeze > requirements.txt #可能会丢失依赖包的版本号
pip list --format=freeze> requirements.txt

二、FastSam部署

1 了解模型的部署流程-onnx

模型部署指让训练好的模型在特定环境中运行的过程。两个需求:

模型通常使用特定的深度学习框架编写,以及需要一些特定的依赖。它们在实际的运行环境中可能不便于安装,需要脱离这些依赖。

加速。

小知识:模型部署时通常把模型转换成静态的计算图,即没有控制流(如分支结构)的计算图。可用追踪导出的方法。


参考:✔ 模型部署入门教程(一):模型部署简介 - 知乎 (zhihu.com)


1 尝试超分辨率模型SRCNN


期间下载示例的利用requests库下载face.png图片还报错了,但其实我现在不必太关注这个问题。


好像原始文件大一些,就会一直卡着出不了结果,输入从30kb到50kb,速度就慢了好多倍。感觉模型的效果不太行,该糊还是糊。不过,体验这个模型本就不是我的目的,我只是想走一下部署的流程而已。


好像放大倍数小一些,比如2,反而比放大3倍、6倍的效果更好。(放大倍数设置为2,下面右图为模型输入,左图为输出)

2 尝试使用openvino部署

参考文档:(1)FastSAM Awsome Openvino

(2)入门 — OpenVINO™ documentation — Version(2023.0)

我电脑中FastSam虚拟环境是直接安装的官方requirements.txt,cpu版本。我在其中再次安装了openvino的开发环境。

pip install openvino-dev

“ultralytics是为 YOLO 模型发布了一个全新的存储库。它被构建为用于训练对象检测、实例分割和图像分类模型的统一框架”,在fastsam awsome openvino的模型转换代码中,也用到了它。

问题from ultralytics.utils import ...报错,但pip install ultralytics又显示satisfied。我只好卸掉重装。

(FastSAM) PS D:\code_all\gitCode\FastSAM_Awsome_Openvino-main> pip install ultralytics
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: ultralytics in d:\anaconda\envs\fastsam\lib\site-packages (8.0.120)

模型转换流程:pt --> onnx --> ir

# 1 pt --> onnx
python pt2onnx.py --weights models/FastSAM-s.pt --output clf/FastSAM-s.onnx
# 2 onnx --> ir,生成两个文件~.xml和~.bin
mo --input_model clf/FastSAM-s.onnx --output_dir clf/ --framework onnx
# 3 运行转换后的模型
cd src/python
python FastSAM.py --model_path ../../clf/FastSAM-s.onnx --img_path ../../images/coco.jpg --output ../../clf/

我用它给的.pt模型,转出来后,推理时遇到了一个错误:

ValueError: get_shape was called on a descriptor::Tensor with dynamic shape

如果我将pt2onnx.py中的torch.onnx.export()中的dynamic_axes参数去掉,得到一个静态输入的onnx模型,推理时又遇到了另一个错误:

RuntimeError: mat1 and mat2 shapes cannot be multiplied (100x32 and 65x6400)

小结:总之尝试失败。感觉对于整个模型从转换到运行的过程缺乏了一些认知,以至于感觉像在玩弄一个黑盒子。花时间搜索bug、调来调去,但整个人一直处于比较懵的状态。严重缺少前置知识,感觉就像在浪费生命。

当前问题

不懂openvino及其部署流程,以及相关的各种概念及其影响。如静态、动态输入。

不懂fast-sam的模型结构细节。模型部署并不是转一下模型结构就完了,推理也要有相应的推理代码,包括输入前处理(preprocess),输出后处理(postprocess),但我不懂这些处理是在干嘛,为什么要这样写,那么出了问题自然懵圈。

三、FastSam了解与学习

其它参考

  1. 原论文pdf
  2. Segment Anything(sam)项目整理汇总

相关

  1. fastsam的Web在线体验

1 FastSam论文解读

名词:


常规的cnn检测器,实例分割分支,人工先验结构,segment anything领域,端到端的Transformer方法,特征融合模块,形态学操作,文本提示的图像嵌入,AR(召回率),AUC,zero-shot(零样本),YOLACT方法,


摘句:


这种计算开销主要来自于处理高分辨率输入的Transformer架构。

SAM架构的主要部分Transformer(ViT)

本文将segment anything任务分解为两个连续的阶段,即全实例分割和提示引导选择。

对于特定任务来说,特定的模型仍然可以利用优势来获得更好的效率-准确性平衡。

先使用YOLOv8-seg 对图像中的所有对象或区域进行分割。

YOLOv8的主干网络和特征融合模块(neck module)将YOLOv5的C3模块替换为C2f模块。更新后的头部模块采用解耦结构,将分类和检测分开。

在FastSAM中,本文直接使用YOLOv8-seg方法进行全实例分割阶段。

FastSAM的运行速度与提示数量无关

在COCO的所有类别上与无需学习的方法进行比较。

相比SAM,FastSAM在大对象的狭窄区域上可以生成更精细的分割掩码。

FastSAM在生成框上具有明显的优势,但其掩码生成性能低于SAM

局限性:(1)低质量的小尺寸分割掩码具有较高的置信度分数。(2)一些微小尺寸对象的掩码倾向于接近正方形。

FastSAM还存在一些可以改进的弱点,例如评分机制和实例掩码生成范式。

草记:


提示引导选择:(1)点提示通过设置前景点、背景点,来对掩码进行选择。(2)框提示通过与第一阶段中边界框进行iou(交并比)匹配。(3)文本提示,通过CLIP模型提取文本的相应嵌入,然后 根据相似度度量选择掩码。


疑惑:


可是我下载的fastsam模型大小为138mb,我不会下错了吧?

b066db44186d446896a61b323f541a62.png

了解FastSam:一个通用分割模型(草记)(2):https://developer.aliyun.com/article/1407236

相关文章
|
机器学习/深度学习 算法 自动驾驶
|
6天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
19 3
|
移动开发 文字识别 算法
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
本文简要介绍Pattern Recognition 2019论文“SegLink++: Detecting Dense and Arbitrary-shaped Scene Text by Instance-aware Component Grouping”的主要工作。该论文提出一种对文字实例敏感的自下而上的文字检测方法,解决了自然场景中密集文本和不规则文本的检测问题。
1949 0
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
|
2月前
|
机器学习/深度学习 JSON 算法
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
221 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
|
7月前
|
SQL Oracle 关系型数据库
C# 利用IDbDataAdapter / IDataReader 实现通用数据集获取
C# 利用IDbDataAdapter / IDataReader 实现通用数据集获取
|
7月前
|
测试技术 网络架构 C++
使用MergeKit创建自己的专家混合模型:将多个模型组合成单个MoE
MoE架构通过MergeKit实现新突破,允许整合预训练模型创建frankenMoEs,如FrankenMoE,区别于头开始训练的MoEs。MergeKit工具支持选择专家模型,定义正负提示,并生成MoE配置。
257 2
|
7月前
|
自然语言处理 语音技术
语言大模型和文本大模型的区别
【2月更文挑战第16天】语言大模型和文本大模型的区别
149 2
语言大模型和文本大模型的区别
|
7月前
|
机器学习/深度学习 并行计算 计算机视觉
了解FastSam:一个通用分割模型(草记)(2)
2 Sam相关项目 阅读:Segment Anything(sam)项目整理汇总 新鲜名词:点云分割, 有趣的项目:
294 0
|
机器学习/深度学习 人工智能 自然语言处理
MaskFormer:将语义分割和实例分割作为同一任务进行训练
目标检测和实例分割是计算机视觉的基本任务,在从自动驾驶到医学成像的无数应用中发挥着关键作用。目标检测的传统方法中通常利用边界框技术进行对象定位,然后利用逐像素分类为这些本地化实例分配类。但是当处理同一类的重叠对象时,或者在每个图像的对象数量不同的情况下,这些方法通常会出现问题。
4859 0
|
机器学习/深度学习 存储 编解码
图像目标分割_1 概述
图像分割的目的:简化或改变图像的表示形式,使得图像更容易理解和分析。图像分割通常用于定位图像中的物体和边界(线,曲线等)。更精确的,图像分割是对图像中的每个像素加标签的一个过程,这一过程使得具有相同标签的像素具有某种共同视觉特性。
407 0