告别手动标注时代 | SAM 助力 Label-Studio 形成 SOTA 级半自动标注工具

导读

本文将介绍结合 Label-StudioSAM (Segment Anything) 提供一个半自动化标注方案,帮助大家充分提高数据标注的效率。

  • Point2Labl:用户只需要在物体的区域内点一个点就能得到物体的掩码和边界框标注。

  • Bbox2Label:用户只需要标注物体的边界框就能生成物体的掩码。

其中:

  • SAM (Segment Anything) 是 Meta AI 推出的分割一切的模型。
  • Label Studio 是一款优秀的标注软件,覆盖图像分类、目标检测、分割等领域数据集标注的功能。

本文将使用喵喵数据集的图片作为示例,演示半自动化标注过程。

环境配置

首先,我们可以创建一个虚拟环境,然后安装 PyTorch 和 SAM。

  1. 创建虚拟环境:
conda create -n rtmdet-sam python=3.9 -y
conda activate rtmdet-sam
  1. 克隆 OpenMMLab PlayGround
git clone https://github.com/open-mmlab/playground
  1. 安装 PyTorch
# Linux and Windows CUDA 11.3
pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1 -f https://download.pytorch.org/whl/cu113/torch_stable.html


# Linux and Windows CPU only
pip install torch==1.10.1+cpu torchvision==0.11.2+cpu torchaudio==0.10.1 -f https://download.pytorch.org/whl/cpu/torch_stable.html

# OSX
pip install torch==1.10.1 torchvision==0.11.2 torchaudio==0.10.1

  1. 安装 SAM 并下载预训练模型
cd path/to/playground/label_anything
pip install opencv-python pycocotools matplotlib onnxruntime onnx
pip install git+https://github.com/facebookresearch/segment-anything.git
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth

# 如果想要分割的效果好请使用 sam_vit_h_4b8939.pth 权重
# wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth
# wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
  1. 安装 Label-Studio 和 label-studio-ml-backend
# sudo apt install libpq-dev python3-dev # Note:如果使用 Label Studio 1.7.2 版本需要安装 `libpq-dev` 和 `python3-dev` 依赖。

# 安装 label-studio 需要一段时间,如果找不到版本请使用官方源
pip install label-studio==1.7.3
pip install label-studio-ml==1.0.9

启动服务

启动 SAM 后端推理服务:

cd path/to/playground/label_anything

label-studio-ml start sam --port 8003 --with \
sam_config=vit_b \
sam_checkpoint_file=./sam_vit_b_01ec64.pth \
out_mask=True \
out_bbox=True \
device=cuda:0 \
# device=cuda:0 为使用 GPU 推理,如果使用 cpu 推理,将 cuda:0 替换为 cpu
# out_poly=True 返回外接多边形的标注

image

此时,SAM 后端推理服务已经启动,后续在 Label-Studio Web 系统中配置 http://localhost:8003 后端推理服务即可。

现在启动 Label-Studio 网页服务:

# 如果使用的推理后端是SAM的 vit-h, 由于模型加载时间长,需要设置以下环境变量。
# export ML_TIMEOUT_SETUP=40
label-studio start

打开浏览器访问 http://localhost:8080/ 即可看到 Label-Studio 的界面。

我们注册一个用户,然后创建一个 OpenMMLabPlayGround 项目。

我们通过下面的方式下载好示例的喵喵图片,点击 Data Import 导入需要标注的猫图片,点击 Save 创建 Project。

cd path/to/playground/label_anything
mkdir data && cd data

wget https://download.openmmlab.com/mmyolo/data/cat_dataset.zip && unzip cat_dataset.zip

Settings/Labeling Interface 中配置 Label-Studio 关键点和 Mask 标注。

<View>
  <Image name="image" value="$image" zoom="true"/>
  <KeyPointLabels name="KeyPointLabels" toName="image">
    <Label value="cat" smart="true" background="#e51515" showInline="true"/>
    <Label value="person" smart="true" background="#412cdd" showInline="true"/>
  </KeyPointLabels>
  <RectangleLabels name="RectangleLabels" toName="image">
  	<Label value="cat" background="#FF0000"/>
  	<Label value="person" background="#0d14d3"/>
  </RectangleLabels>
  <PolygonLabels name="PolygonLabels" toName="image">
  	<Label value="cat" background="#FF0000"/>
  	<Label value="person" background="#0d14d3"/>
  </PolygonLabels>
  <BrushLabels name="BrushLabels" toName="image">
  	<Label value="cat" background="#FF0000"/>
  	<Label value="person" background="#0d14d3"/>
  </BrushLabels>
</View>

在上述 XML 中我们对标注进行了配置,其中 KeyPointLabels 为关键点标注,BrushLabels 为 Mask 标注,PolygonLabels 为外接多边形标注,RectangleLabels 为矩形标注。

本实例使用 catperson 两个类别,如果社区用户想增加更多的类别需要分别在 KeyPointLabelsBrushLabelsPolygonLabelsRectangleLabels 中添加对应的类别。

然后将上述 XML 复制添加到 Label-Studio,然后点击 Save。

image

然后在设置中点击 Add Model 添加 OpenMMLabPlayGround 后端推理服务,设置好 SAM 后端推理服务的 URL,并打开 Use for interactive preannotations 并点击 Validate and Save

image

看到如下 Connected 就说明后端推理服务添加成功。

image

开始半自动化标注

点击 Label 开始标注

image

需要打开 Auto-Annotation 的开关,并建议勾选 Auto accept annotation suggestions,并点击右侧 Smart 工具,切换到 Point 后,选择下方需要标注的物体标签,这里选择 cat。如果是 BBox 作为提示词请将 Smart 工具切换到 Rectangle。

image

Point2Label:由下面的 gif 的动图可以看出,只需要在物体上点一个点,SAM 算法就能将整个物体分割和检测出来。

SAM8

Bbox2Label: 由下面的 gif 的动图可以看出,只需要标注一个边界框,SAM 算法就能将整个物体分割和检测出来。

SAM10

我们 submit 完毕所有图片后,点击 exprot 导出 COCO 格式的数据集,就能把标注好的数据集的压缩包导出来了。
注意:此处导出的只有边界框的标注,如果想要导出实例分割的标注,需要在启动 SAM 后端服务时设置 out_poly=True

image

用 vscode 打开解压后的文件夹,可以看到标注好的数据集,包含了图片和 json 格式的标注文件。

到此半自动化标注就完成了, 通过 Label-Studio 的半自动化标注功能,可以让用户在标注过程中,通过点击一下鼠标,就可以完成目标的分割和检测,大大提高了标注效率。部分代码借鉴自 label-studio-ml-backend ID 为 253 的 Pull Request,感谢作者的贡献。

### 如何在AI Studio中加载和训练最新的SOTA模型 要在AI Studio平台加载和训练最新状态(State-of-the-Art, SOTA)的AI模型,需考虑多个方面,包括但不限于模型的选择、数据准备以及分布式训练策略。 #### 模型选择与获取 AI Studio支持多种类型的SOTA模型,这些模型涵盖了自然语言处理、计算机视觉等多个领域[^1]。用户可以通过其内置的模型库快速检索并下载所需的预训练模型。对于特定任务,例如文本生成或图像分类,应优先选取经过验证表现优异的模型架构作为起点。 #### 数据集准备 高质量的数据集是成功训练任何机器学习模型的关键因素之一。在开始之前,确保已准备好适合目标应用领域的标注数据集合,并完成必要的清洗工作以减少噪声干扰[^2]。如果计划使用自定义数据,则还需要编写相应的脚本来实现图片解码等功能以便于后续操作阶段顺利衔接。 #### 训练环境配置 为了充分利用计算资源提高效率,在设置好基础框架之后可以采用如下方法优化整个流程: - **利用混合精度加速**:通过调整数值表示形式来降低内存占用同时加快运算速度; - **实施高效IO机制**:合理安排文件读取顺序避免瓶颈现象发生影响整体进度; 另外值得注意的是,在实际部署过程中往往不仅仅关注单一维度上的指标比如单纯推理时间长短等问题,更重要是从全局角度出发考量包含所有环节在内的综合效果如何达到最佳水平。 #### 分布式训练方案设计 针对超大规模参数量的大规模深度神经网络而言,单机难以满足存储需求同时也限制了进一步扩展可能性因此引入多节点协作成为必然趋势。具体来说存在两种主要方式用于解决这一挑战即数据并行化处理模式以及模型切分技术路线[^3]: - **Data Parallelism (DP)** : 将样本均匀分配给各个子进程独立执行前向传播后再收集梯度更新共享权重副本; - **Model Parallelism(MP)/Pipeline Parallellsm(PP): 当层间依赖关系复杂无法简单分割成完全分离部分时可考虑按照一定规则划分不同组件分别放置到物理位置各异但逻辑相连紧密关联起来形成流水作业生产线样式结构从而突破传统意义上单卡显存容量上限约束条件下的局限性. 综上所述,借助上述提到的各项措施相结合能够有效促进基于AI studio开展先进算法研究探索活动取得良好成效。 ```python import paddle from paddlenlp.transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("sota-model-name") # 替换为具体的SOTA模型名称 model = AutoModelForSequenceClassification.from_pretrained("sota-model-name") def preprocess_function(examples): return tokenizer(examples['text'], truncation=True) train_dataset = load_dataset('your-dataset', split='train') tokenized_datasets = train_dataset.map(preprocess_function, batched=True) data_collator = DataCollatorWithPadding(tokenizer=tokenizer) training_args = TrainingArguments( output_dir="./results", learning_rate=2e-5, per_device_train_batch_size=8, num_train_epochs=3, weight_decay=0.01, ) trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_datasets["train"], data_collator=data_collator, ) trainer.train() ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CVHub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值