LabelImg与RethinkDB:实时更新的标注数据存储方案

LabelImg与RethinkDB:实时更新的标注数据存储方案

【免费下载链接】labelImg 🎉 超级实用!LabelImg,图像标注神器,现在加入Label Studio社区,享受多模态数据标注新体验!🚀 简单易用,支持XML、YOLO和CreateML格式,适用于ImageNet等项目。不再单独维护,立即尝试Label Studio,安装一键到位,更灵活,功能更强大!👇 安装即刻开始:pip3 install labelImg,或访问 获取源码构建。一起探索数据标注的新边界!👨‍💻👩‍💻【此简介由AI生成】 【免费下载链接】labelImg 项目地址: https://gitcode.com/gh_mirrors/la/labelImg

你还在为标注数据分散在本地文件中难以协作而烦恼吗?还在手动同步团队成员的标注结果吗?本文将介绍如何将LabelImg图像标注工具与RethinkDB实时数据库结合,构建一套标注数据实时存储与同步的解决方案,让团队协作更高效,数据管理更便捷。读完本文后,你将能够:了解LabelImg的标注数据处理流程、掌握RethinkDB的基本使用方法、实现LabelImg与RethinkDB的集成,以及搭建一个简单的实时标注数据存储系统。

LabelImg标注数据处理流程

LabelImg是一款功能强大的图像标注工具,支持Pascal VOC、YOLO和CreateML等多种标注格式。其核心数据处理逻辑位于libs/labelFile.py文件中,该文件定义了LabelFile类,负责标注数据的保存和格式转换。

LabelFile类提供了三个主要的标注数据保存方法:save_pascal_voc_format、save_yolo_format和save_create_ml_format,分别对应三种不同的标注格式。以Pascal VOC格式为例,保存流程如下:

  1. 从图像路径获取图像信息(文件夹名称、文件名等)
  2. 创建PascalVocWriter对象,该对象定义在libs/pascal_voc_io.py
  3. 将标注的边界框信息添加到writer对象中
  4. 调用writer的save方法将标注数据写入XML文件

LabelImg界面

RethinkDB简介

RethinkDB是一款开源的实时数据库,它允许应用程序实时监听数据变化并做出响应。与传统的关系型数据库相比,RethinkDB具有以下特点:

  • 实时推送:当数据发生变化时,数据库会主动将更新推送给连接的客户端
  • 文档型存储:采用JSON格式存储数据,适合存储结构灵活的标注信息
  • 分布式架构:支持水平扩展,可轻松应对数据量增长
  • 强大的查询语言:支持复杂的查询操作,包括过滤、聚合和连接等

实时标注数据存储方案设计

系统架构

我们的实时标注数据存储方案主要包含以下几个组件:

  1. LabelImg标注工具:负责图像标注,生成标注数据
  2. 数据同步模块:监听LabelImg的标注数据保存事件,将数据同步到RethinkDB
  3. RethinkDB数据库:存储标注数据,提供实时查询和推送功能
  4. 客户端应用:实时显示标注数据更新,支持团队协作

mermaid

数据模型设计

根据LabelImg的标注数据结构,我们设计如下RethinkDB数据模型:

{
  "id": "自动生成的唯一ID",
  "image_path": "图像文件路径",
  "folder_name": "图像所在文件夹",
  "filename": "图像文件名",
  "size": {
    "width": 图像宽度,
    "height": 图像高度,
    "depth": 图像深度
  },
  "objects": [
    {
      "label": "目标类别标签",
      "bndbox": {
        "xmin": 边界框左上角x坐标,
        "ymin": 边界框左上角y坐标,
        "xmax": 边界框右下角x坐标,
        "ymax": 边界框右下角y坐标
      },
      "difficult": 0或1,表示目标是否难以识别
    }
  ],
  "created_at": "数据创建时间",
  "updated_at": "数据更新时间",
  "created_by": "创建者ID"
}

实现步骤

1. 安装RethinkDB Python客户端

首先,我们需要安装RethinkDB的Python客户端库:

pip install rethinkdb

2. 创建RethinkDB数据同步模块

我们可以参考tools/label_to_csv.py的实现,创建一个新的数据同步模块,用于将LabelImg生成的标注数据同步到RethinkDB。该模块可以命名为label_to_rethinkdb.py,放置在tools目录下。

主要实现思路如下:

  1. 监听标注文件目录的变化
  2. 当新的标注文件生成或现有文件更新时,解析标注数据
  3. 将解析后的数据转换为我们设计的数据模型
  4. 连接RethinkDB并插入或更新数据

3. 修改LabelFile类支持RethinkDB存储

为了使LabelImg能够直接将标注数据保存到RethinkDB,我们可以修改libs/labelFile.py文件,添加一个新的保存方法save_rethinkdb_format:

def save_rethinkdb_format(self, shapes, image_path, image_data, class_list, database_config):
    import rethinkdb as r
    from rethinkdb.errors import RqlRuntimeError
    
    # 连接到RethinkDB
    conn = r.connect(host=database_config['host'], port=database_config['port'], db=database_config['db'])
    
    # 获取图像信息
    img_folder_path = os.path.dirname(image_path)
    img_folder_name = os.path.split(img_folder_path)[-1]
    img_file_name = os.path.basename(image_path)
    
    # 读取图像尺寸
    if isinstance(image_data, QImage):
        image = image_data
    else:
        image = QImage()
        image.load(image_path)
    image_shape = [image.height(), image.width(), 1 if image.isGrayscale() else 3]
    
    # 构建标注数据对象
    annotation = {
        'image_path': image_path,
        'folder_name': img_folder_name,
        'filename': img_file_name,
        'size': {
            'height': image_shape[0],
            'width': image_shape[1],
            'depth': image_shape[2]
        },
        'objects': [],
        'created_at': r.now(),
        'updated_at': r.now(),
        'created_by': database_config['user']
    }
    
    # 添加边界框信息
    for shape in shapes:
        points = shape['points']
        label = shape['label']
        difficult = int(shape['difficult'])
        bnd_box = LabelFile.convert_points_to_bnd_box(points)
        
        annotation['objects'].append({
            'label': label,
            'bndbox': {
                'xmin': bnd_box[0],
                'ymin': bnd_box[1],
                'xmax': bnd_box[2],
                'ymax': bnd_box[3]
            },
            'difficult': difficult
        })
    
    # 插入或更新数据
    try:
        # 检查是否已存在该图像的标注数据
        existing = r.table('annotations').filter(r.row['image_path'] == image_path).run(conn)
        if existing.items:
            # 更新现有数据
            r.table('annotations').filter(r.row['image_path'] == image_path).update({
                'objects': annotation['objects'],
                'updated_at': r.now()
            }).run(conn)
        else:
            # 插入新数据
            r.table('annotations').insert(annotation).run(conn)
    except RqlRuntimeError as e:
        print("Error saving to RethinkDB:", e)
    finally:
        conn.close()

4. 配置预定义类别

LabelImg使用data/predefined_classes.txt文件定义默认的目标类别。我们可以根据需要修改该文件,添加或删除类别:

dog
person
cat
tv
car
meatballs
marinara sauce
tomato soup
chicken noodle soup
french onion soup
chicken breast
ribs
pulled pork
hamburger
cavity

5. 创建实时数据可视化界面

我们可以使用Web技术创建一个简单的实时数据可视化界面,用于显示RethinkDB中的标注数据。该界面可以实时展示团队成员的标注进度和标注结果,方便团队协作。

标注数据实时可视化

总结与展望

通过将LabelImg与RethinkDB结合,我们实现了标注数据的实时存储和同步,解决了传统文件存储方式下的数据分散和协作困难问题。这一方案不仅提高了团队协作效率,还为后续的标注数据管理、版本控制和模型训练奠定了基础。

未来,我们可以进一步扩展这一方案,例如添加用户权限管理、标注质量评估、自动标注辅助等功能,使整个标注流程更加智能化和高效化。同时,我们也可以探索将LabelImg与其他工具集成,如Label Studio,以支持更多类型的数据标注需求。

希望本文介绍的方案能够帮助你构建更高效的图像标注工作流。如果你有任何问题或建议,欢迎在评论区留言讨论。

【免费下载链接】labelImg 🎉 超级实用!LabelImg,图像标注神器,现在加入Label Studio社区,享受多模态数据标注新体验!🚀 简单易用,支持XML、YOLO和CreateML格式,适用于ImageNet等项目。不再单独维护,立即尝试Label Studio,安装一键到位,更灵活,功能更强大!👇 安装即刻开始:pip3 install labelImg,或访问 获取源码构建。一起探索数据标注的新边界!👨‍💻👩‍💻【此简介由AI生成】 【免费下载链接】labelImg 项目地址: https://gitcode.com/gh_mirrors/la/labelImg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值