视频目标检测与追踪
视频目标检测旨在通过边界框检测视频流中的物体,这与图像目标检测处理静态图像的方式不同。
视频对象追踪是检测对象在视频帧中空间和时间方向上移动时的进一步扩展。 图示模板提供了手动和自动两种方式来追踪视频中的对象。除了支持逐帧视频对象追踪的新视频播放器外,最新版本还采用了更高效、符合人体工学且灵活的全新标注用户界面。
重要
- 在Label Studio 1.6版本之前,视频分类和对象追踪功能仅支持预览,现已全面实现并可用于生产环境。
- 在Label Studio Enterprise中,视频对象追踪被称为用于视频对象检测的视频标注。
- 支持的视频格式包括
mpeg4/H.264 webp和webm。视频格式支持情况还取决于浏览器以及客户端的任何预转换设置。
前提条件
使用视频对象检测功能的前提条件如下:
- 准备必须标注的数据集。
- 使用支持该数据标签的工具。
- 使用视频分类功能中提供的视频播放器。
- 将所有边界框显示在屏幕上。
支持的关键特性
视频播放器支持以下关键功能:
- 视频和物体检测用例在视频上使用边界框。
- 通过在视频上创建矩形框来实现视频分割。
标注配置
获取目标检测与跟踪项目的最简单方法是在项目设置中指定以下标注配置。
<View>
<Header>Label the video:</Header>
<Video name="video" value="$video" framerate="25.0"/>
<VideoRectangle name="box" toName="video" />
<Labels name="videoLabels" toName="video" allowEmpty="true">
<Label value="Man" background="blue"/>
<Label value="Woman" background="red"/>
<Label value="Other" background="green"/>
</Labels>
</View>
关于标注配置
所有标注配置必须包含在View标签内。
您可以添加一个header来为标注者提供说明:
<Header>Label the video:</Header>
使用Video对象标签来指定视频数据。framerate参数设置项目中所有视频的帧率。查看标签页面参考中的所有可用参数。
<Video name="video" value="$video" frameRate="25.0"/>
备注
确保frameRate与视频的帧率匹配。如果您的视频存在缺陷或可变帧率,可能会导致差异。在上传前将视频转码为恒定帧率会有所帮助。
使用VideoRectangle控制标签让标注者可以在视频帧上添加矩形框:
<VideoRectangle name="box" toName="video" />
使用Labels控制标签来指定可添加到视频帧中矩形区域的标签:
<Labels name="videoLabels" toName="video" allowEmpty="true">
<Label value="Man" background="blue"/>
<Label value="Woman" background="red"/>
<Label value="Other" background="green"/>
</Labels>
您可以在<Labels>部分中替换和添加更多标签,以适应您的标注场景。
输入数据
通过视频流URL输入的指定数据由<Video>标签中的value属性定义。
对于上面的示例,预期使用以下导入JSON格式:
{
"video": "https://htx-pub.s3.amazonaws.com/samples/opossum_snow.mp4"
}
输出数据
标注数据包含手动创建的关键帧,以及可选的内插关键帧。以下是JSON模式的说明:
| JSON键名 | 类型 | 描述 |
|---|---|---|
| id | string | 区域(追踪对象) ID |
| type | string | "videorectangle" |
| value.labels | list of strings | 对象标签 |
| value.duration | numeric | 视频流中对象生命周期的总持续时间(以秒为单位) |
| value.sequence | 对象列表 | 关键帧列表 |
value.sequence 列表中的关键帧格式如下:
| JSON键名 | 类型 | 描述 |
|---|---|---|
| x | numeric | x轴边界框坐标(左上角定位,从左到右排列) |
| y | numeric | y轴边界框坐标(采用左上角定位方式,从上至下递增) |
| time | numeric | 关键帧时间绝对时间位置(以秒为单位) |
| frame | numeric | 关键帧索引位置(从0开始的帧数) |
| width | numeric | 当前帧中边界框的宽度 |
| height | numeric | 当前帧中边界框的高度 |
| rotation | numeric | 当前帧中边界框的顺时针旋转角度 |
| enabled | boolean | 是否开启后续帧插值功能(例如用于标注遮挡情况) |
示例
{
"id": "d1111333b6",
"type": "videorectangle",
"value": {
"labels": [
"Other"
],
"duration": 11.96,
"sequence": [
{
"x": 46.71875,
"y": 6.944444444444445,
"time": 0.04,
"frame": 1,
"width": 4.0625,
"height": 23.61111111111111,
"enabled": true,
"rotation": 0
},
{
"x": 46.640625,
"y": 6.666666666666667,
"time": 0.24,
"frame": 6,
"width": 4.140625,
"height": 23.88888888888889,
"enabled": true,
"rotation": 0
}
],
"framesCount": 299
},
"origin": "manual",
"to_name": "video",
"from_name": "box"
}
导出插值帧
默认情况下,导出数据时仅包含关键帧。
导出标注时,您可能希望包含插值帧。这将确保视频中的每一帧都被包含在内。
您可以通过使用interpolate_key_frames参数和以下方法之一来实现:
使用API创建启用插值的导出快照
您可以使用Label Studio API创建一个启用了关键帧插值的导出快照。
端点:
POST /api/projects/{project_id}/exports
请求体:
{
"title": "Export with Interpolated Keyframes",
"serialization_options": {
"interpolate_key_frames": true
}
}
示例cURL命令:
curl -X POST 'https://your-label-studio-domain.com/api/projects/{project_id}/exports' \
-H 'Authorization: Token YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data-raw '{
"title": "Export with Interpolated Keyframes",
"serialization_options": {
"interpolate_key_frames": true
}
}'
步骤:
- Create export snapshot:
- 向
/api/projects/{project_id}/exports发送POST请求,并在serialization_options中将interpolate_key_frames设置为true。
- 向
- Check export status:
- 使用
GET /api/projects/{project_id}/exports/{export_id}轮询导出状态,直到status变为completed。
- 使用
- Download the export:
- 导出完成后,使用以下命令下载导出文件:
GET /api/projects/{project_id}/exports/{export_id}/download?exportType=JSON - 示例cURL命令:
curl -X GET 'https://your-label-studio-domain.com/api/projects/{project_id}/exports/{export_id}/download?exportType=JSON' \ -H 'Authorization: Token YOUR_API_KEY' \ -o 'exported_annotations.json'
- 导出完成后,使用以下命令下载导出文件:
使用Label Studio SDK
如果您正在使用Label Studio SDK,可以创建一个启用插值的导出:
Python代码示例:
from label_studio_sdk import Client
import time
# Connect to Label Studio
ls = Client(url='http://localhost:8080', api_key='YOUR_API_KEY')
# Get your project by ID
project = ls.get_project(PROJECT_ID)
# Create an export snapshot with interpolation enabled
export_result = project.export_snapshot_create(
title='Export with Interpolated Keyframes',
serialization_options={
'interpolate_key_frames': True
}
)
# Get the export ID
export_id = export_result['id']
# Wait for the export to complete
while True:
export_status = project.get_export_status(export_id)
if export_status['status'] == 'completed':
break
elif export_status['status'] == 'failed':
raise Exception('Export failed')
else:
time.sleep(5) # Wait for 5 seconds before checking again
# Download the export
export_file_path = project.export_snapshot_download(
export_id, export_type='JSON', path='.'
)
print(f'Exported data saved to {export_file_path}')
注意事项:
- 将
YOUR_API_KEY替换为您实际的API密钥。 - 将
PROJECT_ID替换为您的项目ID。 - 确保您已安装最新版本的Label Studio SDK。
使用命令行界面(CLI)
您可以使用Label Studio CLI导出带有插值关键帧的标注。
命令:
label-studio export --host http://localhost:8080 --api-key YOUR_API_KEY PROJECT_ID JSON --interpolate-key-frames
注意事项:
--interpolate-key-frames标志在导出时启用插值功能。- 将
YOUR_API_KEY和PROJECT_ID分别替换为您的API密钥和项目ID。 - 导出的数据默认会保存在
data/export目录中。
使用带查询参数的导出端点
您可以直接通过导出端点并使用interpolate_key_frames作为查询参数来导出带有插值的任务。
端点:
GET /api/projects/{project_id}/export?interpolate_key_frames=true
示例cURL命令:
curl -X GET 'https://your-label-studio-domain.com/api/projects/{project_id}/export?interpolate_key_frames=true' \
-H 'Authorization: Token YOUR_API_KEY' \
-o 'exported_annotations.json'
Label Studio 界面增强功能
视频播放器功能包含以下用户界面增强:
- 双重的'区域'和'详情'控制面板与单一侧边栏相比,让标注者无需滚动即可查看任务的所有相关信息。
- 可折叠、可拖动和可调整大小的面板,供标注人员自定义工作区,特别适合以更大尺寸查看图像或视频。
- 为每个区域提供更精细的控制,包括能够精确设置边界框的宽度、高度和坐标,以实现像素级精准标注。
- 更简洁的界面用于分组、组织区域、链接、添加元数据和删除区域,并新增了锁定区域的功能。
使用场景
视频播放器提供以下使用场景:
- 增强图像,使标注人员能更精确地标注模糊图像。
- 添加关键帧并调整关键帧之间的边界框,轻松实现边界框形状和位置的过渡。
- 在视频时间戳之间进行选择和标注,优化时间轴分段功能。
- 使用可选的热键驱动导航,实现更精细的对象跟踪。
- 使用精细的控制动作在后续帧中标记和跟踪对象。
- 重新配置标注工作区以简化大型任务的标注,包括带有多个区域的大尺寸图像和较长视频。
视频对象检测具备基于视频构建的分析功能。例如,当您观看视频时,会看到视频上带有跟踪对象的边界框。
增强图像
在Label Studio用户界面中,视频界面提供了主视频画布和控制功能,使标注人员能够通过以下操作更精确地标注模糊图像:
放大、缩小、缩放到合适大小,或缩放到100%。
图1:缩放选项。
缩放追踪选项。
图2:视频对象追踪缩放选项。
跳转到上一个关键帧。
图3: 跳转到上一个关键帧按钮。
后退一步。
图4:后退一步按钮。
播放与暂停。
图5: 播放与暂停按钮。
向前一步。
图6: 向前一步按钮。
跳转到下一个关键帧。
图7: 跳转到下一个关键帧按钮。
切换时间轴。
图8:切换时间轴按钮。
添加关键帧
在视频播放器中,您可以查看帧数、总帧数和当前帧。您可以在帧与帧之间导航,或跳转到特定帧号。导航过程中会添加关键点,以便您可以跳转到前一个关键点或前一帧。
Figure 9: Working with frames.
您可以折叠或展开时间轴,也可以使用计时器选项来设置和调整视频的时间。
图10:使用时间帧进行导航。
您也可以调整矩形框来检测感兴趣的目标区域。
图11:调整矩形框进行目标检测。
要检测徽章上的物体,请选择标签并在其上绘制一个矩形。
图12:物体检测徽章。
使用时间戳
当您处理时间戳或时间线时,可以在边界框上添加关键帧并从特定帧号开始。一条细线(在滚动时会延伸到视频末尾)表示边界框的过渡或生命周期。您可以逐帧跟踪徽章。
Figure 13: Navigate to a particular frame number.
灰色矩形和橙色菱形表示选中的关键帧。
图14:关键帧时间轴。
使用快捷键导航
启用热键驱动导航以增强追踪对象的精细度。
Figure15: Enable hotkey-driven navigation.
细粒度控制操作
使用精细的控制动作在后续帧中标记和跟踪对象。
形状过渡
形状过渡发生在您调整边界框且时间线上出现新关键帧时。例如,您可以添加一个新关键帧并调整边界框以适配徽章。然后从一个帧(比如第30帧)导航回前一帧(第17帧)。此时,您将看到边界框形状在这些帧之间发生变化。这一操作有助于轻松实现边界框形状的过渡,使其适应被跟踪对象。您可以添加更多关键点或在每一帧添加关键点,以更精确地跟踪过渡过程。
Figure 16: Adjust the rectangle frame.
监控生命周期
当您处于特定帧编号时,如果标记消失,则无需再继续追踪它。
Figure 17: Badge disappears.
现在导航到该特定帧编号,然后按下切换插值按钮。这将在此处切断插值,徽章会消失。它仅显示之前添加的那些帧。
Figure 18: Activate toggle interpolation.
如图19所示,图17中消失的徽章现在在插值过程中重新出现。
图19:徽章在插值过程中出现。
过渡帧
如果您不想自动播放视频,而是希望查看帧之间的过渡效果,可以拖动帧指示器来观察过渡过程、帧的出现与消失等动态变化。您还可以通过拖动显示当前可见视口的概览窗口来设置视频的定位位置。
重新配置标注工作区
您可以重新配置标注工作区,以简化处理更大任务的标注工作,包括包含多个区域的大型图像和较长视频。这样您可以看到更多视频部分、更宽的时间轴空间,并能够查看多个关键帧和区域。
您可以通过切换关键点来添加关键点。例如,如果您不小心移动了边界框,导致其位置不正确,那么您必须移除关键点以将其重置到初始位置。您可以为目标检测添加多个边界框。
Figure 20: Add multiple key points.
图21展示了可用于目标检测与跟踪的边界框选项(Car、Airplane或Possum)。
图21:添加多个边界框。
迷你地图会为每个添加的标签区域显示独立线条。在图22中,迷你地图为每个添加的Car、Airplane或Possum标签区域显示独立线条。
图22:多区域迷你地图
更多示例
以下展示了视频目标跟踪功能的更多示例。
图23:视频目标跟踪示例1。
带时间戳的视频对象跟踪功能示例。
图24:带时间戳的视频对象跟踪示例2。
在视频播放器中移动轮廓窗口。
图25:视频播放器中移动轮廓窗口的示例3。