-
-
Notifications
You must be signed in to change notification settings - Fork 16.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add optional dataset.yaml
path
attribute (#3753)
* Add optional dataset.yaml `path` attribute @kalenmike * pass locals to python scripts * handle lists * update coco128.yaml * Capitalize first letter * add test key * finalize GlobalWheat2020.yaml * finalize objects365.yaml * finalize SKU-110K.yaml * finalize SKU-110K.yaml * finalize VisDrone.yaml * NoneType fix * update download comment * voc to VOC * update * update VOC.yaml * update VOC.yaml * remove dashes * delete get_voc.sh * force coco and coco128 to ../datasets * Capitalize Argoverse_HD.yaml * Capitalize Objects365.yaml * update Argoverse_HD.yaml * coco segments fix * VOC single-thread * update Argoverse_HD.yaml * update data_dict in test handling * create root
- Loading branch information
1 parent
417a2f4
commit f79d747
Showing
17 changed files
with
268 additions
and
329 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
# Argoverse-HD dataset (ring-front-center camera) http://www.cs.cmu.edu/~mengtial/proj/streaming/ | ||
# Train command: python train.py --data Argoverse_HD.yaml | ||
# Default dataset location is next to YOLOv5: | ||
# /parent | ||
# /datasets/Argoverse | ||
# /yolov5 | ||
|
||
|
||
# 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, ..] | ||
path: ../datasets/Argoverse # dataset root dir | ||
train: Argoverse-1.1/images/train/ # train images (relative to 'path') 39384 images | ||
val: Argoverse-1.1/images/val/ # val images (relative to 'path') 15062 images | ||
test: Argoverse-1.1/images/test/ # test images (optional) https://eval.ai/web/challenges/challenge-page/800/overview | ||
|
||
# Classes | ||
nc: 8 # number of classes | ||
names: [ 'person', 'bicycle', 'car', 'motorcycle', 'bus', 'truck', 'traffic_light', 'stop_sign' ] # class names | ||
|
||
|
||
# Download script/URL (optional) --------------------------------------------------------------------------------------- | ||
download: | | ||
import json | ||
from tqdm import tqdm | ||
from utils.general import download, Path | ||
def argoverse2yolo(set): | ||
labels = {} | ||
a = json.load(open(set, "rb")) | ||
for annot in tqdm(a['annotations'], desc=f"Converting {set} to YOLOv5 format..."): | ||
img_id = annot['image_id'] | ||
img_name = a['images'][img_id]['name'] | ||
img_label_name = img_name[:-3] + "txt" | ||
cls = annot['category_id'] # instance class id | ||
x_center, y_center, width, height = annot['bbox'] | ||
x_center = (x_center + width / 2) / 1920.0 # offset and scale | ||
y_center = (y_center + height / 2) / 1200.0 # offset and scale | ||
width /= 1920.0 # scale | ||
height /= 1200.0 # scale | ||
img_dir = set.parents[2] / 'Argoverse-1.1' / 'labels' / a['seq_dirs'][a['images'][annot['image_id']]['sid']] | ||
if not img_dir.exists(): | ||
img_dir.mkdir(parents=True, exist_ok=True) | ||
k = str(img_dir / img_label_name) | ||
if k not in labels: | ||
labels[k] = [] | ||
labels[k].append(f"{cls} {x_center} {y_center} {width} {height}\n") | ||
for k in labels: | ||
with open(k, "w") as f: | ||
f.writelines(labels[k]) | ||
# Download | ||
dir = Path('../datasets/Argoverse') # dataset root dir | ||
urls = ['https://argoverse-hd.s3.us-east-2.amazonaws.com/Argoverse-HD-Full.zip'] | ||
download(urls, dir=dir, delete=False) | ||
# Convert | ||
annotations_dir = 'Argoverse-HD/annotations/' | ||
(dir / 'Argoverse-1.1' / 'tracking').rename(dir / 'Argoverse-1.1' / 'images') # rename 'tracking' to 'images' | ||
for d in "train.json", "val.json": | ||
argoverse2yolo(dir / annotations_dir / d) # convert VisDrone annotations to YOLO labels |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC/ | ||
# Train command: python train.py --data VOC.yaml | ||
# Default dataset location is next to YOLOv5: | ||
# /parent | ||
# /datasets/VOC | ||
# /yolov5 | ||
|
||
|
||
# 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, ..] | ||
path: ../datasets/VOC | ||
train: # train images (relative to 'path') 16551 images | ||
- images/train2012 | ||
- images/train2007 | ||
- images/val2012 | ||
- images/val2007 | ||
val: # val images (relative to 'path') 4952 images | ||
- images/test2007 | ||
test: # test images (optional) | ||
- images/test2007 | ||
|
||
# Classes | ||
nc: 20 # number of classes | ||
names: [ 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', | ||
'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor' ] # class names | ||
|
||
|
||
# Download script/URL (optional) --------------------------------------------------------------------------------------- | ||
download: | | ||
import xml.etree.ElementTree as ET | ||
from tqdm import tqdm | ||
from utils.general import download, Path | ||
def convert_label(path, lb_path, year, image_id): | ||
def convert_box(size, box): | ||
dw, dh = 1. / size[0], 1. / size[1] | ||
x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2] | ||
return x * dw, y * dh, w * dw, h * dh | ||
in_file = open(path / f'VOC{year}/Annotations/{image_id}.xml') | ||
out_file = open(lb_path, 'w') | ||
tree = ET.parse(in_file) | ||
root = tree.getroot() | ||
size = root.find('size') | ||
w = int(size.find('width').text) | ||
h = int(size.find('height').text) | ||
for obj in root.iter('object'): | ||
cls = obj.find('name').text | ||
if cls in yaml['names'] and not int(obj.find('difficult').text) == 1: | ||
xmlbox = obj.find('bndbox') | ||
bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ('xmin', 'xmax', 'ymin', 'ymax')]) | ||
cls_id = yaml['names'].index(cls) # class id | ||
out_file.write(" ".join([str(a) for a in (cls_id, *bb)]) + '\n') | ||
# Download | ||
dir = Path(yaml['path']) # dataset root dir | ||
url = 'https://github.com/ultralytics/yolov5/releases/download/v1.0/' | ||
urls = [url + 'VOCtrainval_06-Nov-2007.zip', # 446MB, 5012 images | ||
url + 'VOCtest_06-Nov-2007.zip', # 438MB, 4953 images | ||
url + 'VOCtrainval_11-May-2012.zip'] # 1.95GB, 17126 images | ||
download(urls, dir=dir / 'images', delete=False) | ||
# Convert | ||
path = dir / f'images/VOCdevkit' | ||
for year, image_set in ('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test'): | ||
imgs_path = dir / 'images' / f'{image_set}{year}' | ||
lbs_path = dir / 'labels' / f'{image_set}{year}' | ||
imgs_path.mkdir(exist_ok=True, parents=True) | ||
lbs_path.mkdir(exist_ok=True, parents=True) | ||
image_ids = open(path / f'VOC{year}/ImageSets/Main/{image_set}.txt').read().strip().split() | ||
for id in tqdm(image_ids, desc=f'{image_set}{year}'): | ||
f = path / f'VOC{year}/JPEGImages/{id}.jpg' # old img path | ||
lb_path = (lbs_path / f.name).with_suffix('.txt') # new label path | ||
f.rename(imgs_path / f.name) # move image | ||
convert_label(path, lb_path, year, id) # convert labels to YOLO format |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.