微信扫码
与创始人交个朋友
我要投稿
在上一期文章中,我们介绍了几款开源标注工具,各具特色并涵盖了丰富的功能。其中,Label Studio 和 LabelMe 被认为是最为全面的标注工具,尤其在不同应用场景中表现出色。具体选择哪款工具应根据个人或公司的需求和资源投入来决定。Label Studio 具备强大的扩展性,但架构复杂,部署成本相对较高。今天,我们将重点讲解 LabelMe,介绍其安装、标注流程及数据导出方法,并结合版面标注实例,展示如何建立标签和导出数据,并最终实现与飞桨模型的适配。这将帮助大家更好地理解如何利用 LabelMe 高效构建数据集,为后续模型训练打下坚实基础。
Labelme全面介绍
LabelMe 是由麻省理工学院(MIT)计算机科学与人工智能实验室(CSAIL)开发的强大开源图像标注工具,广泛应用于计算机视觉任务的数据标注。它支持多种标注类型,包括边界框、多边形、线段、关键点等,帮助用户高效地构建高质量的数据集。
使用pip安装:这是推荐的安装方式,只需在命令行中输入 ‘pip install labelme’ 即可。
conda create --name=labelme python=3conda activate labelmepip install labelme
git clone https://github.com/labelmeai/labelmecd labelmepip install -e .
labelme
启动Labelme的图形界面。Labelme支持多种标注方式,包括但不限于多边形标注、矩形标注、圆形标注、线条标注和点标注。这些标注方式可以满足不同应用场景的需求。
多边形标注:适用于标注复杂的形状和轮廓,如人形、图章等。
矩形标注:适用于标注简单的矩形区域,如车辆、建筑物等。
圆形标注:适用于标注圆形物体,如车轮、果实等。
线条标注:适用于标注路径、轨迹等线性结构。
此外,Labelme还支持图像级别标注,可以对整张图像进行分类标注。同时,Labelme还提供了自定义界面功能,用户可以根据需求预定义标签、设置自动保存等,实现界面定制。
Labelme广泛应用于各种计算机视觉项目中,包括但不限于:
自动驾驶:标注道路、车辆、行人等目标,为自动驾驶系统提供训练数据。
医疗影像分析:标注病变区域、器官轮廓等,辅助医生进行诊断。
遥感图像处理:标注地物、建筑等,为遥感图像分析提供数据支持。
工业检测:标注产品缺陷、零件位置等,用于质量控制和故障预测。
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
{"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, 表示分类
三、将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.txt内容如下:
TextTitleFigureFigure captionTableTable captionHeaderFooterReferenceEquation
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,版面数据字典
模型训练
-rw-r--r-- 1 root root 1.2M Aug 31 03:54 annotations.jsondrwxr-xr-x 2 root root 20K Aug 31 03:54 JPEGImages/
annotations.json,为转化后的标注文件,格式参考[COCO数据结构介绍]
JPEGImages/存放图片的目录
按照飞浆要求将转换后的标注文件与图片目录拷贝到相应的开发套件内,使用训练命令,即可完成标注文件的训练。
重点注意:训练集与验证集一定要使用同一个标注工具标注,保证导出后的标注文件格式中categories字典 ”数量“ 与 ”顺序“ 是一致的。
写在最后
声明:本文为 真聊技术 原创,转载请联系授权。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-07-18
2024-05-05
2024-06-20
2024-09-04
2024-05-19
2024-07-09
2024-07-09
2024-07-07
2024-06-13
2024-07-07