I am asking this question because I am a little novice in these matters. I want to start the model training with RT-DETR. I am using a custom dataset. But I think I have a problem with my mad.yaml file. I want to start training the model, but it doesn't work. Can you help me?
I first read the data set and then split it. `
import opendatasets as od
import pandas
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import glob
import shutil
import cv2
import os
from tqdm import tqdm
od.download(
"https://www.kaggle.com/datasets/a2015003713/militaryaircraftdetectiondataset")
%pip install ultralytics
import ultralytics
ultralytics.checks()
classes = np.array(['A10','A400M','AG600','AV8B',
'B1','B2','B52','Be200',
'C130','C2','C17','C5','E2','E7','EF2000',
'F117','F14','F15','F16','F18','F22','F35','F4',
'JAS39','MQ9','Mig31','Mirage2000','P3','RQ4','Rafale',
'SR71','Su34','Su57',
'Tu160','Tu95','Tornado',
'U2','US2', 'V22','XB70','YF23','Vulcan','J20']
)
print(len(classes))
csv_paths = glob.glob('/content/militaryaircraftdetectiondataset/dataset/*.csv')
jpg_paths = glob.glob('/content/militaryaircraftdetectiondataset/dataset/*.jpg')
csv_paths.sort()
jpg_paths.sort()
print('number of images:',len(csv_paths))
os.makedirs('/content/militaryaircraftdetectiondataset/data/train/images', exist_ok=True)
os.makedirs('/content/militaryaircraftdetectiondataset/data/train/labels', exist_ok=True)
os.makedirs('/content/militaryaircraftdetectiondataset/data/valid/images', exist_ok=True)
os.makedirs('/content/militaryaircraftdetectiondataset/data/valid/labels', exist_ok=True)
os.makedirs('/content/militaryaircraftdetectiondataset/data/test/images', exist_ok=True)
os.makedirs('/content/militaryaircraftdetectiondataset/data/test/labels', exist_ok=True)
# split
for i, (csv_path, jpg_path) in enumerate(tqdm(zip(csv_paths, jpg_paths))):
annotations = np.array(pd.read_csv(csv_path))
if os.path.basename(csv_path)[0] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'f']:
jpg_file_path = './yolov7/data/train/images/' + os.path.basename(jpg_path)
txt_file_path = './yolov7/data/train/labels/' + os.path.basename(csv_path)[:-4]+'.txt'
shutil.copy(jpg_path, jpg_file_path)
continue
elif os.path.basename(csv_path)[0] in ['c', 'd', 'e']:
jpg_file_path = '/content/militaryaircraftdetectiondataset/data/valid/images/' + os.path.basename(jpg_path)
txt_file_path = '/content/militaryaircraftdetectiondataset/data/valid/labels/' + os.path.basename(csv_path)[:-4]+'.txt'
shutil.copy(jpg_path, jpg_file_path)
else:
jpg_file_path = './yolov7/data/test/images/' + os.path.basename(jpg_path)
txt_file_path = './yolov7/data/test/labels/' + os.path.basename(csv_path)[:-4]+'.txt'
shutil.copy(jpg_path, jpg_file_path)
continue
with open(txt_file_path, mode='w') as f:
try:
for annotation in annotations:
width = annotation[1]
height = annotation[2]
class_name = annotation[3]
xmin = annotation[4]
ymin = annotation[5]
xmax = annotation[6]
ymax = annotation[7]
x_center = 0.5*(xmin+xmax)
y_center = 0.5*(ymin+ymax)
b_width = xmax - xmin
b_height= ymax - ymin
class_num = np.where(classes==class_name)[0][0]
output_string = '{} {} {} {} {}\n'.format(class_num,
x_center/width,
y_center/height,
b_width/width,
b_height/height)
f.write(output_string)
except:
print(txt_file_path)
0/0
print('test:',len(glob.glob('/content/militaryaircraftdetectiondataset/data/test/labels/*.txt')))
print('valid:',len(glob.glob('/content/militaryaircraftdetectiondataset/data/valid/labels/*.txt')))
print('train',len(glob.glob('/content/militaryaircraftdetectiondataset/data/train/labels/*.txt')))
classes_string = ', '.join([f'"{c}"' for c in classes])
with open('/content/drive/MyDrive/Colab Notebooks/ultralytics/mad.yaml', mode='w') as f:
yaml_string='train: /content/militaryaircraftdetectiondataset/data/train\n'\
+ 'val: /content/militaryaircraftdetectiondataset/data/valid\n'\
+ 'test: /content/militaryaircraftdetectiondataset/data/test\n'\
+ f'nc: {len(classes)}\n'\
+ f'names: [{classes_string}]'
f.write(yaml_string)
print(yaml_string)
`
And then my mad.yaml file looks like this.
train: /content/militaryaircraftdetectiondataset/data/train
val: /content/militaryaircraftdetectiondataset/data/valid
test: /content/militaryaircraftdetectiondataset/data/test
nc: 43
names: ["A10", "A400M", "AG600", "AV8B", "B1", "B2", "B52", "Be200", "C130", "C2", "C17", "C5", "E2", "E7", "EF2000", "F117", "F14", "F15", "F16", "F18", "F22", "F35", "F4", "JAS39", "MQ9", "Mig31", "Mirage2000", "P3", "RQ4", "Rafale", "SR71", "Su34", "Su57", "Tu160", "Tu95", "Tornado", "U2", "US2", "V22", "XB70", "YF23", "Vulcan", "J20"]
and then I included from ultralytics import RTDETR.
from ultralytics import RTDETR
model = RTDETR('rtdetr-l.pt')
model.info()
Everything has gone great so far, but I would appreciate it if you could tell me how to send my mad.yaml file here before I start the train process.I tried it this way:
results = model.train(data = '/content/drive/MyDrive/Colab Notebooks/ultralytics/mad.yaml', epochs=100, imgsz=640)
However, it gave the following error.
Ultralytics YOLOv8.0.207 Python-3.10.12 torch-2.1.0+cu118 CPU (Intel Xeon 2.20GHz)
engine/trainer: task=detect, mode=train, model=rtdetr-l.pt, data=/content/drive/MyDrive/Colab Notebooks/ultralytics/mad.yaml, epochs=100, patience=50, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train5, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, show=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, vid_stride=1, stream_buffer=False, line_width=None, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, boxes=True, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0, cfg=None, tracker=botsort.yaml, save_dir=runs/detect/train5
WARNING ⚠️ no model scale passed. Assuming scale='l'.
from n params module arguments
0 -1 1 25248 ultralytics.nn.modules.block.HGStem [3, 32, 48]
1 -1 6 155072 ultralytics.nn.modules.block.HGBlock [48, 48, 128, 3, 6]
2 -1 1 1408 ultralytics.nn.modules.conv.DWConv [128, 128, 3, 2, 1, False]
3 -1 6 839296 ultralytics.nn.modules.block.HGBlock [128, 96, 512, 3, 6]
4 -1 1 5632 ultralytics.nn.modules.conv.DWConv [512, 512, 3, 2, 1, False]
5 -1 6 1695360 ultralytics.nn.modules.block.HGBlock [512, 192, 1024, 5, 6, True, False]
6 -1 6 2055808 ultralytics.nn.modules.block.HGBlock [1024, 192, 1024, 5, 6, True, True]
7 -1 6 2055808 ultralytics.nn.modules.block.HGBlock [1024, 192, 1024, 5, 6, True, True]
8 -1 1 11264 ultralytics.nn.modules.conv.DWConv [1024, 1024, 3, 2, 1, False]
9 -1 6 6708480 ultralytics.nn.modules.block.HGBlock [1024, 384, 2048, 5, 6, True, False]
10 -1 1 524800 ultralytics.nn.modules.conv.Conv [2048, 256, 1, 1, None, 1, 1, False]
11 -1 1 789760 ultralytics.nn.modules.transformer.AIFI [256, 1024, 8]
12 -1 1 66048 ultralytics.nn.modules.conv.Conv [256, 256, 1, 1]
13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
14 7 1 262656 ultralytics.nn.modules.conv.Conv [1024, 256, 1, 1, None, 1, 1, False]
15 [-2, -1] 1 0 ultralytics.nn.modules.conv.Concat [1]
16 -1 3 2232320 ultralytics.nn.modules.block.RepC3 [512, 256, 3]
17 -1 1 66048 ultralytics.nn.modules.conv.Conv [256, 256, 1, 1]
18 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
19 3 1 131584 ultralytics.nn.modules.conv.Conv [512, 256, 1, 1, None, 1, 1, False]
20 [-2, -1] 1 0 ultralytics.nn.modules.conv.Concat [1]
21 -1 3 2232320 ultralytics.nn.modules.block.RepC3 [512, 256, 3]
22 -1 1 590336 ultralytics.nn.modules.conv.Conv [256, 256, 3, 2]
23 [-1, 17] 1 0 ultralytics.nn.modules.conv.Concat [1]
24 -1 3 2232320 ultralytics.nn.modules.block.RepC3 [512, 256, 3]
25 -1 1 590336 ultralytics.nn.modules.conv.Conv [256, 256, 3, 2]
26 [-1, 12] 1 0 ultralytics.nn.modules.conv.Concat [1]
27 -1 3 2232320 ultralytics.nn.modules.block.RepC3 [512, 256, 3]
28 [21, 24, 27] 1 7390217 ultralytics.nn.modules.head.RTDETRDecoder [43, [256, 256, 256]]
rt-detr-l summary: 673 layers, 32894441 parameters, 32894441 gradients
Transferred 941/941 items from pretrained weights
TensorBoard: Start with 'tensorboard --logdir runs/detect/train5', view at http://localhost:6006/
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/ultralytics/data/base.py in get_img_files(self, img_path)
117 # self.img_files = sorted([x for x in f if x.suffix[1:].lower() in IMG_FORMATS]) # pathlib
--> 118 assert im_files, f'{self.prefix}No images found in {img_path}'
119 except Exception as e:
AssertionError: train: No images found in /content/militaryaircraftdetectiondataset/data/train
The above exception was the direct cause of the following exception:
FileNotFoundError Traceback (most recent call last)
10 frames
/usr/local/lib/python3.10/dist-packages/ultralytics/data/base.py in get_img_files(self, img_path)
118 assert im_files, f'{self.prefix}No images found in {img_path}'
119 except Exception as e:
--> 120 raise FileNotFoundError(f'{self.prefix}Error loading data from {img_path}\n{HELP_URL}') from e
121 if self.fraction < 1:
122 im_files = im_files[:round(len(im_files) * self.fraction)]
FileNotFoundError: train: Error loading data from /content/militaryaircraftdetectiondataset/data/train
See https://docs.ultralytics.com/datasets/detect for dataset formatting guidance.
I waited for the model to start training