一个用于快速标记图像、视频和时间序列数据的包
项目描述
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 |