跳转到主要内容

一个用于快速标记图像、视频和时间序列数据的包

项目描述

QSL: 快速简单标记器

QSL Screenshot

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)

image labeling demo

视频

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)

video labeling demo

图像批处理

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)

image batch labeling demo

时间序列

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)

time series labeling demo

堆叠图像

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]:标记目标类型。选项是 imagevideotime-series
    • metadata:有关目标的自定义元数据,它将与媒体一起显示,并在媒体索引中显示。作为具有字符串键和值的对象提供(不支持非字符串值)。
    • target [可选]:实际要标记的内容。允许的类型取决于目标的 type
      • 如果 typevideo,则 target 可以是
        • 视频的字符串文件路径。
        • 视频的字符串 URL(例如,https://example.com/my-video.mp4
        • 视频的字符串 S3 资源 URL(例如,s3://my-bucket/my-video.mp4
        • 表示 base64 编码文件的字符串(例如,data:image/png;charset=utf-8;base64,...
      • 如果 typeimage,则 target 可以是任何图像类型(文件路径、URL、base64 编码文件)。此外,它还可以是
        • 形状为 (height, width, 3)numpy 数组。最后一个轴应该是 BGR 顺序的颜色(即 OpenCV 顺序)。
      • 如果 typetime-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} 值。其中 xy 分别表示宽度和高度的百分比。
          • 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 属性相同,但用于时间戳帧(即具有 imagepolygonsboxesmasks 的对象)。
    • 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中更改的设置(即allowConfigChangemaxCanvasSizemaxViewHeightmodebatchSize)。

开发

请确保您已安装rustupwasm-pack

  1. 使用make init创建本地开发环境。
  2. 使用make develop运行带有实时重建的小部件开发。
  3. 使用make lab运行Jupyter Lab实例。JavaScript/TypeScript的更改需要完全刷新才能生效。

项目详情


发行历史 发行通知 | RSS源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

此版本没有可用的源代码分发文件。请参阅生成分发存档的教程

构建的分发

qsl-0.2.41-py2.py3-none-any.whl (1.7 MB 查看哈希值)

上传时间: Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面