基于yolov5 无人机检测包含:数据集➕训练好的代码模型训练了300轮 效果看下图 map97%以上

基于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脚本对测试集中的图像进行检测,并绘制边界框以查看检测效果。
使用说明
  1. 下载并安装依赖库

    pip install -r requirements.txt
  2. 准备数据集

    • 将图像和标注文件分别放在data/images/data/labels/目录下。
    • 修改data/data.yaml文件中的路径以匹配你的数据集位置。
  3. 训练模型

    python train.py
  4. 检测图像

    python detect.py --source path_to_your_test_images
  5. 评估模型

    • 可以使用YOLOv5自带的评估脚本进行评估:
      python val.py --weights runs/train/exp/weights/best.pt --data data/data.yaml --img 640
注意事项
  • 数据增强:可以通过调整数据增强策略来进一步提高模型性能。
  • 超参数调整:根据实际情况调整学习率、批大小等超参数。
  • 硬件要求:建议使用GPU进行训练,以加快训练速度。

通过上述步骤,你可以成功地使用YOLOv5进行无人机目标检测,并获得高精度的检测结果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值