label-studio --- dataset storage


前言

label-studio是标注数据的,label-studio-ml是机器学习预测的,但大多数project需要较多的数据量,label-studio通过URL或本地上传有文件个数限制,超过限制数量会报错,即使将报错的位置注释掉,同时加载几千几万张会使浏览器崩溃。因此,大量导入数据需要利用cloud and external storage,官方文档有具体说明,本文仅记录一下自己实现过程。


一、Sync data from external storage是什么?

通过将Label Studio与流行的云和外部存储系统集成,可以收集到这些存储系统中上传的新项,并将标注结果返回,以便在机器学习流程中使用。具体来说,这可能涉及监视云存储桶、容器、数据库或目录,以便在这些存储中有新数据上传时触发Label Studio进行标注。标注的结果可以用于训练机器学习模型或进行其他相关的分析和应用。

有以下几种可以设置的方式:
1.Amazon S3
2.Google Cloud Storage
3.Microsoft Azure Blob storage
4.Redis database
5.Local storage

二、Local storage

在这里插入图片描述

如果要从特定目录添加到Label Studio的本地文件,可以在LS作为源存储或目标存储运行的机器上设置特定的本地目录。Label Studio递归遍历目录以读取任务。需要增加两个变量:

LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true

LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/home/user (linux) 
or LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=D:\\123\\data (window)

1.label-studio启动

docker run -it -p 8080:8080 \
               -v $(pwd)/mydata:/label-studio/data \
               --env LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true \
               --env LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/label-studio/data/images \
               heartexlabs/label-studio:latest

mydata替换成自己的路径,如果出错就检查本地路径与容器路径是否匹配。

2.label-studio-ml启动

机器学习后端也需要指定数据集路径,不然报错推理给的是空值(未找到数据,我的是这样的)。

# 方法一
LOCAL_FILES_DOCUMENT_ROOT=D:\\123\\data
# 方法二
LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=D:\\123\\data

这样也会将本地存储的数据传递给机器学习后端进行预测。

三、操作流程

新建或打开一个project进入setting,选择Cloud Storage
在这里插入图片描述
点击add source storage:
在这里插入图片描述
选择local storage,其余选择如下图所示:
在这里插入图片描述
点击check connection:
在这里插入图片描述
在点击add storage:
在这里插入图片描述
最后点击dataset1的sync storage进行同步存储,刷新能看到加载进度:
在这里插入图片描述
在加载的时候,不要进行数据标定,我尝试过标注,加载会中断。

四、结果展示

New Project #2从3w张图像变成了3.1w张
在这里插入图片描述

打开task能进行预测标注:
在这里插入图片描述


总结

注意路径匹配!

根据您提供的错误信息,看起来是在处理`shapes`数据时出现了验证错误。错误信息显示`Value must be a float or an integer`,意味着`shapes`中的某些值不是浮点数或整数类型。 要解决这个问题,您可以在处理`shapes`数据之前添加验证步骤,确保`points`中的值都是浮点数或整数类型。以下是可能的解决方案: ```python from rest_framework.exceptions import ValidationError results = [] if masks is not None and masks.shape[0] > 0: for label, score, seg in zip(class_ids, conf, masks): # 解析分割掩码 mask = seg.argmax(axis=0) # 取最大值的索引,将二维掩码还原为一维 mask = mask.astype(np.uint8) # 将掩码转换为无符号整数类型 _, mask_binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY) # 将掩码转换为二值图像 # 获取分割多边形 contours, _ = cv2.findContours(mask_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contour = contours[0] if len(contours) > 0 else [] # 将分割多边形的点坐标转换为列表的点(points)形式 points = contour.squeeze().tolist() if len(contour) > 0 else [] # 添加验证步骤,确保points中的值都是浮点数或整数类型 for point in points: if not isinstance(point, (float, int)): raise ValidationError("Value must be a float or an integer") results.append({ "confidence": str(score), "label": labels.get(label, "unknown"), "points": points, "type": "polygon", "mask": mask.tolist() # 将分割掩码转换为列表形式 }) ``` 在这个示例中,我添加了一个循环来验证`points`中的值是否为浮点数或整数类型。如果发现有不符合要求的值,将会抛出`ValidationError`异常。 请注意,这只是一个示例解决方案,具体的验证步骤可能需要根据您的数据结构和需求进行调整。 希望这次能够解决问题。如果您还有其他疑问,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值