解决YOLOV5 用自己的数据训练,手写预测代码实现效果差

YOLOV5的小细节,天坑!

 最近想用做了一个demo,测无人机航拍数据,首先在官网下载好YOLOV5模型:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite 

        我使用的是v6.0版本,训练时按照Readme 来就可以,改一些参数和配置,训练时没什么问题,最终得到了训练好的pt文件。但项目需要将训练好的pt文件转换为onnx、caffemodel。该版本的yolov5支持.pt转为.onnx,但由于caffemodel的转换过程中不支持5维的shape,故需要在源代码中进行修改。将models/yolo.py文件进行修改,主要操作是把reshape为5维的操作和后续的画grid去掉,将其作为后处理。

        得到onnx文件后,进行Onnx文件的前向推理,由于网络结构变了,所以需要自己写后处理,主要是加上yolo.py去掉的部分和nms等。没想到得到的效果很差!!找了好几天的错,尝试了重新写推理文件,重新转换onnx等等都没得到好的结果。

        后经过我老师大神的指导,原来是在训练过程,train.py的参数配置上有一个参数

 该参数的含义是自动调整anchor大小,一般来说,我们训练用的是coco的anchor,由于该anchor的适应性很强,几乎能用在所有的数据中,平时也就不需要修改,但本数据为航拍数据,anchor需要很小,所以训练时自动调整了大小。通过Debug,得到网络层的最后一层为detect,     利用model.model.model[-1]得到

然后再利用model.model.model[-1],anchor_grid得到该detect的anchor。

 可以看到anchor的大小不再是coco定义好的大小,故再进行后续操作时,填写anchor大小一定记  得改!!!

坑!!!!

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个基础的YOLOv5训练代码示例: ```python import torch from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor from models.experimental import attempt_load from utils.general import check_dataset, check_file, check_img_size # 设置设备 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 数据集路径 data_path = "path/to/dataset" # 检查数据集是否合法 check_dataset(data_path) # 加载数据集 dataset = datasets.ImageFolder(data_path, transform=ToTensor()) dataloader = DataLoader(dataset, batch_size=8, shuffle=True) # 加载模型配置文件和权重文件 model_cfg = "path/to/model.yaml" model_weights = "path/to/weights.pt" # 检查配置文件和权重文件是否存在 check_file(model_cfg) check_file(model_weights) # 加载模型 model = attempt_load(model_cfg, model_weights, device) # 设置图片尺寸 img_size = check_img_size(640) # 设置优化器 optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) # 设置损失函数 criterion = torch.nn.CrossEntropyLoss() # 训练循环 num_epochs = 10 for epoch in range(num_epochs): for batch, (images, labels) in enumerate(dataloader): # 将数据移动到设备 images = images.to(device) labels = labels.to(device) # 前向传播 outputs = model(images) # 计算损失 loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 输出训练信息 if batch % 10 == 0: print(f"Epoch {epoch+1}/{num_epochs}, Batch {batch+1}/{len(dataloader)}, Loss: {loss.item()}") ``` 在上述代码中,我们首先设置了设备(CPU或GPU),然后加载数据集和模型。接下来,我们设置优化器和损失函数,并进行训练循环。在每个批次中,我们将数据移动到设备上,执行前向传播、计算损失、反向传播和优化,并输出训练信息。 请注意,这只是一个基础的YOLOv5训练代码示例,实际使用时可能需要根据具体的数据集、模型和训练需求进行相应的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值