Add YOLOv5 dataset yamls (#207)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>pull/211/head
parent
e371e81aa0
commit
c7629e93bd
14 changed files with 2018 additions and 39 deletions
@ -0,0 +1,74 @@ |
||||
# Ultralytics YOLO 🚀, GPL-3.0 license |
||||
# Argoverse-HD dataset (ring-front-center camera) http://www.cs.cmu.edu/~mengtial/proj/streaming/ by Argo AI |
||||
# Example usage: python train.py --data Argoverse.yaml |
||||
# parent |
||||
# ├── yolov5 |
||||
# └── datasets |
||||
# └── Argoverse ← downloads here (31.3 GB) |
||||
|
||||
|
||||
# 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 |
||||
names: |
||||
0: person |
||||
1: bicycle |
||||
2: car |
||||
3: motorcycle |
||||
4: bus |
||||
5: truck |
||||
6: traffic_light |
||||
7: stop_sign |
||||
|
||||
|
||||
# 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 = f'{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(yaml['path']) # 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 |
@ -0,0 +1,54 @@ |
||||
# Ultralytics YOLO 🚀, GPL-3.0 license |
||||
# Global Wheat 2020 dataset http://www.global-wheat.com/ by University of Saskatchewan |
||||
# Example usage: python train.py --data GlobalWheat2020.yaml |
||||
# parent |
||||
# ├── yolov5 |
||||
# └── datasets |
||||
# └── GlobalWheat2020 ← downloads here (7.0 GB) |
||||
|
||||
|
||||
# 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/GlobalWheat2020 # dataset root dir |
||||
train: # train images (relative to 'path') 3422 images |
||||
- images/arvalis_1 |
||||
- images/arvalis_2 |
||||
- images/arvalis_3 |
||||
- images/ethz_1 |
||||
- images/rres_1 |
||||
- images/inrae_1 |
||||
- images/usask_1 |
||||
val: # val images (relative to 'path') 748 images (WARNING: train set contains ethz_1) |
||||
- images/ethz_1 |
||||
test: # test images (optional) 1276 images |
||||
- images/utokyo_1 |
||||
- images/utokyo_2 |
||||
- images/nau_1 |
||||
- images/uq_1 |
||||
|
||||
# Classes |
||||
names: |
||||
0: wheat_head |
||||
|
||||
|
||||
# Download script/URL (optional) --------------------------------------------------------------------------------------- |
||||
download: | |
||||
from utils.general import download, Path |
||||
|
||||
|
||||
# Download |
||||
dir = Path(yaml['path']) # dataset root dir |
||||
urls = ['https://zenodo.org/record/4298502/files/global-wheat-codalab-official.zip', |
||||
'https://github.com/ultralytics/yolov5/releases/download/v1.0/GlobalWheat2020_labels.zip'] |
||||
download(urls, dir=dir) |
||||
|
||||
# Make Directories |
||||
for p in 'annotations', 'images', 'labels': |
||||
(dir / p).mkdir(parents=True, exist_ok=True) |
||||
|
||||
# Move |
||||
for p in 'arvalis_1', 'arvalis_2', 'arvalis_3', 'ethz_1', 'rres_1', 'inrae_1', 'usask_1', \ |
||||
'utokyo_1', 'utokyo_2', 'nau_1', 'uq_1': |
||||
(dir / p).rename(dir / 'images' / p) # move to /images |
||||
f = (dir / p).with_suffix('.json') # json file |
||||
if f.exists(): |
||||
f.rename((dir / 'annotations' / p).with_suffix('.json')) # move to /annotations |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,438 @@ |
||||
# Ultralytics YOLO 🚀, GPL-3.0 license |
||||
# Objects365 dataset https://www.objects365.org/ by Megvii |
||||
# Example usage: python train.py --data Objects365.yaml |
||||
# parent |
||||
# ├── yolov5 |
||||
# └── datasets |
||||
# └── Objects365 ← downloads here (712 GB = 367G data + 345G zips) |
||||
|
||||
|
||||
# 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/Objects365 # dataset root dir |
||||
train: images/train # train images (relative to 'path') 1742289 images |
||||
val: images/val # val images (relative to 'path') 80000 images |
||||
test: # test images (optional) |
||||
|
||||
# Classes |
||||
names: |
||||
0: Person |
||||
1: Sneakers |
||||
2: Chair |
||||
3: Other Shoes |
||||
4: Hat |
||||
5: Car |
||||
6: Lamp |
||||
7: Glasses |
||||
8: Bottle |
||||
9: Desk |
||||
10: Cup |
||||
11: Street Lights |
||||
12: Cabinet/shelf |
||||
13: Handbag/Satchel |
||||
14: Bracelet |
||||
15: Plate |
||||
16: Picture/Frame |
||||
17: Helmet |
||||
18: Book |
||||
19: Gloves |
||||
20: Storage box |
||||
21: Boat |
||||
22: Leather Shoes |
||||
23: Flower |
||||
24: Bench |
||||
25: Potted Plant |
||||
26: Bowl/Basin |
||||
27: Flag |
||||
28: Pillow |
||||
29: Boots |
||||
30: Vase |
||||
31: Microphone |
||||
32: Necklace |
||||
33: Ring |
||||
34: SUV |
||||
35: Wine Glass |
||||
36: Belt |
||||
37: Monitor/TV |
||||
38: Backpack |
||||
39: Umbrella |
||||
40: Traffic Light |
||||
41: Speaker |
||||
42: Watch |
||||
43: Tie |
||||
44: Trash bin Can |
||||
45: Slippers |
||||
46: Bicycle |
||||
47: Stool |
||||
48: Barrel/bucket |
||||
49: Van |
||||
50: Couch |
||||
51: Sandals |
||||
52: Basket |
||||
53: Drum |
||||
54: Pen/Pencil |
||||
55: Bus |
||||
56: Wild Bird |
||||
57: High Heels |
||||
58: Motorcycle |
||||
59: Guitar |
||||
60: Carpet |
||||
61: Cell Phone |
||||
62: Bread |
||||
63: Camera |
||||
64: Canned |
||||
65: Truck |
||||
66: Traffic cone |
||||
67: Cymbal |
||||
68: Lifesaver |
||||
69: Towel |
||||
70: Stuffed Toy |
||||
71: Candle |
||||
72: Sailboat |
||||
73: Laptop |
||||
74: Awning |
||||
75: Bed |
||||
76: Faucet |
||||
77: Tent |
||||
78: Horse |
||||
79: Mirror |
||||
80: Power outlet |
||||
81: Sink |
||||
82: Apple |
||||
83: Air Conditioner |
||||
84: Knife |
||||
85: Hockey Stick |
||||
86: Paddle |
||||
87: Pickup Truck |
||||
88: Fork |
||||
89: Traffic Sign |
||||
90: Balloon |
||||
91: Tripod |
||||
92: Dog |
||||
93: Spoon |
||||
94: Clock |
||||
95: Pot |
||||
96: Cow |
||||
97: Cake |
||||
98: Dinning Table |
||||
99: Sheep |
||||
100: Hanger |
||||
101: Blackboard/Whiteboard |
||||
102: Napkin |
||||
103: Other Fish |
||||
104: Orange/Tangerine |
||||
105: Toiletry |
||||
106: Keyboard |
||||
107: Tomato |
||||
108: Lantern |
||||
109: Machinery Vehicle |
||||
110: Fan |
||||
111: Green Vegetables |
||||
112: Banana |
||||
113: Baseball Glove |
||||
114: Airplane |
||||
115: Mouse |
||||
116: Train |
||||
117: Pumpkin |
||||
118: Soccer |
||||
119: Skiboard |
||||
120: Luggage |
||||
121: Nightstand |
||||
122: Tea pot |
||||
123: Telephone |
||||
124: Trolley |
||||
125: Head Phone |
||||
126: Sports Car |
||||
127: Stop Sign |
||||
128: Dessert |
||||
129: Scooter |
||||
130: Stroller |
||||
131: Crane |
||||
132: Remote |
||||
133: Refrigerator |
||||
134: Oven |
||||
135: Lemon |
||||
136: Duck |
||||
137: Baseball Bat |
||||
138: Surveillance Camera |
||||
139: Cat |
||||
140: Jug |
||||
141: Broccoli |
||||
142: Piano |
||||
143: Pizza |
||||
144: Elephant |
||||
145: Skateboard |
||||
146: Surfboard |
||||
147: Gun |
||||
148: Skating and Skiing shoes |
||||
149: Gas stove |
||||
150: Donut |
||||
151: Bow Tie |
||||
152: Carrot |
||||
153: Toilet |
||||
154: Kite |
||||
155: Strawberry |
||||
156: Other Balls |
||||
157: Shovel |
||||
158: Pepper |
||||
159: Computer Box |
||||
160: Toilet Paper |
||||
161: Cleaning Products |
||||
162: Chopsticks |
||||
163: Microwave |
||||
164: Pigeon |
||||
165: Baseball |
||||
166: Cutting/chopping Board |
||||
167: Coffee Table |
||||
168: Side Table |
||||
169: Scissors |
||||
170: Marker |
||||
171: Pie |
||||
172: Ladder |
||||
173: Snowboard |
||||
174: Cookies |
||||
175: Radiator |
||||
176: Fire Hydrant |
||||
177: Basketball |
||||
178: Zebra |
||||
179: Grape |
||||
180: Giraffe |
||||
181: Potato |
||||
182: Sausage |
||||
183: Tricycle |
||||
184: Violin |
||||
185: Egg |
||||
186: Fire Extinguisher |
||||
187: Candy |
||||
188: Fire Truck |
||||
189: Billiards |
||||
190: Converter |
||||
191: Bathtub |
||||
192: Wheelchair |
||||
193: Golf Club |
||||
194: Briefcase |
||||
195: Cucumber |
||||
196: Cigar/Cigarette |
||||
197: Paint Brush |
||||
198: Pear |
||||
199: Heavy Truck |
||||
200: Hamburger |
||||
201: Extractor |
||||
202: Extension Cord |
||||
203: Tong |
||||
204: Tennis Racket |
||||
205: Folder |
||||
206: American Football |
||||
207: earphone |
||||
208: Mask |
||||
209: Kettle |
||||
210: Tennis |
||||
211: Ship |
||||
212: Swing |
||||
213: Coffee Machine |
||||
214: Slide |
||||
215: Carriage |
||||
216: Onion |
||||
217: Green beans |
||||
218: Projector |
||||
219: Frisbee |
||||
220: Washing Machine/Drying Machine |
||||
221: Chicken |
||||
222: Printer |
||||
223: Watermelon |
||||
224: Saxophone |
||||
225: Tissue |
||||
226: Toothbrush |
||||
227: Ice cream |
||||
228: Hot-air balloon |
||||
229: Cello |
||||
230: French Fries |
||||
231: Scale |
||||
232: Trophy |
||||
233: Cabbage |
||||
234: Hot dog |
||||
235: Blender |
||||
236: Peach |
||||
237: Rice |
||||
238: Wallet/Purse |
||||
239: Volleyball |
||||
240: Deer |
||||
241: Goose |
||||
242: Tape |
||||
243: Tablet |
||||
244: Cosmetics |
||||
245: Trumpet |
||||
246: Pineapple |
||||
247: Golf Ball |
||||
248: Ambulance |
||||
249: Parking meter |
||||
250: Mango |
||||
251: Key |
||||
252: Hurdle |
||||
253: Fishing Rod |
||||
254: Medal |
||||
255: Flute |
||||
256: Brush |
||||
257: Penguin |
||||
258: Megaphone |
||||
259: Corn |
||||
260: Lettuce |
||||
261: Garlic |
||||
262: Swan |
||||
263: Helicopter |
||||
264: Green Onion |
||||
265: Sandwich |
||||
266: Nuts |
||||
267: Speed Limit Sign |
||||
268: Induction Cooker |
||||
269: Broom |
||||
270: Trombone |
||||
271: Plum |
||||
272: Rickshaw |
||||
273: Goldfish |
||||
274: Kiwi fruit |
||||
275: Router/modem |
||||
276: Poker Card |
||||
277: Toaster |
||||
278: Shrimp |
||||
279: Sushi |
||||
280: Cheese |
||||
281: Notepaper |
||||
282: Cherry |
||||
283: Pliers |
||||
284: CD |
||||
285: Pasta |
||||
286: Hammer |
||||
287: Cue |
||||
288: Avocado |
||||
289: Hamimelon |
||||
290: Flask |
||||
291: Mushroom |
||||
292: Screwdriver |
||||
293: Soap |
||||
294: Recorder |
||||
295: Bear |
||||
296: Eggplant |
||||
297: Board Eraser |
||||
298: Coconut |
||||
299: Tape Measure/Ruler |
||||
300: Pig |
||||
301: Showerhead |
||||
302: Globe |
||||
303: Chips |
||||
304: Steak |
||||
305: Crosswalk Sign |
||||
306: Stapler |
||||
307: Camel |
||||
308: Formula 1 |
||||
309: Pomegranate |
||||
310: Dishwasher |
||||
311: Crab |
||||
312: Hoverboard |
||||
313: Meat ball |
||||
314: Rice Cooker |
||||
315: Tuba |
||||
316: Calculator |
||||
317: Papaya |
||||
318: Antelope |
||||
319: Parrot |
||||
320: Seal |
||||
321: Butterfly |
||||
322: Dumbbell |
||||
323: Donkey |
||||
324: Lion |
||||
325: Urinal |
||||
326: Dolphin |
||||
327: Electric Drill |
||||
328: Hair Dryer |
||||
329: Egg tart |
||||
330: Jellyfish |
||||
331: Treadmill |
||||
332: Lighter |
||||
333: Grapefruit |
||||
334: Game board |
||||
335: Mop |
||||
336: Radish |
||||
337: Baozi |
||||
338: Target |
||||
339: French |
||||
340: Spring Rolls |
||||
341: Monkey |
||||
342: Rabbit |
||||
343: Pencil Case |
||||
344: Yak |
||||
345: Red Cabbage |
||||
346: Binoculars |
||||
347: Asparagus |
||||
348: Barbell |
||||
349: Scallop |
||||
350: Noddles |
||||
351: Comb |
||||
352: Dumpling |
||||
353: Oyster |
||||
354: Table Tennis paddle |
||||
355: Cosmetics Brush/Eyeliner Pencil |
||||
356: Chainsaw |
||||
357: Eraser |
||||
358: Lobster |
||||
359: Durian |
||||
360: Okra |
||||
361: Lipstick |
||||
362: Cosmetics Mirror |
||||
363: Curling |
||||
364: Table Tennis |
||||
|
||||
|
||||
# Download script/URL (optional) --------------------------------------------------------------------------------------- |
||||
download: | |
||||
from tqdm import tqdm |
||||
|
||||
from utils.general import Path, check_requirements, download, np, xyxy2xywhn |
||||
|
||||
check_requirements(('pycocotools>=2.0',)) |
||||
from pycocotools.coco import COCO |
||||
|
||||
# Make Directories |
||||
dir = Path(yaml['path']) # dataset root dir |
||||
for p in 'images', 'labels': |
||||
(dir / p).mkdir(parents=True, exist_ok=True) |
||||
for q in 'train', 'val': |
||||
(dir / p / q).mkdir(parents=True, exist_ok=True) |
||||
|
||||
# Train, Val Splits |
||||
for split, patches in [('train', 50 + 1), ('val', 43 + 1)]: |
||||
print(f"Processing {split} in {patches} patches ...") |
||||
images, labels = dir / 'images' / split, dir / 'labels' / split |
||||
|
||||
# Download |
||||
url = f"https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/{split}/" |
||||
if split == 'train': |
||||
download([f'{url}zhiyuan_objv2_{split}.tar.gz'], dir=dir, delete=False) # annotations json |
||||
download([f'{url}patch{i}.tar.gz' for i in range(patches)], dir=images, curl=True, delete=False, threads=8) |
||||
elif split == 'val': |
||||
download([f'{url}zhiyuan_objv2_{split}.json'], dir=dir, delete=False) # annotations json |
||||
download([f'{url}images/v1/patch{i}.tar.gz' for i in range(15 + 1)], dir=images, curl=True, delete=False, threads=8) |
||||
download([f'{url}images/v2/patch{i}.tar.gz' for i in range(16, patches)], dir=images, curl=True, delete=False, threads=8) |
||||
|
||||
# Move |
||||
for f in tqdm(images.rglob('*.jpg'), desc=f'Moving {split} images'): |
||||
f.rename(images / f.name) # move to /images/{split} |
||||
|
||||
# Labels |
||||
coco = COCO(dir / f'zhiyuan_objv2_{split}.json') |
||||
names = [x["name"] for x in coco.loadCats(coco.getCatIds())] |
||||
for cid, cat in enumerate(names): |
||||
catIds = coco.getCatIds(catNms=[cat]) |
||||
imgIds = coco.getImgIds(catIds=catIds) |
||||
for im in tqdm(coco.loadImgs(imgIds), desc=f'Class {cid + 1}/{len(names)} {cat}'): |
||||
width, height = im["width"], im["height"] |
||||
path = Path(im["file_name"]) # image filename |
||||
try: |
||||
with open(labels / path.with_suffix('.txt').name, 'a') as file: |
||||
annIds = coco.getAnnIds(imgIds=im["id"], catIds=catIds, iscrowd=None) |
||||
for a in coco.loadAnns(annIds): |
||||
x, y, w, h = a['bbox'] # bounding box in xywh (xy top-left corner) |
||||
xyxy = np.array([x, y, x + w, y + h])[None] # pixels(1,4) |
||||
x, y, w, h = xyxy2xywhn(xyxy, w=width, h=height, clip=True)[0] # normalized and clipped |
||||
file.write(f"{cid} {x:.5f} {y:.5f} {w:.5f} {h:.5f}\n") |
||||
except Exception as e: |
||||
print(e) |
@ -0,0 +1,53 @@ |
||||
# Ultralytics YOLO 🚀, GPL-3.0 license |
||||
# SKU-110K retail items dataset https://github.com/eg4000/SKU110K_CVPR19 by Trax Retail |
||||
# Example usage: python train.py --data SKU-110K.yaml |
||||
# parent |
||||
# ├── yolov5 |
||||
# └── datasets |
||||
# └── SKU-110K ← downloads here (13.6 GB) |
||||
|
||||
|
||||
# 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/SKU-110K # dataset root dir |
||||
train: train.txt # train images (relative to 'path') 8219 images |
||||
val: val.txt # val images (relative to 'path') 588 images |
||||
test: test.txt # test images (optional) 2936 images |
||||
|
||||
# Classes |
||||
names: |
||||
0: object |
||||
|
||||
|
||||
# Download script/URL (optional) --------------------------------------------------------------------------------------- |
||||
download: | |
||||
import shutil |
||||
from tqdm import tqdm |
||||
from utils.general import np, pd, Path, download, xyxy2xywh |
||||
|
||||
|
||||
# Download |
||||
dir = Path(yaml['path']) # dataset root dir |
||||
parent = Path(dir.parent) # download dir |
||||
urls = ['http://trax-geometry.s3.amazonaws.com/cvpr_challenge/SKU110K_fixed.tar.gz'] |
||||
download(urls, dir=parent, delete=False) |
||||
|
||||
# Rename directories |
||||
if dir.exists(): |
||||
shutil.rmtree(dir) |
||||
(parent / 'SKU110K_fixed').rename(dir) # rename dir |
||||
(dir / 'labels').mkdir(parents=True, exist_ok=True) # create labels dir |
||||
|
||||
# Convert labels |
||||
names = 'image', 'x1', 'y1', 'x2', 'y2', 'class', 'image_width', 'image_height' # column names |
||||
for d in 'annotations_train.csv', 'annotations_val.csv', 'annotations_test.csv': |
||||
x = pd.read_csv(dir / 'annotations' / d, names=names).values # annotations |
||||
images, unique_images = x[:, 0], np.unique(x[:, 0]) |
||||
with open((dir / d).with_suffix('.txt').__str__().replace('annotations_', ''), 'w') as f: |
||||
f.writelines(f'./images/{s}\n' for s in unique_images) |
||||
for im in tqdm(unique_images, desc=f'Converting {dir / d}'): |
||||
cls = 0 # single-class dataset |
||||
with open((dir / 'labels' / im).with_suffix('.txt'), 'a') as f: |
||||
for r in x[images == im]: |
||||
w, h = r[6], r[7] # image width, height |
||||
xywh = xyxy2xywh(np.array([[r[1] / w, r[2] / h, r[3] / w, r[4] / h]]))[0] # instance |
||||
f.write(f"{cls} {xywh[0]:.5f} {xywh[1]:.5f} {xywh[2]:.5f} {xywh[3]:.5f}\n") # write label |
@ -0,0 +1,100 @@ |
||||
# Ultralytics YOLO 🚀, GPL-3.0 license |
||||
# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC by University of Oxford |
||||
# Example usage: python train.py --data VOC.yaml |
||||
# parent |
||||
# ├── yolov5 |
||||
# └── datasets |
||||
# └── VOC ← downloads here (2.8 GB) |
||||
|
||||
|
||||
# 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 |
||||
names: |
||||
0: aeroplane |
||||
1: bicycle |
||||
2: bird |
||||
3: boat |
||||
4: bottle |
||||
5: bus |
||||
6: car |
||||
7: cat |
||||
8: chair |
||||
9: cow |
||||
10: diningtable |
||||
11: dog |
||||
12: horse |
||||
13: motorbike |
||||
14: person |
||||
15: pottedplant |
||||
16: sheep |
||||
17: sofa |
||||
18: train |
||||
19: tvmonitor |
||||
|
||||
|
||||
# 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) |
||||
|
||||
names = list(yaml['names'].values()) # names list |
||||
for obj in root.iter('object'): |
||||
cls = obj.find('name').text |
||||
if cls in names and 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 = 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 = [f'{url}VOCtrainval_06-Nov-2007.zip', # 446MB, 5012 images |
||||
f'{url}VOCtest_06-Nov-2007.zip', # 438MB, 4953 images |
||||
f'{url}VOCtrainval_11-May-2012.zip'] # 1.95GB, 17126 images |
||||
download(urls, dir=dir / 'images', delete=False, curl=True, threads=3) |
||||
|
||||
# Convert |
||||
path = dir / '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) |
||||
|
||||
with open(path / f'VOC{year}/ImageSets/Main/{image_set}.txt') as f: |
||||
image_ids = f.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 |
@ -0,0 +1,70 @@ |
||||
# Ultralytics YOLO 🚀, GPL-3.0 license |
||||
# VisDrone2019-DET dataset https://github.com/VisDrone/VisDrone-Dataset by Tianjin University |
||||
# Example usage: python train.py --data VisDrone.yaml |
||||
# parent |
||||
# ├── yolov5 |
||||
# └── datasets |
||||
# └── VisDrone ← downloads here (2.3 GB) |
||||
|
||||
|
||||
# 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/VisDrone # dataset root dir |
||||
train: VisDrone2019-DET-train/images # train images (relative to 'path') 6471 images |
||||
val: VisDrone2019-DET-val/images # val images (relative to 'path') 548 images |
||||
test: VisDrone2019-DET-test-dev/images # test images (optional) 1610 images |
||||
|
||||
# Classes |
||||
names: |
||||
0: pedestrian |
||||
1: people |
||||
2: bicycle |
||||
3: car |
||||
4: van |
||||
5: truck |
||||
6: tricycle |
||||
7: awning-tricycle |
||||
8: bus |
||||
9: motor |
||||
|
||||
|
||||
# Download script/URL (optional) --------------------------------------------------------------------------------------- |
||||
download: | |
||||
from utils.general import download, os, Path |
||||
|
||||
def visdrone2yolo(dir): |
||||
from PIL import Image |
||||
from tqdm import tqdm |
||||
|
||||
def convert_box(size, box): |
||||
# Convert VisDrone box to YOLO xywh box |
||||
dw = 1. / size[0] |
||||
dh = 1. / size[1] |
||||
return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh |
||||
|
||||
(dir / 'labels').mkdir(parents=True, exist_ok=True) # make labels directory |
||||
pbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}') |
||||
for f in pbar: |
||||
img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).size |
||||
lines = [] |
||||
with open(f, 'r') as file: # read annotation.txt |
||||
for row in [x.split(',') for x in file.read().strip().splitlines()]: |
||||
if row[4] == '0': # VisDrone 'ignored regions' class 0 |
||||
continue |
||||
cls = int(row[5]) - 1 |
||||
box = convert_box(img_size, tuple(map(int, row[:4]))) |
||||
lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n") |
||||
with open(str(f).replace(os.sep + 'annotations' + os.sep, os.sep + 'labels' + os.sep), 'w') as fl: |
||||
fl.writelines(lines) # write label.txt |
||||
|
||||
|
||||
# Download |
||||
dir = Path(yaml['path']) # dataset root dir |
||||
urls = ['https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-train.zip', |
||||
'https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-val.zip', |
||||
'https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-test-dev.zip', |
||||
'https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-test-challenge.zip'] |
||||
download(urls, dir=dir, curl=True, threads=4) |
||||
|
||||
# Convert |
||||
for d in 'VisDrone2019-DET-train', 'VisDrone2019-DET-val', 'VisDrone2019-DET-test-dev': |
||||
visdrone2yolo(dir / d) # convert VisDrone annotations to YOLO labels |
@ -0,0 +1,153 @@ |
||||
# Ultralytics YOLO 🚀, GPL-3.0 license |
||||
# DIUx xView 2018 Challenge https://challenge.xviewdataset.org by U.S. National Geospatial-Intelligence Agency (NGA) |
||||
# -------- DOWNLOAD DATA MANUALLY and jar xf val_images.zip to 'datasets/xView' before running train command! -------- |
||||
# Example usage: python train.py --data xView.yaml |
||||
# parent |
||||
# ├── yolov5 |
||||
# └── datasets |
||||
# └── xView ← downloads here (20.7 GB) |
||||
|
||||
|
||||
# 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/xView # dataset root dir |
||||
train: images/autosplit_train.txt # train images (relative to 'path') 90% of 847 train images |
||||
val: images/autosplit_val.txt # train images (relative to 'path') 10% of 847 train images |
||||
|
||||
# Classes |
||||
names: |
||||
0: Fixed-wing Aircraft |
||||
1: Small Aircraft |
||||
2: Cargo Plane |
||||
3: Helicopter |
||||
4: Passenger Vehicle |
||||
5: Small Car |
||||
6: Bus |
||||
7: Pickup Truck |
||||
8: Utility Truck |
||||
9: Truck |
||||
10: Cargo Truck |
||||
11: Truck w/Box |
||||
12: Truck Tractor |
||||
13: Trailer |
||||
14: Truck w/Flatbed |
||||
15: Truck w/Liquid |
||||
16: Crane Truck |
||||
17: Railway Vehicle |
||||
18: Passenger Car |
||||
19: Cargo Car |
||||
20: Flat Car |
||||
21: Tank car |
||||
22: Locomotive |
||||
23: Maritime Vessel |
||||
24: Motorboat |
||||
25: Sailboat |
||||
26: Tugboat |
||||
27: Barge |
||||
28: Fishing Vessel |
||||
29: Ferry |
||||
30: Yacht |
||||
31: Container Ship |
||||
32: Oil Tanker |
||||
33: Engineering Vehicle |
||||
34: Tower crane |
||||
35: Container Crane |
||||
36: Reach Stacker |
||||
37: Straddle Carrier |
||||
38: Mobile Crane |
||||
39: Dump Truck |
||||
40: Haul Truck |
||||
41: Scraper/Tractor |
||||
42: Front loader/Bulldozer |
||||
43: Excavator |
||||
44: Cement Mixer |
||||
45: Ground Grader |
||||
46: Hut/Tent |
||||
47: Shed |
||||
48: Building |
||||
49: Aircraft Hangar |
||||
50: Damaged Building |
||||
51: Facility |
||||
52: Construction Site |
||||
53: Vehicle Lot |
||||
54: Helipad |
||||
55: Storage Tank |
||||
56: Shipping container lot |
||||
57: Shipping Container |
||||
58: Pylon |
||||
59: Tower |
||||
|
||||
|
||||
# Download script/URL (optional) --------------------------------------------------------------------------------------- |
||||
download: | |
||||
import json |
||||
import os |
||||
from pathlib import Path |
||||
|
||||
import numpy as np |
||||
from PIL import Image |
||||
from tqdm import tqdm |
||||
|
||||
from utils.dataloaders import autosplit |
||||
from utils.general import download, xyxy2xywhn |
||||
|
||||
|
||||
def convert_labels(fname=Path('xView/xView_train.geojson')): |
||||
# Convert xView geoJSON labels to YOLO format |
||||
path = fname.parent |
||||
with open(fname) as f: |
||||
print(f'Loading {fname}...') |
||||
data = json.load(f) |
||||
|
||||
# Make dirs |
||||
labels = Path(path / 'labels' / 'train') |
||||
os.system(f'rm -rf {labels}') |
||||
labels.mkdir(parents=True, exist_ok=True) |
||||
|
||||
# xView classes 11-94 to 0-59 |
||||
xview_class2index = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, -1, 3, -1, 4, 5, 6, 7, 8, -1, 9, 10, 11, |
||||
12, 13, 14, 15, -1, -1, 16, 17, 18, 19, 20, 21, 22, -1, 23, 24, 25, -1, 26, 27, -1, 28, -1, |
||||
29, 30, 31, 32, 33, 34, 35, 36, 37, -1, 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, -1, -1, 46, |
||||
47, 48, 49, -1, 50, 51, -1, 52, -1, -1, -1, 53, 54, -1, 55, -1, -1, 56, -1, 57, -1, 58, 59] |
||||
|
||||
shapes = {} |
||||
for feature in tqdm(data['features'], desc=f'Converting {fname}'): |
||||
p = feature['properties'] |
||||
if p['bounds_imcoords']: |
||||
id = p['image_id'] |
||||
file = path / 'train_images' / id |
||||
if file.exists(): # 1395.tif missing |
||||
try: |
||||
box = np.array([int(num) for num in p['bounds_imcoords'].split(",")]) |
||||
assert box.shape[0] == 4, f'incorrect box shape {box.shape[0]}' |
||||
cls = p['type_id'] |
||||
cls = xview_class2index[int(cls)] # xView class to 0-60 |
||||
assert 59 >= cls >= 0, f'incorrect class index {cls}' |
||||
|
||||
# Write YOLO label |
||||
if id not in shapes: |
||||
shapes[id] = Image.open(file).size |
||||
box = xyxy2xywhn(box[None].astype(np.float), w=shapes[id][0], h=shapes[id][1], clip=True) |
||||
with open((labels / id).with_suffix('.txt'), 'a') as f: |
||||
f.write(f"{cls} {' '.join(f'{x:.6f}' for x in box[0])}\n") # write label.txt |
||||
except Exception as e: |
||||
print(f'WARNING: skipping one label for {file}: {e}') |
||||
|
||||
|
||||
# Download manually from https://challenge.xviewdataset.org |
||||
dir = Path(yaml['path']) # dataset root dir |
||||
# urls = ['https://d307kc0mrhucc3.cloudfront.net/train_labels.zip', # train labels |
||||
# 'https://d307kc0mrhucc3.cloudfront.net/train_images.zip', # 15G, 847 train images |
||||
# 'https://d307kc0mrhucc3.cloudfront.net/val_images.zip'] # 5G, 282 val images (no labels) |
||||
# download(urls, dir=dir, delete=False) |
||||
|
||||
# Convert labels |
||||
convert_labels(dir / 'xView_train.geojson') |
||||
|
||||
# Move images |
||||
images = Path(dir / 'images') |
||||
images.mkdir(parents=True, exist_ok=True) |
||||
Path(dir / 'train_images').rename(dir / 'images' / 'train') |
||||
Path(dir / 'val_images').rename(dir / 'images' / 'val') |
||||
|
||||
# Split |
||||
autosplit(dir / 'images' / 'train') |
Loading…
Reference in new issue