Ball Tracking 同属一个任务的两个源,一起审、一起传:乒乓(OTTG)与网球(TrackNet)都是——
「INPUT = 一段比赛视频 → TARGET = 同一段视频,每帧用红圈把球标出来」。两源产出统一四件套、同一条编号,落进
同一个 final_v1/New_Tasks/Task_14_ball_tracking/,来源写在各自 metadata 里区分。
| 项 | 乒乓 OTTG | 网球 TrackNet | 说明 |
|---|---|---|---|
| 源格式 | mp4 1920×1080@120fps | jpg 图序列 1280×720 | 格式不同,渲染器各一入口 |
| 1 sample = | 1 回合 | 1 clip(1 段来回) | 连续片段,≤128 帧 |
| fps / 长度 | 30fps · ~4s | 25fps · ~5s | 正常长度 |
| 画幅 / 编码 | 640×360 · H.264 · yuv420p | 浏览器可放,符合指南 | |
| 球标记 | 红色空心圈 r=14px,套在球坐标上;遮挡/未标注帧不画 | 坐标真值来自各自标注 | |
| 球标注密度 | ~56%(稀疏) | ~89%(密) | 网球标注更全,圈几乎不闪 |
固定单机位、球坐标来自 ball_markup.json。球被球拍/球员挡住的帧没标注 → 不画圈(圈会"闪",约一半帧有)。
{
"schema_version": "v2v-metadata/2.0",
"task_id": "Task_14_ball_tracking",
"sample_id": "000000000",
"pipeline_id": "Task_14_ball_tracking",
"created_at": null,
"generation_mode": "video_to_video",
"transformation": {
"kind": "ball_localization_overlay",
"overlay": "target = input video with the ball circled each frame (no time shift; frame-aligned)",
"marker": {
"shape": "circle",
"color_rgb": [
237,
28,
36
],
"radius_px": 14,
"stroke_px": 3,
"drawn_when": "ball annotated/visible",
"absent_when": "occluded or unlabeled -> no circle"
},
"rally": {
"native_frame_start": 1413,
"native_frame_end": 2460,
"frames_marked": 72,
"frames_total": 128,
"note": "one rally = ball-annotation frames grouped with gap < 150 native frames"
},
"ball_track": {
"note": "per output-frame ball pixel (x,y) ground truth from OTTG ball_markup.json; null = no circle drawn (occluded/unlabeled)",
"coord_space": "pixels in source 1920x1080 (marker rescaled to 640-wide output)",
"per_frame": [
[
1223,
633
],
[
1132,
646
],
[
1061,
613
],
[
998,
585
],
[
939,
562
],
null,
null,
null,
null,
null,
null,
null,
[
590,
562
],
[
557,
546
],
[
527,
527
],
[
499,
514
],
null,
null,
null,
null,
null,
null,
[
1055,
607
],
[
1157,
637
],
[
1274,
627
],
[
1395,
623
],
null,
null,
null,
null,
null,
[
956,
528
],
[
872,
529
],
[
799,
535
],
[
732,
546
],
[
673,
559
],
[
618,
550
],
[
566,
526
],
[
519,
507
],
null,
null,
null,
[
835,
509
],
[
941,
529
],
[
1050,
558
],
[
1159,
597
],
[
1268,
642
],
[
1401,
631
],
[
1535,
622
],
[
1463,
592
],
null,
null,
null,
null,
[
947,
521
],
[
871,
527
],
[
802,
536
],
[
740,
550
],
[
684,
560
],
[
634,
531
],
[
589,
510
],
null,
null,
null,
null,
[
821,
509
],
[
920,
535
],
[
1019,
570
],
[
1119,
612
],
[
1232,
632
],
[
1365,
618
],
[
1499,
611
],
null,
null,
null,
null,
null,
[
956,
506
],
[
876,
510
],
[
804,
520
],
[
740,
534
],
[
683,
550
],
[
630,
554
],
[
583,
525
],
[
540,
503
],
null,
null,
null,
[
781,
500
],
[
889,
524
],
[
998,
557
],
[
1113,
602
],
[
1230,
654
],
[
1375,
645
],
[
1526,
640
],
[
1560,
623
],
null,
null,
null,
null,
null,
null,
null,
[
716,
555
],
[
654,
573
],
[
599,
548
],
[
550,
522
],
[
506,
501
],
null,
null,
null,
null,
[
772,
499
],
[
868,
521
],
[
968,
550
],
[
1067,
588
],
[
1167,
632
],
[
1283,
623
],
[
1408,
606
],
[
1534,
597
],
null,
null,
null,
null,
null,
null,
null,
null
]
}
},
"video": {
"num_frames_input": 128,
"num_frames_target": 128,
"fps": 30,
"resolution": [
640,
360
],
"duration_s": 4.267,
"source_media": "video",
"frame_source": "video"
},
"prompt": {
"v2v_instruction": "This is a fixed-camera video of a table-tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or otherwise not visible, draw no circle. Keep everything else in the frame identical to the input — same camera, scene, players and timing — and add only the ball marker."
},
"label_space": [
{
"phrase": "ball",
"marker": "red circle"
}
],
"domain": {
"field": "video_understanding",
"kind": "fixed_camera_real_video",
"attributes": {
"subtype": [
"ball_tracking",
"object_localization",
"table_tennis"
],
"sport": "table_tennis"
},
"source": {
"dataset": "OpenTTGames",
"clip": "test_1.mp4"
}
},
"source_dataset": {
"dataset": "OpenTTGames (OSAI TTNet)",
"license": "CC BY-NC-SA 4.0",
"origin": "Voeikov et al., 'TTNet: Real-time temporal and spatial video analysis of table tennis', CVPRW 2020",
"url": "https://lab.osai.ai/"
},
"integrity": {
"input_sha256": "81bfb1528a2569d5cf97f48b534614d981e6fc2de69c4f45c1f3f980a92e9eb8",
"target_sha256": "796fe39ec46ab341fb7872ea583ee62f1f1704ad7ec5e366477ba88dd7c66453"
},
"provenance": {
"engine": "v2v_taxonomy",
"engine_version": "1.0.0",
"pipeline_version": "v0.1.0-sample"
}
}This is a fixed-camera video of a table-tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or otherwise not visible, draw no circle. Keep everything else in the frame identical to the input — same camera, scene, players and timing — and add only the ball marker.
{
"schema_version": "v2v-metadata/2.0",
"task_id": "Task_14_ball_tracking",
"sample_id": "000000001",
"pipeline_id": "Task_14_ball_tracking",
"created_at": null,
"generation_mode": "video_to_video",
"transformation": {
"kind": "ball_localization_overlay",
"overlay": "target = input video with the ball circled each frame (no time shift; frame-aligned)",
"marker": {
"shape": "circle",
"color_rgb": [
237,
28,
36
],
"radius_px": 14,
"stroke_px": 3,
"drawn_when": "ball annotated/visible",
"absent_when": "occluded or unlabeled -> no circle"
},
"rally": {
"native_frame_start": 186,
"native_frame_end": 693,
"frames_marked": 72,
"frames_total": 127,
"note": "one rally = ball-annotation frames grouped with gap < 150 native frames"
},
"ball_track": {
"note": "per output-frame ball pixel (x,y) ground truth from OTTG ball_markup.json; null = no circle drawn (occluded/unlabeled)",
"coord_space": "pixels in source 1920x1080 (marker rescaled to 640-wide output)",
"per_frame": [
[
636,
550
],
[
608,
561
],
[
578,
539
],
[
551,
522
],
[
526,
508
],
null,
null,
null,
[
829,
543
],
[
937,
577
],
[
1046,
617
],
[
1163,
643
],
[
1294,
635
],
[
1431,
633
],
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
[
801,
518
],
[
905,
542
],
[
1007,
574
],
[
1111,
615
],
[
1227,
635
],
[
1359,
626
],
[
1492,
625
],
null,
null,
null,
null,
null,
[
909,
517
],
[
827,
522
],
[
755,
530
],
[
689,
544
],
[
628,
561
],
[
574,
540
],
[
524,
516
],
[
476,
498
],
null,
null,
null,
[
845,
518
],
[
955,
545
],
[
1066,
583
],
[
1180,
628
],
[
1305,
646
],
[
1447,
633
],
[
1540,
619
],
null,
null,
null,
null,
[
916,
514
],
[
829,
517
],
[
752,
525
],
[
683,
537
],
[
623,
553
],
[
568,
541
],
[
520,
514
],
[
473,
492
],
null,
null,
null,
null,
[
836,
479
],
[
919,
497
],
[
1003,
521
],
[
1088,
554
],
null,
[
1259,
639
],
[
1356,
650
],
[
1467,
632
],
[
1567,
619
],
null,
null,
null,
null,
[
959,
532
],
[
873,
538
],
[
797,
549
],
[
729,
563
],
[
670,
565
],
[
620,
535
],
[
571,
511
],
null,
null,
null,
null,
null,
null,
null,
null,
[
1168,
628
],
[
1290,
668
],
[
1439,
651
],
[
1585,
642
],
null,
null,
null,
null,
[
949,
518
],
[
861,
520
],
[
785,
527
],
[
717,
539
],
[
658,
554
],
[
606,
560
],
[
560,
530
],
[
518,
505
],
null,
null,
null,
null,
[
794,
504
],
[
891,
531
],
[
996,
571
],
[
1103,
620
]
]
}
},
"video": {
"num_frames_input": 127,
"num_frames_target": 127,
"fps": 30,
"resolution": [
640,
360
],
"duration_s": 4.233,
"source_media": "video",
"frame_source": "video"
},
"prompt": {
"v2v_instruction": "This is a fixed-camera video of a table-tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or otherwise not visible, draw no circle. Keep everything else in the frame identical to the input — same camera, scene, players and timing — and add only the ball marker."
},
"label_space": [
{
"phrase": "ball",
"marker": "red circle"
}
],
"domain": {
"field": "video_understanding",
"kind": "fixed_camera_real_video",
"attributes": {
"subtype": [
"ball_tracking",
"object_localization",
"table_tennis"
],
"sport": "table_tennis"
},
"source": {
"dataset": "OpenTTGames",
"clip": "test_1.mp4"
}
},
"source_dataset": {
"dataset": "OpenTTGames (OSAI TTNet)",
"license": "CC BY-NC-SA 4.0",
"origin": "Voeikov et al., 'TTNet: Real-time temporal and spatial video analysis of table tennis', CVPRW 2020",
"url": "https://lab.osai.ai/"
},
"integrity": {
"input_sha256": "76257ccce922005b31663cbe0d7c27b36a6a95ea8efda3dfc89a7cce525976cb",
"target_sha256": "65ba189a5effe70692d7fdc9afc83b23c96d462fc1947856a28accc2f72e90a6"
},
"provenance": {
"engine": "v2v_taxonomy",
"engine_version": "1.0.0",
"pipeline_version": "v0.1.0-sample"
}
}This is a fixed-camera video of a table-tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or otherwise not visible, draw no circle. Keep everything else in the frame identical to the input — same camera, scene, players and timing — and add only the ball marker.
广播多机位、球坐标来自 Label.csv(file,visibility,x,y)。一个 clip = 一段连续来回;标注密(~89%),圈几乎全程跟着球。红圈精度已抽帧放大核对(准确套在网球上)。
{
"schema_version": "v2v-metadata/2.0",
"task_id": "Task_14_ball_tracking",
"sample_id": "000000000",
"pipeline_id": "Task_14_ball_tracking",
"created_at": null,
"generation_mode": "video_to_video",
"transformation": {
"kind": "ball_localization_overlay",
"overlay": "target = input video with the ball circled each frame (frame-aligned)",
"marker": {
"shape": "circle",
"color_rgb": [
237,
28,
36
],
"radius_px": 14,
"stroke_px": 3,
"drawn_when": "ball visible (Label.csv visibility=1)",
"absent_when": "occluded/not visible -> no circle"
},
"clip": {
"name": "game1/Clip1",
"frames_marked": 114,
"frames_total": 128,
"note": "one TrackNet clip = one continuous broadcast rally shot"
},
"ball_track": {
"note": "per output-frame ball pixel (x,y) from TrackNet Label.csv; null = not visible",
"coord_space": "pixels in source 1280x720 (marker rescaled to 640-wide output)",
"per_frame": [
[
599,
423
],
[
601,
406
],
[
601,
388
],
[
598,
371
],
[
598,
353
],
[
597,
337
],
[
596,
323
],
[
595,
310
],
[
594,
299
],
[
594,
288
],
[
593,
278
],
[
592,
271
],
[
591,
265
],
[
590,
259
],
[
590,
257
],
[
589,
253
],
[
587,
252
],
[
586,
252
],
[
585,
252
],
[
585,
255
],
[
584,
258
],
[
583,
263
],
[
583,
269
],
[
581,
276
],
[
581,
286
],
[
580,
294
],
[
616,
282
],
[
655,
265
],
[
683,
255
],
[
709,
246
],
[
743,
238
],
[
760,
234
],
[
770,
233
],
[
779,
233
],
[
789,
210
],
[
795,
191
],
[
801,
173
],
[
806,
156
],
[
813,
143
],
[
817,
132
],
[
819,
124
],
[
822,
117
],
[
814,
116
],
[
806,
116
],
[
798,
117
],
[
790,
116
],
[
781,
117
],
[
771,
119
],
[
761,
121
],
[
750,
124
],
[
741,
128
],
[
732,
131
],
[
720,
137
],
null,
null,
[
687,
154
],
[
676,
161
],
null,
[
655,
178
],
[
643,
188
],
[
630,
200
],
[
618,
210
],
[
606,
224
],
[
592,
236
],
[
579,
252
],
[
563,
268
],
null,
[
535,
303
],
[
518,
322
],
[
505,
340
],
[
489,
363
],
[
471,
386
],
[
457,
409
],
[
442,
434
],
null,
null,
null,
null,
[
375,
439
],
[
365,
441
],
null,
[
337,
449
],
[
327,
452
],
null,
[
418,
362
],
[
453,
330
],
[
486,
300
],
[
514,
277
],
[
540,
255
],
null,
[
586,
224
],
[
606,
211
],
[
626,
200
],
[
643,
193
],
[
657,
186
],
[
673,
181
],
[
686,
176
],
[
699,
173
],
[
710,
172
],
[
722,
172
],
[
733,
172
],
[
743,
174
],
[
750,
176
],
[
758,
179
],
[
767,
184
],
[
773,
188
],
[
781,
186
],
[
787,
172
],
[
791,
164
],
[
798,
153
],
[
802,
144
],
[
806,
137
],
[
811,
130
],
[
816,
126
],
[
821,
119
],
[
824,
115
],
[
825,
120
],
[
823,
128
],
[
821,
136
],
[
819,
158
],
null,
null,
[
816,
202
],
[
815,
221
],
null,
[
815,
261
],
[
813,
287
],
[
813,
312
]
]
}
},
"video": {
"num_frames_input": 128,
"num_frames_target": 128,
"fps": 25,
"resolution": [
640,
360
],
"duration_s": 5.12,
"source_media": "image_sequence",
"frame_source": "video_frames"
},
"prompt": {
"v2v_instruction": "This is a broadcast video of a tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or not visible, draw no circle. Keep everything else in the frame identical to the input, and add only the ball marker."
},
"label_space": [
{
"phrase": "ball",
"marker": "red circle"
}
],
"domain": {
"field": "video_understanding",
"kind": "broadcast_video",
"attributes": {
"subtype": [
"ball_tracking",
"object_localization",
"tennis"
],
"sport": "tennis"
},
"source": {
"dataset": "TrackNet",
"clip": "game1/Clip1"
}
},
"source_dataset": {
"dataset": "TrackNet (tennis)",
"license": "unspecified (flag Hokin)",
"origin": "Huang et al., 'TrackNet: A Deep Learning Network for Tracking High-speed and Tiny Objects in Sports', 2019",
"url": "https://nol.cs.nctu.edu.tw:234/open-source/TrackNet"
},
"integrity": {
"input_sha256": "08dcd585e2b406d4a342d8702a9d85de127ca1168a37ec44edf9dc5524a8d8cf",
"target_sha256": "fb18d375847e59451b2e229a312f7b0f80c6ef7fa84eecce88769cfde28a6c80"
},
"provenance": {
"engine": "v2v_taxonomy",
"engine_version": "1.0.0",
"pipeline_version": "v0.1.0-sample"
}
}This is a broadcast video of a tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or not visible, draw no circle. Keep everything else in the frame identical to the input, and add only the ball marker.
{
"schema_version": "v2v-metadata/2.0",
"task_id": "Task_14_ball_tracking",
"sample_id": "000000001",
"pipeline_id": "Task_14_ball_tracking",
"created_at": null,
"generation_mode": "video_to_video",
"transformation": {
"kind": "ball_localization_overlay",
"overlay": "target = input video with the ball circled each frame (frame-aligned)",
"marker": {
"shape": "circle",
"color_rgb": [
237,
28,
36
],
"radius_px": 14,
"stroke_px": 3,
"drawn_when": "ball visible (Label.csv visibility=1)",
"absent_when": "occluded/not visible -> no circle"
},
"clip": {
"name": "game1/Clip2",
"frames_marked": 107,
"frames_total": 128,
"note": "one TrackNet clip = one continuous broadcast rally shot"
},
"ball_track": {
"note": "per output-frame ball pixel (x,y) from TrackNet Label.csv; null = not visible",
"coord_space": "pixels in source 1280x720 (marker rescaled to 640-wide output)",
"per_frame": [
[
721,
460
],
[
721,
456
],
[
724,
447
],
[
725,
438
],
[
727,
423
],
[
726,
406
],
[
725,
387
],
[
725,
370
],
[
723,
353
],
[
723,
337
],
[
723,
324
],
[
722,
311
],
[
721,
300
],
[
721,
291
],
[
719,
282
],
[
719,
275
],
[
717,
268
],
[
717,
263
],
[
715,
259
],
[
714,
257
],
[
713,
255
],
[
713,
255
],
[
711,
257
],
[
710,
259
],
[
709,
263
],
[
708,
267
],
[
708,
274
],
[
707,
282
],
[
706,
290
],
null,
[
688,
274
],
[
678,
258
],
null,
[
663,
238
],
[
655,
232
],
[
650,
228
],
null,
[
639,
224
],
null,
[
629,
205
],
[
626,
184
],
null,
null,
null,
[
610,
128
],
[
612,
123
],
[
618,
116
],
[
622,
114
],
null,
null,
null,
null,
null,
[
659,
97
],
[
665,
96
],
[
672,
98
],
[
677,
98
],
[
684,
101
],
[
689,
103
],
null,
null,
[
711,
116
],
[
715,
124
],
[
724,
130
],
[
730,
138
],
[
740,
150
],
[
745,
158
],
[
752,
168
],
[
759,
178
],
[
766,
194
],
[
775,
207
],
[
781,
222
],
[
788,
238
],
[
798,
257
],
[
805,
276
],
[
812,
296
],
[
821,
317
],
[
828,
341
],
[
837,
364
],
[
843,
391
],
[
848,
393
],
[
853,
381
],
[
858,
374
],
[
861,
368
],
[
868,
362
],
[
872,
357
],
[
882,
350
],
null,
null,
null,
[
899,
350
],
[
905,
354
],
[
909,
356
],
[
888,
322
],
[
874,
301
],
null,
null,
[
839,
253
],
null,
[
825,
235
],
[
817,
229
],
[
813,
228
],
[
806,
224
],
[
803,
224
],
[
799,
224
],
[
794,
207
],
[
793,
191
],
[
790,
178
],
null,
[
784,
158
],
[
782,
150
],
[
781,
142
],
[
780,
138
],
[
778,
133
],
[
776,
129
],
[
775,
129
],
[
773,
126
],
[
771,
126
],
[
768,
127
],
[
769,
127
],
[
766,
128
],
[
765,
132
],
[
764,
136
],
[
761,
126
],
[
758,
119
],
[
758,
112
],
[
758,
104
],
[
757,
101
]
]
}
},
"video": {
"num_frames_input": 128,
"num_frames_target": 128,
"fps": 25,
"resolution": [
640,
360
],
"duration_s": 5.12,
"source_media": "image_sequence",
"frame_source": "video_frames"
},
"prompt": {
"v2v_instruction": "This is a broadcast video of a tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or not visible, draw no circle. Keep everything else in the frame identical to the input, and add only the ball marker."
},
"label_space": [
{
"phrase": "ball",
"marker": "red circle"
}
],
"domain": {
"field": "video_understanding",
"kind": "broadcast_video",
"attributes": {
"subtype": [
"ball_tracking",
"object_localization",
"tennis"
],
"sport": "tennis"
},
"source": {
"dataset": "TrackNet",
"clip": "game1/Clip2"
}
},
"source_dataset": {
"dataset": "TrackNet (tennis)",
"license": "unspecified (flag Hokin)",
"origin": "Huang et al., 'TrackNet: A Deep Learning Network for Tracking High-speed and Tiny Objects in Sports', 2019",
"url": "https://nol.cs.nctu.edu.tw:234/open-source/TrackNet"
},
"integrity": {
"input_sha256": "fc076be445ed797f0943ff5a8b63cad90ec8f7e620579c1e5a2731e39e1f1584",
"target_sha256": "07c76975648a2306124f7a3e64aeac1864f076a70e58d927169e9c3cd9993768"
},
"provenance": {
"engine": "v2v_taxonomy",
"engine_version": "1.0.0",
"pipeline_version": "v0.1.0-sample"
}
}This is a broadcast video of a tennis rally. Track the ball: produce a copy of the video in which the ball is marked in every frame with a red circle drawn at its current position. When the ball is occluded, off-screen, or not visible, draw no circle. Keep everything else in the frame identical to the input, and add only the ball marker.
每个样品各有自己的一份 metadata.json 和 prompt.txt(见上方每个样品下的两个下拉框,框内可滚动)。批量后就是每个样品一套四件套、几百上千份。
ball_track、帧范围、sha256、来源 clip)。顶层结构照 Task_12 的 v2v-metadata/2.0,任务特有信息放独立块 transformation.ball_track。winnie-task14-final(us-east-2,无 GPU)→ 写
final_v1/New_Tasks/Task_14_ball_tracking/(乒乓+网球同一编号)→ 代码推 GitHub winnie_task14_pipeline → terminate。