使用 Snaps
创建 Snaps
要从你的应用程序发送或创建 Snaps,必须使用 DepthAI。请参阅 DepthAI 中的 Snaps 文档,了解如何从应用程序中发出 Snaps。本指南重点介绍如何通过 GraphQL API 查询、筛选和管理现有的 Snaps。
前提条件
要与 Luxonis Hub API 交互,你需要一个 API Key。API Key 提供对团队资源的完全访问权限。请参考 API Keys 文档,在 Luxonis Hub Web UI 中创建一个 Key。一旦获得 API Key,将其包含在
Authorization 头中:Command Line
1Authorization: Bearer <your_api_key>使用 查询解析:要获取下一页,请使用上一响应中的 变量:通过多种条件筛选 Snaps 以查找特定数据:按时间范围筛选:变量:按设备筛选:按应用标识符筛选:按名称筛选:按标签筛选:按额外字段(自定义元数据)筛选:按文件分类筛选:可用的文件分类:
snaps 查询来检索团队中所有 Snaps 的列表。此查询支持基于游标的分页,以便高效浏览大型数据集。基本列表查询
Graphql
1query {
2 team {
3 snaps(first: 10) {
4 nodes {
5 id
6 name
7 createdAt
8 tags
9 extras
10 files {
11 id
12 name
13 classification
14 }
15 sourceDeviceId
16 sourceAppIdentifier
17 }
18 pageInfo {
19 hasNextPage
20 endCursor
21 }
22 }
23 }
24}first: 10- 限制结果为 10 个 Snapsnodes- Snap 对象数组pageInfo- 分页元数据(下一页的游标)
id:唯一 Snap 标识符name:Snap 名称(例如"car_detected"、"data_collection")createdAt:Snap 创建时间戳tags:用于分组的标签数组(例如"night"、"dataset_v2")extras:包含自定义键值对的 JSON 对象,用于可搜索的元数据files:附加文件数组(图像、视频、点云等)sourceDeviceId:创建该 Snap 的设备 IDsourceAppIdentifier:创建该 Snap 的应用程序
分页
endCursor:Graphql
1query($after: String) {
2 team {
3 snaps(first: 10, after: $after) {
4 nodes {
5 id
6 name
7 createdAt
8 }
9 pageInfo {
10 hasNextPage
11 endCursor
12 }
13 }
14 }
15}JSON
1{
2 "after": "cursor_from_previous_response"
3}筛选 Snaps
Graphql
1query($from: DateTime!, $to: DateTime!) {
2 team {
3 snaps(
4 first: 10,
5 filter: {
6 createdFrom: $from,
7 createdTo: $to
8 }
9 ) {
10 nodes {
11 id
12 name
13 createdAt
14 }
15 }
16 }
17}JSON
1{
2 "from": "2024-01-01T00:00:00Z",
3 "to": "2024-02-01T00:00:00Z"
4}Graphql
1query {
2 team {
3 snaps(
4 first: 10,
5 filter: { deviceId: "device-id" }
6 ) {
7 nodes {
8 id
9 name
10 sourceDeviceId
11 }
12 }
13 }
14}Graphql
1query {
2 team {
3 snaps(
4 first: 10,
5 filter: { deviceAppIdentifier: "my-app" }
6 ) {
7 nodes {
8 id
9 name
10 sourceAppIdentifier
11 }
12 }
13 }
14}Graphql
1query {
2 team {
3 snaps(
4 first: 10,
5 filter: { name: "car_detected" }
6 ) {
7 nodes {
8 id
9 name
10 }
11 }
12 }
13}Graphql
1query {
2 team {
3 snaps(
4 first: 10,
5 filter: { tags: ["night", "validation"] }
6 ) {
7 nodes {
8 id
9 name
10 tags
11 }
12 }
13 }
14}Graphql
1query {
2 team {
3 snaps(
4 first: 10,
5 filter: { extras: { scene: "warehouse", lighting: "low" } }
6 ) {
7 nodes {
8 id
9 name
10 extras
11 }
12 }
13 }
14}Graphql
1query {
2 team {
3 snaps(
4 first: 10,
5 filter: { withFilesClassifiedAs: [IMAGE_COLOR, VIDEO] }
6 ) {
7 nodes {
8 id
9 name
10 files {
11 classification
12 }
13 }
14 }
15 }
16}IMAGE_COLOR:彩色图像IMAGE_STEREO_LEFT:左立体图像IMAGE_STEREO_RIGHT:右立体图像VIDEO:视频文件POINTCLOUD:点云数据ANNOTATION:注释文件DISPARITY:视差图UNKNOWN_FILE:其他文件类型
Graphql
1query {
2 team {
3 snaps(
4 first: 10,
5 filter: {
6 deviceId: "device-id",
7 tags: ["validation"],
8 createdFrom: "2024-01-01T00:00:00Z"
9 }
10 ) {
11 nodes {
12 id
13 name
14 tags
15 createdAt
16 }
17 }
18 }
19}通过 ID 检索特定 Snap 的详细信息,包括文件下载 URL。变量:响应示例:关键字段说明:
Graphql
1query($snapId: ID!) {
2 team {
3 snap(snapId: $snapId) {
4 id
5 name
6 createdAt
7 tags
8 extras
9 files {
10 id
11 name
12 hash
13 mimeType
14 size
15 presignedUrl
16 classification
17 }
18 sourceDeviceId
19 sourceSerialNumber
20 sourceAppIdentifier
21 }
22 }
23}JSON
1{
2 "snapId": "snap-id-from-list"
3}JSON
1{
2 "data": {
3 "team": {
4 "snap": {
5 "id": "snap-abc123",
6 "name": "car_detected",
7 "createdAt": "2024-01-15T10:30:00Z",
8 "tags": ["validation", "warehouse"],
9 "extras": { "scene": "warehouse", "lighting": "low" },
10 "files": [
11 {
12 "id": "file-xyz789",
13 "name": "image.jpg",
14 "hash": "abc123...",
15 "mimeType": "image/jpeg",
16 "size": 524288,
17 "presignedUrl": "https://storage.example.com/snap-abc123/image.jpg?signature=...",
18 "classification": "IMAGE_COLOR"
19 }
20 ],
21 "sourceDeviceId": "device-123",
22 "sourceSerialNumber": "OAK123456",
23 "sourceAppIdentifier": "detection-app"
24 }
25 }
26 }
27}presignedUrl:直接、有时限的文件下载 URL。使用此 URL 无需身份验证即可下载文件。hash:用于完整性校验的文件校验和mimeType:文件的 MIME 类型(例如"image/jpeg"、"video/mp4")size:文件大小(字节)sourceSerialNumber:创建该 Snap 的设备序列号sourceAppIdentifier:发出该 Snap 的应用程序标识符
通过 ID 或应用筛选条件来删除 Snaps。删除操作作为后台任务异步执行。通过 ID 删除特定 Snaps:变量:响应:删除符合特定条件的快照:可用的删除过滤器:使用 变量:响应(进行中):响应(已完成):删除响应中的
异步删除
Snap 删除不是即时的。API 返回一个
bgTaskId,可用于跟踪删除进度。方法 1:按 ID 删除
Graphql
1mutation DeleteSnapsByIds($ids: [ID!]!) {
2 team {
3 deleteSnapsByIds(ids: $ids) {
4 status
5 bgTaskId
6 }
7 }
8}JSON
1{
2 "ids": ["snap-id-1", "snap-id-2", "snap-id-3"]
3}JSON
1{
2 "data": {
3 "team": {
4 "deleteSnapsByIds": {
5 "status": "SUCCESS",
6 "bgTaskId": "bg-task-abc123"
7 }
8 }
9 }
10}方法2:按过滤器删除
Graphql
1mutation DeleteSnapsByFilter {
2 team {
3 deleteSnapsByFilter(
4 filter: {
5 deviceId: "device-id",
6 createdFrom: "2024-01-01T00:00:00Z",
7 createdTo: "2024-02-01T00:00:00Z",
8 tags: ["test"]
9 }
10 ) {
11 status
12 bgTaskId
13 }
14 }
15}deviceId:删除指定设备的快照deviceAppId:删除指定应用实例的快照deviceAppIdentifier:删除具有此标识符的应用的快照createdFrom:删除此时间戳之后创建的快照createdTo:删除此时间戳之前创建的快照name:删除此名称的快照tags:删除包含这些标签的快照extras:删除包含这些自定义元数据的快照withFilesClassifiedAs:删除包含此分类文件的快照
检查删除状态
bgTaskId 跟踪删除进度:Graphql
1query($bgTaskId: ID!) {
2 team {
3 bgTask(bgTaskId: $bgTaskId) {
4 id
5 state {
6 deletedCount
7 totalCount
8 }
9 createdAt
10 completedAt
11 failedAt
12 }
13 }
14}JSON
1{
2 "bgTaskId": "bg-task-id-from-deletion"
3}JSON
1{
2 "data": {
3 "team": {
4 "bgTask": {
5 "id": "bg-task-abc123",
6 "state": {
7 "deletedCount": 150,
8 "totalCount": 500
9 },
10 "createdAt": "2024-01-15T11:00:00Z",
11 "completedAt": null,
12 "failedAt": null
13 }
14 }
15 }
16}JSON
1{
2 "data": {
3 "team": {
4 "bgTask": {
5 "id": "bg-task-abc123",
6 "state": {
7 "deletedCount": 500,
8 "totalCount": 500
9 },
10 "createdAt": "2024-01-15T11:00:00Z",
11 "completedAt": "2024-01-15T11:05:30Z",
12 "failedAt": null
13 }
14 }
15 }
16}状态值
status 字段可能为:SUCCESS:删除任务创建成功IDS_NOT_FROM_TEAM:一个或多个快照 ID 不属于您的团队BG_TASK_LIMIT_REACHED:正在运行的后台任务过多,请稍后重试
总结
- 分页列出快照并进行过滤
- 获取单个快照的详细信息
- 使用预签名 URL 下载快照文件
- 按 ID 或使用过滤器删除快照
- 通过后台任务跟踪删除进度
要点总结
- 使用 标签和附加信息 实现快照的有效组织和搜索
- 善用 过滤器 查询数据的特定子集
- 删除是异步操作 - 务必通过
bgTaskId检查进度 - 预签名 URL 有时间限制 - 请及时下载文件