LabelImg与RethinkDB:实时更新的标注数据存储方案
你还在为标注数据分散在本地文件中难以协作而烦恼吗?还在手动同步团队成员的标注结果吗?本文将介绍如何将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格式为例,保存流程如下:
- 从图像路径获取图像信息(文件夹名称、文件名等)
- 创建PascalVocWriter对象,该对象定义在libs/pascal_voc_io.py中
- 将标注的边界框信息添加到writer对象中
- 调用writer的save方法将标注数据写入XML文件
RethinkDB简介
RethinkDB是一款开源的实时数据库,它允许应用程序实时监听数据变化并做出响应。与传统的关系型数据库相比,RethinkDB具有以下特点:
- 实时推送:当数据发生变化时,数据库会主动将更新推送给连接的客户端
- 文档型存储:采用JSON格式存储数据,适合存储结构灵活的标注信息
- 分布式架构:支持水平扩展,可轻松应对数据量增长
- 强大的查询语言:支持复杂的查询操作,包括过滤、聚合和连接等
实时标注数据存储方案设计
系统架构
我们的实时标注数据存储方案主要包含以下几个组件:
- LabelImg标注工具:负责图像标注,生成标注数据
- 数据同步模块:监听LabelImg的标注数据保存事件,将数据同步到RethinkDB
- RethinkDB数据库:存储标注数据,提供实时查询和推送功能
- 客户端应用:实时显示标注数据更新,支持团队协作
数据模型设计
根据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目录下。
主要实现思路如下:
- 监听标注文件目录的变化
- 当新的标注文件生成或现有文件更新时,解析标注数据
- 将解析后的数据转换为我们设计的数据模型
- 连接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,以支持更多类型的数据标注需求。
希望本文介绍的方案能够帮助你构建更高效的图像标注工作流。如果你有任何问题或建议,欢迎在评论区留言讨论。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





