基于yolov5 无人机检测包含:数据集➕训练好的代码模型训练了300轮 效果看下图 map97%以上
基于YOLOv5的无人机检测项目
项目名称
基于YOLOv5的无人机检测 (Drone Detection with YOLOv5)
项目概述
该项目使用YOLOv5模型进行无人机目标检测。数据集包含大量带有标注的无人机图像,经过300轮训练后,模型在验证集上的mAP达到了97%以上。
数据集
- 图像数量:具体数量未明确给出,但通常包含数千张图像。
- 类别:单一类别——无人机 (drone)。
- 标注格式:支持YOLO适用的txt格式和VOC适用的xml格式。
- 图像特点:
- 多样化的背景和环境条件。
- 不同角度、距离和光照条件下的无人机图像。
- 高分辨率图像,有助于识别细小的目标特征。
项目结构
drone_detection_yolov5/
├── data/
│ ├── images/
│ │ ├── train/
│ │ ├── val/
│ │ └── test/
│ ├── labels/
│ │ ├── train/
│ │ ├── val/
│ │ └── test/
│ └── data.yaml
├── models/
│ └── yolov5s.pt
├── utils/
│ ├── datasets.py
│ ├── general.py
│ ├── plots.py
│ └── torch_utils.py
├── train.py
├── detect.py
├── requirements.txt
└── README.md
数据集介绍
-
数据集目录:
data/images/
:包含训练、验证和测试图像。data/labels/
:包含相应的标注文件(txt或xml格式)。
-
数据配置文件 (
data/data.yaml
):train: path_to_your_train_images val: path_to_your_val_images test: path_to_your_test_images nc: 1 names: ['drone']
训练代码
-
依赖库安装:
pip install -r requirements.txt
requirements.txt
文件内容示例:torch==1.10.0 torchvision==0.11.1 pandas==1.3.4 cv2 albumentations==1.1.0 pycocotools
-
训练脚本 (
train.py
):# 导入必要的库 from models.experimental import attempt_load from utils.datasets import create_dataloader from utils.general import check_img_size, non_max_suppression, scale_coords, xyxy2xywh, strip_optimizer from utils.torch_utils import select_device, time_synchronized from utils.metrics import bbox_iou from utils.plots import plot_results import torch import yaml import os # 设置超参数 hyp = { 'lr0': 0.01, # 初始学习率 'momentum': 0.937, # 动量 'weight_decay': 5e-4, # 权重衰减 'warmup_epochs': 3.0, # 热身轮数 'warmup_momentum': 0.8, # 热身动量 'warmup_bias_lr': 0.1 # 热身偏置学习率 } # 加载数据配置文件 with open('data/data.yaml', 'r') as f: data = yaml.safe_load(f) # 定义训练函数 def train(data, weights, batch_size, epochs, imgsz, device): # 创建数据加载器 dataloader, dataset = create_dataloader(data['train'], imgsz, batch_size, 32, workers=8, cache=True) # 加载预训练模型 model = attempt_load(weights, map_location=device) model.to(device).train() # 定义优化器 optimizer = torch.optim.SGD(model.parameters(), lr=hyp['lr0'], momentum=hyp['momentum'], weight_decay=hyp['weight_decay']) # 开始训练 for epoch in range(epochs): print(f'Epoch {epoch + 1}/{epochs}') for i, (imgs, targets, paths, _) in enumerate(dataloader): imgs = imgs.to(device).float() / 255.0 # 归一化 targets = targets.to(device) # 前向传播 pred = model(imgs) # 计算损失 loss, _ = compute_loss(pred, targets, model) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() # 打印训练信息 if i % 10 == 0: print(f'Batch {i}/{len(dataloader)}, Loss: {loss.item():.4f}') # 保存最终模型 torch.save(model.state_dict(), 'runs/train/exp/weights/best.pt') if __name__ == '__main__': # 训练参数 weights = 'models/yolov5s.pt' batch_size = 16 epochs = 300 imgsz = 640 device = select_device('0') # 开始训练 train(data, weights, batch_size, epochs, imgsz, device)
-
检测脚本 (
detect.py
):# 导入必要的库 from models.experimental import attempt_load from utils.datasets import LoadImages from utils.general import non_max_suppression, scale_coords, xyxy2xywh, strip_optimizer from utils.torch_utils import select_device, time_synchronized import torch import cv2 import numpy as np import argparse # 定义检测函数 def detect(source, weights, imgsz, device): # 加载模型 model = attempt_load(weights, map_location=device) model.to(device).eval() # 创建数据加载器 dataset = LoadImages(source, img_size=imgsz) # 开始检测 for path, img, im0s, vid_cap in dataset: img = torch.from_numpy(img).to(device) img = img.float() # uint8 to fp16/32 img /= 255.0 # 0 - 255 to 0.0 - 1.0 if img.ndimension() == 3: img = img.unsqueeze(0) # 推理 with torch.no_grad(): t1 = time_synchronized() pred = model(img)[0] t2 = time_synchronized() # NMS pred = non_max_suppression(pred, 0.4, 0.5, classes=None, agnostic=False) # 处理检测结果 for i, det in enumerate(pred): # detections per image p, s, im0 = path, '', im0s if len(det): # 将框从img_size重新缩放到im0大小 det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() # 绘制边界框 for *xyxy, conf, cls in reversed(det): label = f'{names[int(cls)]} {conf:.2f}' plot_one_box(xyxy, im0, label=label, color=(0, 255, 0), line_thickness=3) # 显示结果 cv2.imshow(p, im0) cv2.waitKey(0) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--source', type=str, default='data/images/test', help='source') parser.add_argument('--weights', type=str, default='runs/train/exp/weights/best.pt', help='model.pt path(s)') parser.add_argument('--imgsz', type=int, default=640, help='inference size (pixels)') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') opt = parser.parse_args() # 检测 detect(opt.source, opt.weights, opt.imgsz, opt.device)
训练效果
- mAP:在验证集上达到97%以上。
- 可视化结果:可以使用
detect.py
脚本对测试集中的图像进行检测,并绘制边界框以查看检测效果。
使用说明
-
下载并安装依赖库:
pip install -r requirements.txt
-
准备数据集:
- 将图像和标注文件分别放在
data/images/
和data/labels/
目录下。 - 修改
data/data.yaml
文件中的路径以匹配你的数据集位置。
- 将图像和标注文件分别放在
-
训练模型:
python train.py
-
检测图像:
python detect.py --source path_to_your_test_images
-
评估模型:
- 可以使用YOLOv5自带的评估脚本进行评估:
python val.py --weights runs/train/exp/weights/best.pt --data data/data.yaml --img 640
- 可以使用YOLOv5自带的评估脚本进行评估:
注意事项
- 数据增强:可以通过调整数据增强策略来进一步提高模型性能。
- 超参数调整:根据实际情况调整学习率、批大小等超参数。
- 硬件要求:建议使用GPU进行训练,以加快训练速度。
通过上述步骤,你可以成功地使用YOLOv5进行无人机目标检测,并获得高精度的检测结果。