今天,我们讲解 LabelMe,介绍其安装、标注流程及数据导出方法,并结合版面标注实例,展示如何建立标签和导出数据,并最终实现与飞桨模型的适配。这将帮助大家更好地理解如何利用 LabelMe 高效构建数据集,为后续模型训练打下坚实基础。
Labelme全面介绍
LabelMe 是由麻省理工学院(MIT)计算机科学与人工智能实验室(CSAIL)开发的强大开源图像标注工具,广泛应用于计算机视觉任务的数据标注。它支持多种标注类型,包括边界框、多边形、线段、关键点等,帮助用户高效地构建高质量的数据集。
一、Labelme的安装与使用
-
使用pip安装: 这是推荐的安装方式,只需在命令行中输入 ‘pip install labelme’ 即可。
-
使用Anaconda安装: 首先创建一个新的Python环境,然后激活该环境并安装Labelme。具体命令如下:
conda create --name=labelme python=3
conda activate labelme
pip install labelme
- 从源码安装:如果需要进行二次开发或者希望获取最新的代码,可以从Labelme的GitHub仓库克隆代码并进行安装。具体步骤为:
git clone https://github.com/labelmeai/labelme
cd labelme
pip install -e .
无论选择哪种安装,安装完成后,可以通过命令行输入labelme启动Labelme的图形界面。
二、Labelme的功能与标注方式
Labelme支持多种标注方式,包括但不限于多边形标注、矩形标注、圆形标注、线条标注和点标注。这些标注方式可以满足不同应用场景的需求。
- 多边形标注:适用于标注复杂的形状和轮廓,如人形、图章等。
- 矩形标注:适用于标注简单的矩形区域,如车辆、建筑物等。
- 圆形标注:适用于标注圆形物体,如车轮、果实等。
- 线条标注:适用于标注路径、轨迹等线性结构。
- 点标注:适用于标注关键点、特征点等。
此外,Labelme还支持图像级别标注,可以对整张图像进行分类标注。同时,Labelme还提供了自定义界面功能,用户可以根据需求预定义标签、设置自动保存等,实现界面定制。
三、能标注的场景
Labelme广泛应用于各种计算机视觉项目中,包括但不限于:
- 自动驾驶:标注道路、车辆、行人等目标,为自动驾驶系统提供训练数据。
- 医疗影像分析:标注病变区域、器官轮廓等,辅助医生进行诊断。
- 遥感图像处理:标注地物、建筑等,为遥感图像分析提供数据支持。
- 工业检测:标注产品缺陷、零件位置等,用于质量控制和故障预测。
- 文档解析:版面标注,用于对PDF、图片的结构化解析。
Labelme还支持对视频进行逐帧标注,适用于需要处理视频数据的场景。
四、标注结果的导出与格式转换
Labelme支持导出多种数据格式,如JSON、COCO、VOC等,方便与其他软件和框架进行集成和互操作。
需要注意的是,虽然Labelme本身不直接支持边界框标注,但可以通过多边形等标注方式间接实现目标检测数据集的标注。此外,对于特定的模型训练需求,可能需要进行数据格式的转换。例如,YOLO模型需要特定的标签格式,可以通过编写脚本将JSON格式的标注数据转换为YOLO模型可以解析的标签格式。
适配飞浆平台需要将Labelme标注版面数据使用工具类转换为COCO格式。
Labelme实际操作
下面我们就以版面标注为例,讲解一下Labelme标注版面训练数据的方法。
一、建立版面类别
一个中文文档版面基本类别至少要包含以下8个:
Text,正文
Title,标题
Figure,图片
Figure caption,图片标题
Table,表格
Table caption,表格标题
Header,页眉
Footer,页脚
如果你所在的行业文档中有更丰富的分析要求,并且文档中会出现除基础类别以外的类别,那你可以根据需要添加类别。
例如:
论文类文档,通常会添加“引用”类别和“公式”类别
- 引用,Reference
- 公式,Equation
二、选择合适的标注框进行标注
一般文档版面标注,我们会使用矩形框、正方形框、多边形框进行标注,下图是使用矩形框标注的示例,我们可以在图中看到几个区域,标注区域、标签列表、多边形标签。
其中,标签列表就是版面的分类,多边形标签就是当前这页文档所有标注后的类别,当前这页我标注了3个Title、2个Text、1个Header、1个Table、1个Table caption 。
标注完保存后,我们会在图片目录看到一个与图片文件同名的json文件,如下图所示:
选取其中一个图片,查看JSON文件内容如下:
{
"version": "5.5.0",
"flags": {},
"shapes": [
{
"label": "Header",
"points": [
[
529.2301587301587,
89.61904761904768
],
[
657.8015873015873,
105.49206349206355
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Text",
"points": [
[
130.02380952380955,
155.49206349206355
],
[
1063.357142857143,
204.69841269841277
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Title",
"points": [
[
168.91269841269846,
211.8412698412699
],
[
326.05555555555554,
231.68253968253975
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Text",
"points": [
[
127.6428571428572,
237.2380952380953
],
[
1064.9444444444446,
315.01587301587307
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Title",
"points": [
[
169.70634920634924,
320.5714285714286
],
[
283.9920634920635,
340.4126984126985
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Text",
"points": [
[
126.84920634920636,
346.7619047619048
],
[
1064.1507936507937,
503.904761904762
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Title",
"points": [
[
130.81746031746033,
542.0
],
[
213.35714285714286,
565.8095238095239
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Text",
"points": [
[
127.6428571428572,
576.1269841269841
],
[
283.9920634920635,
598.3492063492064
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Title",
"points": [
[
126.84920634920636,
635.6507936507936
],
[
1013.3571428571428,
662.6349206349206
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Text",
"points": [
[
128.43650793650798,
669.7777777777778
],
[
285.57936507936506,
693.5873015873016
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
},
{
"label": "Footer",
"points": [
[
563.3571428571429,
1564.2222222222222
],
[
626.0555555555555,
1584.857142857143
]
],
"group_id": null,
"description": "",
"shape_type": "rectangle",
"flags": {},
"mask": null
}
],
"imagePath": "train_21.jpg",
"imageData": null,
"imageHeight": 1684,
"imageWidth": 1191
}
JSON文件核心内容如下:
- label, 表示分类
- points,表示左上角坐标和标注框的宽、高,也就是{x,y,w,h}的表示方式。
三、将JSON数据转换为COCO格式
使用labelme标注的版面训练集采用的JSON格式存储,需要转换为飞浆支持的COCO格式进行模型训练。
执行以下命令实现转换:
# train
python3 labelme2coco.py CDLA_dir/train train_save_path --labels labels.txt
# val
python3 labelme2coco.py CDLA_dir/val val_save_path --labels labels.txt
- CDLA_dir/train,为你的标注目录,里面是你的标注图片和JSON文件
- train_save_path,为转换后的的训练集存储地址
- –labels 是扩展参数,后面跟着labels.txt分类数据字典。
labels.txt内容如下:
Text
Title
Figure
Figure caption
Table
Table caption
Header
Footer
Reference
Equation
COCO数据结构介绍:
{
"images": [{
"file_name": "a9336d1f-train_5012.jpg",
"height": 601,
"width": 792,
"id": 0
}],
"annotations": [{
"id": 0,
"image_id": 0,
"category_id": 4,
"segmentation": [[528.0, 87.0, 658.0, 87.0, 658.0, 106.0, 528.0, 106.0]],
"bbox": [528.0, 87.0, 131.0, 20.0],
"ignore": 0,
"iscrowd": 0,
"area": 2620.0
}],
"categories": [
{"id": 0, "name": "Equation"},
{"id": 1, "name": "Figure"},
{"id": 2, "name": "Figure caption"},
{"id": 3, "name": "Footer"},
{"id": 4, "name": "Header"},
{"id": 5, "name": "Reference"},
{"id": 6, "name": "Table"},
{"id": 7, "name": "Table caption"},
{"id": 8, "name": "Text"},
{"id": 9, "name": "Title"}
]
}
标注格式包含以下信息:
info,表示标注文件info。
images,表示标注文件中图像信息列表,每个元素是一张图像的信息。如下为其中一张图像的信息:
file_name,表示目标图片的名称
height,表示目标图片的高度。
width,表示目标图片的宽度。
id,表示目标图片的id。
annotations,表示标注文件中目标物体的标注信息列表,每个元素是一个目标物体的标注信息。如下为其中一个目标物体的标注信息:
segmentation,表示目标物体的分割信息。
area,表示目标物体的面积。
iscrowd,表示目标物体是否为密集型,0为非密集,1为密集。
image_id,表示目标物体所属的图像id。
bbox,表示目标物体的边界框,格式为[x1,y1,w,h],此处为左上角坐标和宽高。
category_id,表示目标物体的类别id。
id,表示目标图片的id。
ignore, 表示目标物体是否为忽略的,0为否,1为是。
categories,版面数据字典
模型训练
转换成COCO的格式后,目录结构如下:
-rw-r--r-- 1 root root 1.2M Aug 31 03:54 annotations.json
drwxr-xr-x 2 root root 20K Aug 31 03:54 JPEGImages/
- annotations.json,为转化后的标注文件。
- JPEGImages/存放图片的目录
按照飞浆要求将转换后的标注文件与图片目录拷贝到相应的开发套件内,使用训练命令,即可完成标注文件的训练。
重点注意:训练集与验证集一定要使用同一个标注工具标注,保证导出后的标注文件格式中categories字典 ”数量“ 与 ”顺序“ 是一致的。
写在最后
今天我们详细讲解了如何使用 LabelMe 进行版面标注,展示了它操作简便、易于上手的特点。LabelMe 强大的标注功能为各种复杂的视觉任务提供了良好的支持。在接下来的内容中,我们将介绍另外两款标注工具的使用方法。掌握这些标注技能不仅能促进个人技术成长,还具备广阔的市场应用前景。希望更多人能熟练掌握标注工具,为视觉 AI 发展贡献力量。
如何学习AI大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传****,朋友们如果需要可以微信扫描下方****官方认证二维码免费领取【保证100%免费
】
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。