YOLOR -自己踩得坑
代码地址:https://github.com/WongKinYiu/yolor
- 跑通 YOLOR-main
1.数据集: PASCAL VOC
数据集部分:我的是一开始就是YOLO格式,但是这个项目需要labels和图片放在同一个文件夹中,
或者自己改一下代码部,更改地址: utils -> datasets.py 文件中(373行)
sa, sb = os.sep + 'images' + os.sep, os.sep + 'labels' + os.sep # /images/, /labels/ substrings
return [x.replace(sa, sb, 1).replace(x.split('.')[-1], 'txt') for x in img_paths]
- 自己需要在wandb.id中注册一个账号,训练一开始需要输入自己的
wandb_id
- 我遇到的各种报错如下(搞了一天了我都忘记了):
- can’t convert cuda:0 device type tensor to numpy when using distributed gpu with large batch size
*解决办法
:注释掉 test.py 中以下这一块代码
# Plot images
if plots and batch_i < 3:
f = save_dir / f'test_batch{batch_i}_labels.jpg' # filename
plot_images(img, targets, paths, f, names) # labels
f = save_dir / f'test_batch{batch_i}_pred.jpg'
plot_images(img, output_to_target(output, width, height), paths, f, names) # predictions
- Images sizes do not match. This will causes images to be display incorrectly
- FileNotFoundError: [Errno 2] No such file or directory: ‘r’
- FileNotFoundError: [Errno 2] No such file or directory: ‘y’
- FileNotFoundError: [Errno 2] No such file or directory: ‘h’
*解决办法
:更改 test.py 中代码
try:
ckpt = torch.load(weights, map_location=device) # load checkpoint 更改weights[0] 保存的模型文件。
ckpt['model'] = {k: v for k, v in ckpt['model'].items() if model.state_dict()[k].numel() == v.numel()}
model.load_state_dict(ckpt['model'], strict=False)
except:
print('11', weights)
load_darknet_weights(model, weights) # 更改weights[0] 解析并加载存储在'weights'中的权重
imgsz = check_img_size(imgsz, s=64) # check img_size
- 因为权重文件有两种—— “.pt” 和 “.weights"结尾的,以”.pt"结尾的文件需要用 torch.load()来读取,以 ".weights"结尾的文件需要用 load_darknet_weights()来读取.
- finetuning时候报错如下:
File "train.py", line 545, in <module>
train(hyp, opt, device, tb_writer, wandb)
File "train.py", line 404, in train
'wandb_id': wandb_run.id if wandb else None}
*解决办法
: 在 train.py 我就自己手动加上 wandb_id, 更改如下:
ckpt = {'epoch': epoch,
'best_fitness': best_fitness,
'best_fitness_p': best_fitness_p,
'best_fitness_r': best_fitness_r,
'best_fitness_ap50': best_fitness_ap50,
'best_fitness_ap': best_fitness_ap,
'best_fitness_f': best_fitness_f,
'training_results': f.read(),
'model': ema.ema.module.state_dict() if hasattr(ema, 'module') else ema.ema.state_dict(),
'optimizer': None if final_epoch else optimizer.state_dict(),
'wandb_id': 'f4c0d9a5c52db44ec548217c0c0bbaa********' # 这里写上自己的wadb id
# 'wandb_id': wandb_run.id if wandb else None # 这里我注释掉了
}
- 报错wandb没有初始化,在test.py 文件一开始加上以下代码:
import wandb
wandb.init()