news 2026/6/10 18:39:07

【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程

1. 脚本功能介绍

本脚本用于批量复制LabelMe标注信息,特别适用于以下场景:

  • 您有一批图片,其中物体位置、形状、大小基本相同
  • 您已经使用LabelMe标注了第一张图片
  • 您希望将第一张图片的标注信息快速复制到其他图片中
  • 需要自动适应不同图片的尺寸信息

核心功能:

  • 读取源JSON标注文件
  • 自动获取目标图片的尺寸信息
  • 保留所有标注形状、标签、颜色等信息
  • 为每张目标图片生成对应的LabelMe JSON标注文件
  • 支持多种常见图片格式

2. 环境依赖

2.1 安装必要的Python库

pipinstallopencv-python tqdm

2.2 依赖库说明

  • opencv-python: 用于读取图片获取尺寸信息
  • tqdm: 提供进度条显示,直观展示处理进度
  • json: 处理LabelMe的JSON标注文件
  • os: 文件路径操作
  • argparse: 命令行参数解析(当前版本已硬编码参数,但保留了扩展性)

3. 代码结构说明

3.1 主要函数

  • copy_labelme_annotations(): 核心功能函数,负责复制标注
  • main(): 程序入口,配置参数并调用核心函数

3.2 当前配置(您修改后的版本)

defmain():source_json="../1765555160.json"copy_labelme_annotations(source_json_path=source_json,image_dir="../bbbb",output_dir="../bbbb")

当前配置说明:

  • 源标注文件:../1765555160.json
  • 图片目录:../bbbb
  • 输出目录:../bbbb(标注文件将保存在同一目录)

4. 使用方法

4.1 方法一:直接运行(推荐新手使用)

  1. 创建目录结构

    your_project/ ├── copy_annotations.py # 本脚本 ├── 1765555160.json # 您的源标注文件 └── bbbb/ # 存放所有图片的目录 ├── image1.jpg ├── image2.jpg ├── image3.jpg └── ...
  2. 将脚本参数修改为您实际的路径

    defmain():source_json="../1765555160.json"# 修改为您的源JSON文件路径copy_labelme_annotations(source_json_path=source_json,image_dir="../bbbb",# 修改为您的图片目录output_dir="../bbbb"# 修改为输出目录)
  3. 运行脚本

    python copy_annotations.py

4.2 方法二:命令行参数方式(推荐高级用户)

如果您希望使用命令行参数,可以将main()函数修改为:

defmain():parser=argparse.ArgumentParser(description='批量复制LabelMe标注')parser.add_argument('--source_json',required=True,help='源标注JSON文件路径')parser.add_argument('--image_dir',required=True,help='图片目录路径')parser.add_argument('--output_dir',default=None,help='输出目录路径(可选,默认与image_dir相同)')args=parser.parse_args()copy_labelme_annotations(source_json_path=args.source_json,image_dir=args.image_dir,output_dir=args.output_dir)

命令行使用示例:

python copy_annotations.py\--source_json../1765555160.json\--image_dir../bbbb\--output_dir../bbbb

5. 参数详细说明

5.1 函数参数

参数名类型必需说明
source_json_pathstr源标注JSON文件路径,包含第一张图片的标注信息
image_dirstr存放所有图片的目录路径
output_dirstr输出目录路径,如果为None则使用image_dir

5.2 支持的图片格式

脚本支持以下图片格式(不区分大小写):

  • .jpg/.jpeg
  • .png
  • .bmp
  • .tiff/.tif

5.3 JSON文件结构说明

生成的JSON文件包含以下关键字段:

  • version: LabelMe版本号
  • flags: 标签标志
  • shapes: 标注形状列表(点、线、矩形、多边形等)
  • imagePath: 对应的图片文件名
  • imageHeight: 图片高度
  • imageWidth: 图片宽度
  • imageData: None(不包含图像数据,减小文件大小)

6. 运行示例

6.1 预期输出

源标注文件: ../1765555160.json 检测到 5 个标注对象 找到 15 张图片,将为 14 张图片复制标注 复制标注: 100%|██████████| 14/14 [00:02<00:00, 6.21it/s] 完成! 已为 14 张图片创建标注文件

6.2 生成的文件

../bbbb/目录下,每张图片都会生成对应的JSON文件:

bbbb/ ├── image1.jpg ├── image1.json # 自动生成 ├── image2.jpg ├── image2.json # 自动生成 ├── ... └── 1765555160.jpg # 源图片(不会重复生成)

7. 注意事项

7.1 重要前提条件

图片内容相似性:所有图片中的物体位置、形状、大小应基本相同
图片格式一致性:确保图片是脚本支持的格式
路径正确性:检查所有路径是否存在,特别是源JSON文件和图片目录

7.2 常见问题及解决

问题1:无法读取图片
警告: 无法读取图片 ../bbbb/image1.jpg, 跳过

解决方法:

  • 检查图片路径是否正确
  • 确认图片文件未损坏
  • 检查是否有权限读取该文件
问题2:JSON格式错误
JSONDecodeError: Expecting value: line 1 column 1 (char 0)

解决方法:

  • 用文本编辑器打开源JSON文件,检查是否是有效的JSON格式
  • 确保JSON文件是UTF-8编码
  • 重新使用LabelMe保存标注文件
问题3:标注位置不准确

解决方法:

  • 如果图片尺寸差异较大,复制的标注可能位置不准确
  • 建议在LabelMe中手动调整位置
  • 或者使用图像配准算法先对齐图片

7.3 性能优化

  • 大图片处理:如果图片很大,处理速度会变慢,建议先缩小图片尺寸
  • 批量处理:一次处理大量图片时,确保有足够的内存
  • 文件备份:运行前建议备份原始标注文件,防止意外覆盖

8. 高级用法

8.1 自定义修改标注

如果您需要在复制过程中修改标注,可以在循环中添加自定义逻辑:

# 在复制形状标注的循环中添加forshapeinsource_data['shapes']:new_shape=shape.copy()# 示例:修改所有矩形的标签ifnew_shape['shape_type']=='rectangle':new_shape['label']='modified_'+new_shape['label']# 示例:缩放所有坐标(适应不同尺寸)scale_x=width/source_data['imageWidth']scale_y=height/source_data['imageHeight']new_points=[[x*scale_x,y*scale_y]forx,yinnew_shape['points']]new_shape['points']=new_points new_data['shapes'].append(new_shape)

8.2 与其他工具集成

# 1. 先复制标注python copy_annotations.py --source_json template.json --image_dir images# 2. 然后用LabelMe验证和微调labelme images/

9. 完整代码(带注释版本)

importjsonimportosimportcv2fromtqdmimporttqdmimportargparsedefcopy_labelme_annotations(source_json_path,image_dir,output_dir=None):""" 将第一张图片的labelme标注信息复制到同一目录下的其他图片 参数: source_json_path: 第一张已标注图片对应的JSON文件路径 image_dir: 图片所在的目录 output_dir: 输出目录,如果为None则使用image_dir 功能流程: 1. 读取源JSON文件 2. 获取所有目标图片 3. 为每张目标图片: - 读取图片获取尺寸 - 创建新的标注数据 - 复制标注形状 - 保存JSON文件 """# 读取源JSON文件withopen(source_json_path,'r',encoding='utf-8')asf:source_data=json.load(f)print(f"源标注文件:{source_json_path}")print(f"检测到{len(source_data['shapes'])}个标注对象")# 获取源图片信息source_image_path=source_data['imagePath']source_image_name=os.path.basename(source_image_path)# 设置输出目录ifoutput_dirisNoneoroutput_dir.strip()=="":output_dir=image_dir# 创建输出目录(如果不存在)os.makedirs(output_dir,exist_ok=True)# 获取所有图片文件image_extensions=['.jpg','.jpeg','.png','.bmp','.tiff','.tif']all_images=[]forfinos.listdir(image_dir):ext=os.path.splitext(f)[1].lower()ifextinimage_extensions:all_images.append(f)# 排除源图片target_images=[imgforimginall_imagesifimg!=source_image_name]print(f"找到{len(all_images)}张图片,将为{len(target_images)}张图片复制标注")# 处理每张目标图片successful_count=0forimage_nameintqdm(target_images,desc="复制标注"):image_path=os.path.join(image_dir,image_name)# 读取图片获取尺寸try:img=cv2.imread(image_path)ifimgisNone:print(f"警告: 无法读取图片{image_path}, 跳过")continueheight,width=img.shape[:2]# 创建新的标注数据new_data={"version":source_data.get("version","5.0.1"),"flags":source_data.get("flags",{}),"shapes":[],"imagePath":image_name,"imageData":None,# 不包含图像数据以减小文件大小"imageHeight":height,"imageWidth":width}# 复制形状标注forshapeinsource_data['shapes']:new_shape=shape.copy()# 确保shape_type字段存在if'shape_type'notinnew_shape:new_shape['shape_type']='polygon'new_data['shapes'].append(new_shape)# 生成输出JSON文件名output_json_name=os.path.splitext(image_name)[0]+'.json'output_json_path=os.path.join(output_dir,output_json_name)# 保存新的JSON文件withopen(output_json_path,'w',encoding='utf-8')asf:json.dump(new_data,f,ensure_ascii=False,indent=2)successful_count+=1exceptExceptionase:print(f"处理图片{image_name}时出错:{str(e)}")continueprint(f"完成! 成功为{successful_count}/{len(target_images)}张图片创建标注文件")ifsuccessful_count<len(target_images):print(f"警告: 有{len(target_images)-successful_count}张图片处理失败,请检查日志")defmain():""" 主函数 - 当前配置版本 使用前请根据实际情况修改以下路径: """# ====== 请在此处修改您的路径配置 ======source_json="../1765555160.json"# 源标注JSON文件路径image_dir="../bbbb"# 图片目录路径output_dir="../bbbb"# 输出目录路径(可与image_dir相同)# ======================================print("="*50)print("LabelMe标注批量复制工具")print("="*50)print(f"配置信息:")print(f" 源标注文件:{source_json}")print(f" 图片目录:{image_dir}")print(f" 输出目录:{output_dir}")print("-"*50)# 检查文件和目录是否存在ifnotos.path.exists(source_json):print(f"错误: 源标注文件不存在 -{source_json}")returnifnotos.path.exists(image_dir):print(f"错误: 图片目录不存在 -{image_dir}")returncopy_labelme_annotations(source_json_path=source_json,image_dir=image_dir,output_dir=output_dir)if__name__=="__main__":main()

10. 总结

这个脚本能够大幅提升标注效率,特别适用于:

  • 工业检测中的相似产品图片
  • 监控视频中的连续帧
  • 产品展示的多角度照片
  • 任何具有重复模式的图像数据集

使用流程总结:

  1. 标注第一张图片(使用LabelMe)
  2. 配置脚本参数(修改路径)
  3. 运行脚本批量生成标注
  4. 使用LabelMe验证和微调标注
  5. 导出为所需格式(COCO、YOLO等)

通过这个工具,您可以将原本需要几小时的标注工作缩短到几分钟,大大提高数据准备效率!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:36:50

深入解析Redis三大缓存问题:穿透、击穿、雪崩及解决方案

引言 在当今高并发的互联网应用中&#xff0c;缓存已经成为提升系统性能的标配组件。Redis作为最受欢迎的内存数据库之一&#xff0c;以其高性能、丰富的数据结构支持&#xff0c;成为了缓存方案的首选。然而&#xff0c;错误的缓存使用方式不仅无法提升性能&#xff0c;反而可…

作者头像 李华
网站建设 2026/6/10 13:36:40

欧赔核心思维之欧赔、亚盘表达能力的差别

玩亚盘的朋友看到这期视频&#xff0c;可能要辗转难眠了&#xff0c;玩欧赔的朋友&#xff0c;你会庆幸当初的选择。今天这期分享&#xff0c;咱们来说说欧赔亚盘再表达能力上的差别。大家都知道&#xff0c;亚盘属于平面思维&#xff0c;要么上&#xff0c;要么下&#xff0c;…

作者头像 李华
网站建设 2026/6/9 23:15:02

YOLO11-EfficientViT输送机袋状物目标检测与跟踪

1. YOLO11-EfficientViT输送机袋状物目标检测与跟踪 在工业自动化领域&#xff0c;输送机上的袋状物检测与跟踪一直是个技术难题&#xff01;&#x1f92f; 传统方法往往受限于复杂环境、光照变化和物体遮挡等问题&#xff0c;导致检测精度不高。今天&#xff0c;我要给大家介…

作者头像 李华
网站建设 2026/6/10 2:14:13

程序卡顿大揭秘:内存是如何一步步被“掏空”的

程序卡顿大揭秘:内存是如何一步步被“掏空”的 一、内存:程序运行的 “神秘仓库” 在程序的世界里,内存堪称是程序运行的 “神秘仓库”,它就像一个高效的即时存取空间,所有程序在运行时,都需要在这里临时地存取数据。打个比方,内存对于程序,就如同舞台对于演员,没有舞…

作者头像 李华
网站建设 2026/6/10 0:23:49

Claude-Opus-4.5 极速接入指南

一、3步极速接入Claude-Opus-4.5&#xff0c;零门槛上手步骤1&#xff1a;获取Claude-Opus-4.5专属API Key完成平台注册登录后&#xff0c;系统将自动发放Claude-Opus-4.5免费体验额度&#xff0c;无需提交额外申请材料&#xff0c;即时到账可用&#xff1b;登录后台管理系统&a…

作者头像 李华
网站建设 2026/6/10 13:31:30

排名越靠前的求职机构,我越劝你远离

排名越靠前的求职机构&#xff0c;我越劝你远离&#xff1a;“榜单冠军”背后的三大陷阱&#xff0c;正在透支海归求职的最后窗口期“榜单排名服务承诺”——这句话&#xff0c;已成为众多海外学子及其家长在国内求职市场中最昂贵的错觉。当我们翻阅着各类平台评选的“十大优质…

作者头像 李华