|
a |
|
b/data/Argoverse.yaml |
|
|
1 |
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license |
|
|
2 |
# Argoverse-HD dataset (ring-front-center camera) http://www.cs.cmu.edu/~mengtial/proj/streaming/ by Argo AI |
|
|
3 |
# Example usage: python train.py --data Argoverse.yaml |
|
|
4 |
# parent |
|
|
5 |
# ├── yolov5 |
|
|
6 |
# └── datasets |
|
|
7 |
# └── Argoverse ← downloads here (31.3 GB) |
|
|
8 |
|
|
|
9 |
|
|
|
10 |
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] |
|
|
11 |
path: ../datasets/Argoverse # dataset root dir |
|
|
12 |
train: Argoverse-1.1/images/train/ # train images (relative to 'path') 39384 images |
|
|
13 |
val: Argoverse-1.1/images/val/ # val images (relative to 'path') 15062 images |
|
|
14 |
test: Argoverse-1.1/images/test/ # test images (optional) https://eval.ai/web/challenges/challenge-page/800/overview |
|
|
15 |
|
|
|
16 |
# Classes |
|
|
17 |
names: |
|
|
18 |
0: person |
|
|
19 |
1: bicycle |
|
|
20 |
2: car |
|
|
21 |
3: motorcycle |
|
|
22 |
4: bus |
|
|
23 |
5: truck |
|
|
24 |
6: traffic_light |
|
|
25 |
7: stop_sign |
|
|
26 |
|
|
|
27 |
|
|
|
28 |
# Download script/URL (optional) --------------------------------------------------------------------------------------- |
|
|
29 |
download: | |
|
|
30 |
import json |
|
|
31 |
|
|
|
32 |
from tqdm import tqdm |
|
|
33 |
from utils.general import download, Path |
|
|
34 |
|
|
|
35 |
|
|
|
36 |
def argoverse2yolo(set): |
|
|
37 |
labels = {} |
|
|
38 |
a = json.load(open(set, "rb")) |
|
|
39 |
for annot in tqdm(a['annotations'], desc=f"Converting {set} to YOLOv5 format..."): |
|
|
40 |
img_id = annot['image_id'] |
|
|
41 |
img_name = a['images'][img_id]['name'] |
|
|
42 |
img_label_name = f'{img_name[:-3]}txt' |
|
|
43 |
|
|
|
44 |
cls = annot['category_id'] # instance class id |
|
|
45 |
x_center, y_center, width, height = annot['bbox'] |
|
|
46 |
x_center = (x_center + width / 2) / 1920.0 # offset and scale |
|
|
47 |
y_center = (y_center + height / 2) / 1200.0 # offset and scale |
|
|
48 |
width /= 1920.0 # scale |
|
|
49 |
height /= 1200.0 # scale |
|
|
50 |
|
|
|
51 |
img_dir = set.parents[2] / 'Argoverse-1.1' / 'labels' / a['seq_dirs'][a['images'][annot['image_id']]['sid']] |
|
|
52 |
if not img_dir.exists(): |
|
|
53 |
img_dir.mkdir(parents=True, exist_ok=True) |
|
|
54 |
|
|
|
55 |
k = str(img_dir / img_label_name) |
|
|
56 |
if k not in labels: |
|
|
57 |
labels[k] = [] |
|
|
58 |
labels[k].append(f"{cls} {x_center} {y_center} {width} {height}\n") |
|
|
59 |
|
|
|
60 |
for k in labels: |
|
|
61 |
with open(k, "w") as f: |
|
|
62 |
f.writelines(labels[k]) |
|
|
63 |
|
|
|
64 |
|
|
|
65 |
# Download |
|
|
66 |
dir = Path(yaml['path']) # dataset root dir |
|
|
67 |
urls = ['https://argoverse-hd.s3.us-east-2.amazonaws.com/Argoverse-HD-Full.zip'] |
|
|
68 |
download(urls, dir=dir, delete=False) |
|
|
69 |
|
|
|
70 |
# Convert |
|
|
71 |
annotations_dir = 'Argoverse-HD/annotations/' |
|
|
72 |
(dir / 'Argoverse-1.1' / 'tracking').rename(dir / 'Argoverse-1.1' / 'images') # rename 'tracking' to 'images' |
|
|
73 |
for d in "train.json", "val.json": |
|
|
74 |
argoverse2yolo(dir / annotations_dir / d) # convert VisDrone annotations to YOLO labels |