一个用于快速标记图像、视频和时间序列数据的包
项目描述
QSL: 快速简单标记器
QSL是一个简单的开源媒体标记工具,可以用作Jupyter小部件。更多信息请访问https://qsl.robinbay.com。它支持
- 图像和视频的边界框、多边形和分割掩码标记(支持视频片段)。
- 基于点和范围的时序标记。
- 自动键盘快捷键标记。
- 加载本地、网页或云存储(目前仅限AWS S3)中存储的图像。
- 在队列中预加载图像以加快标记速度。
请注意,QSL仍在开发中,可能存在重大错误、破坏性更改等问题。欢迎提交错误报告和贡献!
通过使用pip install qsl开始安装。使用独立界面将图像文件夹标记为JSON,使用qsl label labels.json images/*.jpg。查看Colab笔记本了解如何使用Jupyter小部件的示例。
示例
以下每个示例都展示了使用此工具标记媒体的不同方法。每个示例的顶部都列出了生成示例所用的参数。
- 要使用Jupyter小部件的示例,请使用
qsl.MediaLabeler(**params) - 要使用命令行应用程序的示例,请使用
open("project.json", "w").write(json.dumps(params)),然后运行qsl label project.json。
图像
import qsl
params = dict(
config={
"image": [
{"name": "Location", "multiple": False, "options": [{"name": "Indoor"}, {"name": "Outdoor"}]},
{"name": "Flags", "multiple": True, "freeform": True},
{"name": "Type", "multiple": False, "options": [{"name": "Cat"}, {"name": "Dog"}]},
],
"regions": [
{"name": "Type", "multiple": False, "options": [{"name": "Eye"}, {"name": "Nose"}]}
]
},
items=[
{"target": "https://picsum.photos/id/1025/500/500", "defaults": {"image": {"Type": ["Dog"]}}},
],
)
qsl.MediaLabeler(**params)
视频
import qsl
params = dict(
config={
"image": [
{"name": "Location", "multiple": False, "options": [{"name": "Indoor"}, {"name": "Outdoor"}]},
{"name": "Flags", "multiple": True, "freeform": True},
],
"regions": [
{"name": "Type", "multiple": False, "options": [{"name": "Eye"}, {"name": "Nose"}]}
]
},
items=[
{
"target": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
"type": "video",
}
],
)
qsl.MediaLabeler(**params)
图像批处理
import qsl
params = dict(
config={
"image": [
{"name": "Type", "multiple": False, "options": [{"name": "Cat"}, {"name": "Dog"}]},
{"name": "Location", "multiple": False, "options": [{"name": "Indoor"}, {"name": "Outdoor"}]},
{"name": "Flags", "multiple": True, "freeform": True},
],
"regions": [
{"name": "Type", "multiple": False, "options": [{"name": "Eye"}, {"name": "Nose"}]}
]
},
items=[
{"target": "https://picsum.photos/id/1025/500/500", "defaults": {"image": {"Type": ["Dog"]}}},
{"target": "https://picsum.photos/id/1062/500/500", "metadata": {"source": "picsum"}},
{"target": "https://picsum.photos/id/1074/500/500"},
{"target": "https://picsum.photos/id/219/500/500"},
{"target": "https://picsum.photos/id/215/500/500"},
{"target": "https://picsum.photos/id/216/500/500"},
{"target": "https://picsum.photos/id/217/500/500"},
{"target": "https://picsum.photos/id/218/500/500"},
],
batchSize=2
)
qsl.MediaLabeler(**params)
时间序列
import qsl
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
params = dict(
config={
"image": [
{"name": "Peaks", "multiple": True},
{"name": "A or B", "freeform": True},
]
},
items=[
{
"target": {
"plots": [
{
"x": {"name": "time", "values": x},
"y": {
"lines": [
{
"name": "value",
"values": np.sin(x),
"color": "green",
"dot": {"labelKey": "Peaks"},
}
]
},
"areas": [
{
"x1": 0,
"x2": np.pi,
"label": "a",
"labelKey": "A or B",
"labelVal": "a",
},
{
"x1": np.pi,
"x2": 2 * np.pi,
"label": "b",
"labelKey": "A or B",
"labelVal": "b",
},
],
}
],
},
"type": "time-series",
}
],
)
qsl.MediaLabeler(**params)
堆叠图像
params = dict(
items=[
{
"type": "image-stack",
"target": {
"images": [
{
"name": image["name"],
"target": image["filepath"],
"transform": cv2.getRotationMatrix2D(
center=(0, 0), angle=image["angle"], scale=1
),
}
for image in qsl.testing.files.ROTATED_TEST_IMAGES
]
},
}
],
config={
"image": [
{
"name": "Type",
"multiple": False,
"options": [{"name": "Cat"}, {"name": "Dog"}],
},
{
"name": "Location",
"multiple": False,
"options": [{"name": "Indoor"}, {"name": "Outdoor"}],
},
{"name": "Flags", "multiple": True, "freeform": True},
],
"regions": [
{
"name": "Type",
"multiple": False,
"options": [{"name": "Eye"}, {"name": "Nose"}],
}
],
},
)
qsl.MediaLabeler(**params)
API
Jupyter 小部件
qsl.MediaLabeler 接受以下参数
config[必需]:用于标记的配置。它具有以下属性。image[必需]:图像的图像级别标记配置,视频的帧级别,时间序列目标的时序级别。它是一个对象列表,每个对象都具有以下属性name[必需]:标签条目的名称。displayName:UI 中标签条目的显示名称。默认值为name的相同值。multiple:用户是否可以为此标签条目提供多个标签。默认为false。freeform:用户是否可以为此条目编写自己的标签。默认为false。required:用户是否必须为此条目提供标签。options:用户可以从中选择的选项列表 -- 每个选项都有以下属性。name[必需]:选项的名称。displayName:选项的显示名称。默认值为name的相同值。shortcut:用于此选项的单字符键盘快捷键。如果未设置,qsl将尝试动态生成一个。
regions[必需]:图像和视频帧的区域级别标记配置。对time-series目标没有影响。它是一个具有与image键相同结构的对象列表。
items[必需]:要标记的项目列表,每个项目都具有以下属性。jsonpath:保存标签的位置。如果没有设置此属性或顶级jsonpath参数,您必须从labeler.items获取标签。type[可选,默认=image]:标记目标类型。选项是image、video和time-series。metadata:有关目标的自定义元数据,它将与媒体一起显示,并在媒体索引中显示。作为具有字符串键和值的对象提供(不支持非字符串值)。target[可选]:实际要标记的内容。允许的类型取决于目标的type。- 如果
type是video,则target可以是- 视频的字符串文件路径。
- 视频的字符串 URL(例如,
https://example.com/my-video.mp4) - 视频的字符串 S3 资源 URL(例如,
s3://my-bucket/my-video.mp4) - 表示 base64 编码文件的字符串(例如,
data:image/png;charset=utf-8;base64,...)
- 如果
type是image,则target可以是任何图像类型(文件路径、URL、base64 编码文件)。此外,它还可以是- 形状为
(height, width, 3)的numpy数组。最后一个轴应该是 BGR 顺序的颜色(即 OpenCV 顺序)。
- 形状为
- 如果
type是time-series,则唯一允许的类型是具有以下键的对象plots[必需]:表示图表的对象列表,每个对象都具有以下属性x[必需]:具有以下属性的属性对象name[必需]:用于 x 轴的名称。values[必需]:数值数组的数组。
y[必需]:具有以下属性的属性对象lines[必需]:对象数组,每个对象都具有以下属性name[必需]:用于绘制图例的此线的名称。values[必需]: 表示该行的数值数组。其长度必须与x.values相同。color[可选]: 表示线条颜色的字符串。默认为blue。dot[可选]: 一个对象,包含以下属性,用于配置用户点击数据点时发生的操作。labelKey[必需]: 用户点击的数值应该应用到的图像级标签。如果用户点击数据点,则点击点的 x 坐标将设置为labelKey中的标签。如果该标签有"multiple": True,则将其附加到值列表中。如果是"multiple": False,则点击点的 x 坐标将替换labelKey中的值。
areas[可选]: 要绘制到图上的可点击区域列表,每个区域应具有以下属性x1[必需]: 区域的起始 x 坐标。x2[必需]: 区域的结束 x 坐标。labelKey[必需]: 用户点击区域时,该区域将写入的标签条目。labelVal[必需]: 用户点击区域时,标签条目将被分配的值。label[必需]: 将显示在区域上的文本标签。
- 如果
labels: 目标的标签。当用户在界面中标记项目时,此属性将修改。- 对于图像,它具有以下属性
image: 图像级标签,形式为{[name]: [...labels]},其中name对应于config.image数组中相应条目的name。polygons: 图像的多边形标签,形式为points[必需]: 一系列{x: float, y: float}值。其中x和y分别表示宽度和高度的百分比。labels: 与上面image键相同的对象。
boxes: 图像的直角边框标签,形式为pt1[必需]: 顶点左上点,作为{x: float, y: float}对象。pt2[必需]: 顶点右下点。格式与pt1相同。labels: 与上面image键相同的对象。
masks: 形式的分割掩码dimensions[必需]: 分割掩码的尺寸,作为width: int, height: int对象。counts[必需]: COCO 风格的运行长度编码掩码。
- 对于视频,它是一个表示帧标签的对象数组。每个对象的形式为
timestamp[必需]: 视频中标记帧的时间戳。end: 结束时间戳,对于用户正在标记一系列帧的情况。他们可以通过在播放条上 alt 点击来选择结束帧。labels: 与图像labels属性相同,但用于时间戳帧(即具有image、polygons、boxes和masks的对象)。
- 对于图像,它具有以下属性
defaults: 与给定项目一起出现的默认标签。在用户想要简单地接受并继续的情况下非常有用。结构与defaults相同。
allowConfigChange: 是否允许用户从界面中更改标记配置。默认为 true。maxCanvasSize: 绘制分割图的最大的尺寸。默认为 512。大于此尺寸的图像将用于分割图目的进行下采样。maxViewHeight: UI 的最大视图尺寸。默认为 512。您将能够在较大的图像周围平移/缩放。mode: 呈现 UI 的样式。在 "light" 或 "dark" 之间选择。默认为 "light"。batchSize:对于图像,同时显示用于标注的最大图像数量。任何大于1的值都与包含regions的任何配置不兼容。视频和时间序列将仍然一次标注一个。jsonpath:保存此标注器标签和配置的位置。如果既未设置此属性也未设置顶层jsonpath参数,则必须从labeler.items获取标签。请注意,如果此路径上的文件与提供的任何参数设置冲突,则将使用文件中的设置。
命令行应用程序
您可以使用qsl label <project-json-file> <...files>从命令行启动相同的标注界面。如果项目文件不存在,它将被创建。您提供的文件将被添加。如果项目文件已经存在,则列表上尚未出现的文件将被添加。您可以通过编辑项目文件来修改无法从UI中更改的设置(即allowConfigChange、maxCanvasSize、maxViewHeight、mode和batchSize)。
开发
请确保您已安装rustup和wasm-pack。
- 使用
make init创建本地开发环境。 - 使用
make develop运行带有实时重建的小部件开发。 - 使用
make lab运行Jupyter Lab实例。JavaScript/TypeScript的更改需要完全刷新才能生效。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
此版本没有可用的源代码分发文件。请参阅生成分发存档的教程。
构建的分发
qsl-0.2.41-py2.py3-none-any.whl (1.7 MB 查看哈希值)
关闭
qsl-0.2.41-py2.py3-none-any.whl的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 1b7ce1b50f92712a9cd534d40e28418dd29b93e4b95d273745a23afe81514e09 |
|
| MD5 | 69431fd12dd58acc8890cce9f1df8403 |
|
| BLAKE2b-256 | c989c9a8ac29564796667e5862ac898c2067c89dfb5fb4aa6d81b58bb872f771 |