YOLO航拍车辆和行人识别

YOLO航拍车辆和行人识别
图片数量9695,标注为xml和txt格式;
class:car,pedestrian,truck,bus



用于yolo,Python,目标检测,机器学习,人工智能,深度学习,车辆识别,公交车识别,货车识别,行人识别,无人机航拍识别

 

数据集名称

YOLO航拍车辆和行人识别数据集

数据集描述

该数据集是一个专门用于训练和评估基于YOLO(You Only Look Once)架构的目标检测模型的数据集,旨在帮助研究人员和开发者在无人机航拍图像中识别车辆(包括轿车、卡车、公交车)和行人。数据集包含9695张高质量的航拍图片,并提供了详细的边界框标注信息,支持直接用于训练目标检测模型。通过高质量的数据和详细的标注信息,该数据集为开发高效且准确的目标检测系统提供了坚实的基础。

数据规模

  • 总样本数量:9695张图片
  • 标注格式
    • Pascal VOC XML格式
    • YOLO txt格式

图像特性

  • 多样化场景:覆盖了多种城市和乡村环境下的航拍图像,包括不同的天气条件、光照条件和背景。
  • 高质量手工标注:每张图像都有详细的边界框标注,支持直接用于训练目标检测模型。
  • 多类别支持:主要关注四类目标:car(轿车)、pedestrian(行人)、truck(卡车)、bus(公交车)。
  • 无需预处理:数据集已经过处理,可以直接用于训练,无需额外的数据预处理步骤。

应用场景

  • 智能监控:自动检测航拍图像中的车辆和行人,辅助管理人员进行交通监控和管理。
  • 无人机应用:集成到无人机系统中,实现对地面目标的实时检测和跟踪。
  • 科研分析:用于研究目标检测算法在特定应用场景中的表现,特别是在复杂背景和高视角条件下的鲁棒性。
  • 教育与培训:可用于安全相关的教育和培训项目,帮助学生和从业人员更好地理解航拍图像中的目标检测技术。
  • 自动化管理:集成到智能交通管理系统中,实现对道路状况的自动化监测和管理。

数据集结构

典型的数据集目录结构如下:

 
1aerial_vehicle_pedestrian_dataset/
2├── images/
3│   ├── img_00001.jpg
4│   ├── img_00002.jpg
5│   └── ...
6├── annotations/
7│   ├── img_00001.xml  # Pascal VOC XML格式
8│   ├── img_00002.xml
9│   └── ...
10├── labels/  # YOLO txt格式
11│   ├── img_00001.txt
12│   ├── img_00002.txt
13│   └── ...
14├── scripts/
15│   ├── convert_voc_to_yolo.py
16│   ├── train_yolo.py
17│   ├── evaluate_yolo.py
18│   ├── visualize_annotations.py
19│   └── data_augmentation.py
20├── README.txt  # 数据说明文件

数据说明

  • 检测目标:以Pascal VOC XML格式和YOLO txt格式进行标注。
  • 数据集内容
    • 总共9695张图片,每张图片都带有相应的XML和txt标注文件。
  • 标签类型
    • 边界框 (Bounding Box)
  • 数据增广:数据集未做数据增广,用户可以根据需要自行进行数据增广。
  • 无需预处理:数据集已经过处理,可以直接用于训练,无需额外的数据预处理步骤。

示例代码

以下是一些常用脚本的示例代码,包括将VOC格式转换为YOLO格式、训练YOLO模型、评估模型性能、可视化标注以及数据增强。

脚本1: 将VOC格式转换为YOLO格式
1# convert_voc_to_yolo.py
2import os
3import xml.etree.ElementTree as ET
4
5def convert_voc_to_yolo(xml_file, image_size):
6    tree = ET.parse(xml_file)
7    root = tree.getroot()
8    yolo_lines = []
9
10    for obj in root.findall('object'):
11        name = obj.find('name').text
12        bbox = obj.find('bndbox')
13        xmin = int(bbox.find('xmin').text)
14        ymin = int(bbox.find('ymin').text)
15        xmax = int(bbox.find('xmax').text)
16        ymax = int(bbox.find('ymax').text)
17
18        x_center = (xmin + xmax) / 2.0 / image_size[0]
19        y_center = (ymin + ymax) / 2.0 / image_size[1]
20        width = (xmax - xmin) / image_size[0]
21        height = (ymax - ymin) / image_size[1]
22
23        class_id = 0 if name == 'car' else 1 if name == 'pedestrian' else 2 if name == 'truck' else 3  # 假设只有四个类别
24        yolo_line = f"{class_id} {x_center} {y_center} {width} {height}\n"
25        yolo_lines.append(yolo_line)
26
27    return yolo_lines
28
29def main():
30    voc_dir = 'path/to/annotations'
31    yolo_dir = 'path/to/labels'
32    image_dir = 'path/to/images'
33
34    if not os.path.exists(yolo_dir):
35        os.makedirs(yolo_dir)
36
37    for xml_file in os.listdir(voc_dir):
38        if xml_file.endswith('.xml'):
39            image_path = os.path.join(image_dir, xml_file.replace('.xml', '.jpg'))
40            image = Image.open(image_path)
41            image_size = image.size
42
43            yolo_lines = convert_voc_to_yolo(os.path.join(voc_dir, xml_file), image_size)
44            with open(os.path.join(yolo_dir, xml_file.replace('.xml', '.txt')), 'w') as f:
45                f.writelines(yolo_lines)
46
47if __name__ == "__main__":
48    main()
脚本2: 训练YOLO模型
1# train_yolo.py
2import os
3import torch
4from yolov5 import train
5
6def main():
7    data_yaml = 'path/to/data.yaml'  # 包含数据集路径和类别的配置文件
8    model_yaml = 'path/to/model.yaml'  # 模型配置文件
9    weights = 'path/to/weights.pt'  # 预训练权重(可选)
10    epochs = 100
11    batch_size = 8
12    img_size = 640
13
14    train.run(
15        data=data_yaml,
16        cfg=model_yaml,
17        weights=weights,
18        epochs=epochs,
19        batch_size=batch_size,
20        imgsz=img_size
21    )
22
23if __name__ == "__main__":
24    main()
脚本3: 评估YOLO模型
 
1# evaluate_yolo.py
2import os
3import torch
4from yolov5 import val
5
6def main():
7    data_yaml = 'path/to/data.yaml'  # 包含数据集路径和类别的配置文件
8    weights = 'path/to/best.pt'  # 训练好的模型权重
9    img_size = 640
10
11    val.run(
12        data=data_yaml,
13        weights=weights,
14        imgsz=img_size
15    )
16
17if __name__ == "__main__":
18    main()
脚本4: 可视化标注
1# visualize_annotations.py
2import os
3import cv2
4import numpy as np
5from PIL import Image
6import xml.etree.ElementTree as ET
7
8def load_image_and_boxes(image_path, annotation_path):
9    # 读取图像
10    image = Image.open(image_path).convert('RGB')
11    
12    # 解析Pascal VOC格式的XML标注文件
13    tree = ET.parse(annotation_path)
14    root = tree.getroot()
15    boxes = []
16    for obj in root.findall('object'):
17        class_name = obj.find('name').text
18        bbox = obj.find('bndbox')
19        xmin = int(bbox.find('xmin').text)
20        ymin = int(bbox.find('ymin').text)
21        xmax = int(bbox.find('xmax').text)
22        ymax = int(bbox.find('ymax').text)
23        boxes.append([class_name, xmin, ymin, xmax, ymax])
24    
25    return image, boxes
26
27def show_image_with_boxes(image, boxes):
28    img = np.array(image)
29    for box in boxes:
30        class_name, xmin, ymin, xmax, ymax = box
31        cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
32        label = f'{class_name}'
33        cv2.putText(img, label, (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
34    
35    cv2.imshow('Image with Boxes', img)
36    cv2.waitKey(0)
37    cv2.destroyAllWindows()
38
39def main():
40    images_dir = 'path/to/images'
41    annotations_dir = 'path/to/annotations'
42    
43    # 获取图像列表
44    image_files = [f for f in os.listdir(images_dir) if f.endswith('.jpg')]
45    
46    # 随机选择一张图像
47    selected_image = np.random.choice(image_files)
48    image_path = os.path.join(images_dir, selected_image)
49    annotation_path = os.path.join(annotations_dir, selected_image.replace('.jpg', '.xml'))
50    
51    # 加载图像和边界框
52    image, boxes = load_image_and_boxes(image_path, annotation_path)
53    
54    # 展示带有边界框的图像
55    show_image_with_boxes(image, boxes)
56
57if __name__ == "__main__":
58    main()
脚本5: 数据增强
1# data_augmentation.py
2import os
3import cv2
4import numpy as np
5import albumentations as A
6from PIL import Image
7import xml.etree.ElementTree as ET
8
9def load_image_and_boxes(image_path, annotation_path):
10    # 读取图像
11    image = Image.open(image_path).convert('RGB')
12    image = np.array(image)
13    
14    # 解析Pascal VOC格式的XML标注文件
15    tree = ET.parse(annotation_path)
16    root = tree.getroot()
17    boxes = []
18    for obj in root.findall('object'):
19        class_name = obj.find('name').text
20        bbox = obj.find('bndbox')
21        xmin = int(bbox.find('xmin').text)
22        ymin = int(bbox.find('ymin').text)
23        xmax = int(bbox.find('xmax').text)
24        ymax = int(bbox.find('ymax').text)
25        boxes.append([xmin, ymin, xmax, ymax, class_name])
26    
27    return image, boxes
28
29def save_augmented_data(augmented_image, augmented_boxes, output_image_path, output_annotation_path):
30    # 保存增强后的图像
31    augmented_image = Image.fromarray(augmented_image)
32    augmented_image.save(output_image_path)
33    
34    # 保存增强后的标注
35    tree = ET.parse(output_annotation_path)
36    root = tree.getroot()
37    for obj, new_box in zip(root.findall('object'), augmented_boxes):
38        bbox = obj.find('bndbox')
39        bbox.find('xmin').text = str(new_box[0])
40        bbox.find('ymin').text = str(new_box[1])
41        bbox.find('xmax').text = str(new_box[2])
42        bbox.find('ymax').text = str(new_box[3])
43    
44    tree.write(output_annotation_path)
45
46def augment_data(image, boxes):
47    transform = A.Compose([
48        A.RandomRotate90(p=0.5),
49        A.HorizontalFlip(p=0.5),
50        A.VerticalFlip(p=0.5),
51        A.RandomBrightnessContrast(p=0.2),
52        A.HueSaturationValue(p=0.2)
53    ], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category_ids']))
54
55    category_ids = [box[-1] for box in boxes]
56    bboxes = [box[:-1] for box in boxes]
57    
58    transformed = transform(image=image, bboxes=bboxes, category_ids=category_ids)
59    transformed_image = transformed['image']
60    transformed_bboxes = transformed['bboxes']
61    
62    return transformed_image, transformed_bboxes
63
64def main():
65    images_dir = 'path/to/images'
66    annotations_dir = 'path/to/annotations'
67    output_images_dir = 'path/to/augmented_images'
68    output_annotations_dir = 'path/to/augmented_annotations'
69    
70    if not os.path.exists(output_images_dir):
71        os.makedirs(output_images_dir)
72    
73    if not os.path.exists(output_annotations_dir):
74        os.makedirs(output_annotations_dir)
75    
76    # 获取图像列表
77    image_files = [f for f in os.listdir(images_dir) if f.endswith('.jpg')]
78    
79    for image_file in image_files:
80        image_path = os.path.join(images_dir, image_file)
81        annotation_path = os.path.join(annotations_dir, image_file.replace('.jpg', '.xml'))
82        
83        # 加载图像和边界框
84        image, boxes = load_image_and_boxes(image_path, annotation_path)
85        
86        # 增强数据
87        augmented_image, augmented_boxes = augment_data(image, boxes)
88        
89        # 保存增强后的数据
90        output_image_path = os.path.join(output_images_dir, image_file)
91        output_annotation_path = os.path.join(output_annotations_dir, image_file.replace('.jpg', '.xml'))
92        save_augmented_data(augmented_image, augmented_boxes, output_image_path, output_annotation_path)
93
94if __name__ == "__main__":
95    main()

项目介绍

项目名称

基于YOLO的航拍车辆和行人识别系统

项目描述

该项目旨在开发一个基于YOLO架构的航拍图像中的车辆和行人识别系统。通过使用上述数据集,我们将训练一个高效的深度学习模型,能够在无人机拍摄的高分辨率图像中实时检测并分类轿车、行人、卡车和公交车。项目的主要目标是提高交通管理和城市规划的效率,同时为无人机应用提供强大的视觉感知能力。

项目目标

  • 实时检测:实现对航拍图像中车辆和行人的实时检测。
  • 高精度分类:能够准确地区分不同类型的车辆(轿车、卡车、公交车)和行人。
  • 鲁棒性:在不同天气条件、光照条件和背景下保持良好的检测性能。
  • 易用性:提供易于部署和使用的接口,方便集成到现有的无人机系统中。

项目结构

1aerial_vehicle_pedestrian_detection_project/
2├── data/
3│   ├── aerial_vehicle_pedestrian_dataset/
4│   │   ├── images/
5│   │   ├── annotations/
6│   │   ├── labels/
7│   │   ├── scripts/
8│   │   └── README.txt
9├── models/
10│   ├── yolov5s.pt  # 预训练模型
11│   ├── best.pt  # 最佳训练模型
12├── config/
13│   ├── data.yaml  # 数据集配置文件
14│   ├── model.yaml  # 模型配置文件
15├── scripts/
16│   ├── convert_voc_to_yolo.py
17│   ├── train_yolo.py
18│   ├── evaluate_yolo.py
19│   ├── visualize_annotations.py
20│   ├── data_augmentation.py
21│   ├── inference.py  # 推理脚本
22├── notebooks/
23│   ├── data_exploration.ipynb  # 数据探索笔记本
24│   ├── model_training.ipynb  # 模型训练笔记本
25│   ├── model_evaluation.ipynb  # 模型评估笔记本
26├── requirements.txt  # 依赖库
27└── README.md  # 项目说明文件

项目流程

  1. 数据准备

    • 下载并解压数据集。
    • 使用convert_voc_to_yolo.py脚本将VOC格式的标注转换为YOLO格式。
  2. 数据探索

    • 使用data_exploration.ipynb笔记本探索数据集,了解数据分布和质量。
  3. 数据增强

    • 使用data_augmentation.py脚本对数据进行增强,增加数据多样性。
  4. 模型训练

    • 使用train_yolo.py脚本训练YOLO模型。
    • 根据需要调整超参数和模型配置。
  5. 模型评估

    • 使用evaluate_yolo.py脚本评估模型性能。
    • 生成混淆矩阵和分类报告。
  6. 推理和应用

    • 使用inference.py脚本进行实时检测和分类。
    • 将模型集成到无人机系统或其他应用中。
  7. 结果可视化

    • 使用visualize_annotations.py脚本可视化检测结果。

改进方向

如果您已经使用上述方法对该数据集进行了训练,并且认为还有改进空间,以下是一些可能的改进方向:

  1. 数据增强

    • 进一步增加数据增强策略,例如旋转、翻转、缩放、颜色抖动等,以提高模型的泛化能力。
    • 使用混合增强技术,如MixUp、CutMix等,以增加数据多样性。
  2. 模型优化

    • 调整模型超参数,例如学习率、批量大小、优化器等,以找到最佳配置。
    • 尝试使用不同的骨干网络(Backbone),例如EfficientNet、ResNet等,以提高特征提取能力。
    • 引入注意力机制,如SENet、CBAM等,以增强模型对关键区域的关注。
  3. 损失函数

    • 尝试使用不同的损失函数,例如Focal Loss、IoU Loss等,以改善模型的收敛性能。
    • 结合多种损失函数,例如分类损失和回归损失的组合,以平衡不同类型的任务。
  4. 后处理

    • 使用非极大值抑制(NMS)的改进版本,如Soft-NMS、DIoU-NMS等,以提高检测结果的质量。
    • 引入边界框回归的改进方法,如GIoU、CIoU等,以提高定位精度。
  5. 迁移学习

    • 使用预训练模型进行微调,利用大规模数据集(如COCO、ImageNet)上的预训练权重,加快收敛速度并提高性能。
  6. 集成学习

    • 使用多个模型进行集成学习,通过投票或加权平均的方式提高最终的检测效果。

通过上述方法,可以进一步提升模型在航拍车辆和行人识别任务上的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542863.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 热题 100 回顾18

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

洛谷P5740——结构体运用

简单的结构体&#xff0c;但是要注意这个排序还有求和重复 时的特判 AC代码附在后面 #include<bits/stdc.h> using namespace std; struct Node{string name;int a,b,c,sum;//语文&#xff0c;数学&#xff0c;英语 }node[1000]; bool cmp(Node a,Node b){return a.sum…

三端全隔离压接端子485中继器磁耦隔离数据双向透传工业级2口信号放大器抗干扰防雷

美思联压接端子485中继器磁耦隔离工业级2口信号放大器抗干扰防雷https://item.taobao.com/item.htm?ftt&id736247434823 MS-H312S是一款专为工业自动化通信而生解决RS-485总线星型结构组网&#xff0c;解决复杂电磁场环境下RS-485大系统要求而设计的RS-485总线分割集线器(…

分布式网络存储技术是什么?分布式存储技术有哪些

分布式储存是指将数据分散存储在多个节点上的一种技术。但是你们知道分布式网络存储技术是什么&#xff1f;相比传统的集中式存储&#xff0c;分布式储存具有更高的可靠性和可用性。分布式网络存储是一种将数据分散存储在多个节点或服务器上的架构。 分布式网络存储技术是什么&…

【算法与数据结构复习】| 快速排序

今天刷力扣215.数组中第K个最大元素&#xff0c;题目要求用时间复杂度O(n)。因此跟着左程云算法课23复习了随机快速排序。 随机快速排序的核心思想就是在数组中随机选一个值x&#xff0c;把<x的值移到左边&#xff0c;>x的值移动到右边。x这个值必须在左边区间的最左边&a…

Java笔试面试题AI答之设计模式(3)

文章目录 11. Spring开发中的哪里使用了工厂设计模式 &#xff1f;1. BeanFactory2. 工厂方法模式3. 抽象工厂模式4. 示例说明总结 12. 什么是代理模式 &#xff1f;13. 请列举代理模式的应用场景 &#xff1f;14. 什么是原型模式 &#xff1f;15. 请简述Java中原型模式的使用方…

stm32 外部中断

1.每个IO都可以配置外部中断&#xff0c;中断的出发方式有上升沿、下降沿、双边沿。这个是在EXTI里配置。 2.所有IO总共分成了16组&#xff0c;&#xff08;PA0,PB0…&#xff09;、&#xff08;PA1,PB1…&#xff09;、&#xff08;PA2,PB2…&#xff09;,…,&#xff08;PA15…

【Proteus仿真】基于51单片机的电机调速和速度实时显示

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;可采用按键对电机进行方向的调控和速度的加减&#xff0c;并通过DAC0832设置放大电路进行对电机的设置&#xff0c;通过四位数码管显示电机转向和速度&#xff0c;非常精…

LLMs之PE:AI for Grant Writing的简介、使用方法、案例应用之详细攻略

LLMs之PE&#xff1a;AI for Grant Writing的简介、使用方法、案例应用之详细攻略 目录 AI for Grant Writing的简介 AI for Grant Writing的使用方法—提示资源 1、提示集合 2、提示工程 3、快速提示 为了提高文本清晰度 为了让文本更有吸引力 为了改进文本的结构和流…

变压器设备漏油数据集 voc txt

变压器设备漏油数据集 油浸式变压器通常采用油浸自冷式、油浸风冷式和强迫油循环三种冷却方式。该数据集采集于油浸式变压器的设备漏油情况&#xff0c;一般用于变电站的无人巡检&#xff0c;代替传统的人工巡检&#xff0c;与绝缘子的破损检测来源于同一课题。数据集一部分来自…

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff0c;其中每个节点都 恰有一条 出边。 图…

hCaptcha 图像识别 API 对接说明

本文将介绍一种 hCaptcha 图像识别 API 对接说明&#xff0c;它可以通过用户输入识别的内容和 hCaptcha验证码图像&#xff0c;最后返回需要点击的小图像的坐标&#xff0c;完成验证。 接下来介绍下 hCaptcha 图像识别 API 的对接说明。 申请流程 要使用 API&#xff0c;需要…

使用思科搭建企业网规划训练,让网络全部互通,使用规则提高工作效率。

1. 企业背景&#xff1a; 某企业分为销售部、行政部、人力资源部、财务部、业务部、接待中心等主要六个部门&#xff1b;配置网管中心&#xff0c;允许网络管理员登录企业交换机和路由器对企业网络进行管理&#xff1b;配置服务器集群&#xff0c;设置FTP、DNS、WEB服务器&am…

泛微开发修炼之旅--44用友U9与ecology对接方案及源码

文章链接&#xff1a;44用友U9与ecology对接方案及源码

蓝桥杯算法之暴力

暴力 1.十进制数转换成罗马数字 2.判断给出的罗马数字是否正确 小知识 %&#xff08;模除&#xff09;&#xff1a; % 符号用作模除&#xff08;或取模&#xff09;运算符。模除运算是一种数学运算&#xff0c;它返回两个数相除的余数。 具体来说&#xff0c;如果 a 和 b 是…

分布式系统的CAP原理

CAP 理论的起源 CAP 理论起源于 2000 年&#xff0c;由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP 定理又被称作布鲁尔定理&#xff08;Brewer’s Theorem&#xff09;。2002 年&#xff0c;麻省理…

低代码开发平台:高效开发新体验

在数字化转型的浪潮中&#xff0c;企业对软件开发的需求日益加剧&#xff0c;对开发效率和响应市场变化的速度有着前所未有的要求。传统的软件开发方法由于其复杂性和耗时性&#xff0c;已经逐渐难以满足这种快速变化的需求。低代码平台作为一种新兴的开发工具&#xff0c;因其…

C语言理解 —— printf 格式化输出

目 录 printf 函数一、短整型输出二、长整型输出三、浮点型输出四、字符型输出五、字符串输出六、注意问题 printf 函数 在软件开发过程中&#xff0c;通常需要打印一些字符串信息&#xff0c;或把一些变量值输出到上位机显示。打印函数printf是最常用的。 一般格式&#xff…

STM32篇:通用输入输出端口GPIO

一.什么是GPIO? 1.定义 GPIO是通用输入输出端口的简称&#xff0c;简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与 外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。 简单来说我们可以控制GPIO引脚的电平变化&#xff0c;达到我们的各种目的…

文献阅读(220)MRCN

题目&#xff1a;MRCN: Throughput-Oriented Multicast Routing for Customized Network-on-Chips时间&#xff1a;2023期刊&#xff1a;TPDS研究机构&#xff1a;韩国成均馆大学 这篇论文探讨的问题是多播死锁问题&#xff0c;下图中Packet A分成两条路径&#xff0c;但在rou…