Yolo11 基于DroneVehicle数据集的无人机视角下车辆目标检测

Yolo11 基于DroneVehicle数据集的无人机视角下车辆目标检测

1、关于DroneVehicle数据集介绍

DroneVenicle数据集是由天津大学收集、标注的大型无人机航拍车辆数据集。
DroneVehicle 数据集由无人机采集的共 56,878 幅图像组成,其中一半为 RGB 图像,其余为红外图像。我们对五个类别进行了带有方向性边界框的丰富标注。其中,汽车car 在 RGB 图像中有 389,779 个标注,在红外图像中有 428,086 个标注;卡车truck 在 RGB 图像中有 22,123 个标注,在红外图像中有 25,960 个标注;公交车bus 在 RGB 图像中有 15,333 个标注,在红外图像中有 16,590 个标注;面包车van 在 RGB 图像中有 11,935 个标注,在红外图像中有 12,708 个标注;货车freight car 在 RGB 图像中有 13,400 个标注,在红外图像中有 17,173 个标注。

2、DroneVehicle数据集下载

 参见作者Github:https://github.com/VisDrone/DroneVehicle

3、DroneVehicle数据集处理

在 DroneVehicle 中,为了标注图片边界上的物体,作者在每张图片的上下左右四边设置了宽度为 100 像素的白色边框,这样下载的图片尺寸就是 840 x 712。在训练我们的检测网络时,我们可以进行预处理,去除周围的白色边框,并将图像尺寸改为 640 x 512。

处理前后对比。

去除白边代码:

import numpy as np import cv2 import os from tqdm import tqdm def create_file(output_dir_vi, output_dir_ir): if not os.path.exists(output_dir_vi): os.makedirs(output_dir_vi) if not os.path.exists(output_dir_ir): os.makedirs(output_dir_ir) print(f'Created folder:({output_dir_vi}); ({output_dir_ir})') def update(input_img_path, output_img_path): image = cv2.imread(input_img_path) cropped = image[100:612, 100:740] # 裁剪坐标为[y0:y1, x0:x1] cv2.imwrite(output_img_path, cropped) dataset_dir_vi = r'valimg' # 处理前可见光图片目录 output_dir_vi = r'valimg2' # 处理后可见光图片目录 dataset_dir_ir = r'valimgr' # 处理前红外光图片目录 output_dir_ir = r'valimgr2' # 处理后红外光图片目录 # 检查文件夹是否存在,如果不存在则创建 create_file(output_dir_vi, output_dir_ir) # 获得需要转化的图片路径并生成目标路径 image_filenames_vi = [(os.path.join(dataset_dir_vi, x), os.path.join(output_dir_vi, x)) for x in os.listdir(dataset_dir_vi)] image_filenames_ir = [(os.path.join(dataset_dir_ir, x), os.path.join(output_dir_ir, x)) for x in os.listdir(dataset_dir_ir)] # 转化所有图片 print('Start transforming vision images...') for path in tqdm(image_filenames_vi): update(path[0], path[1]) print('Start transforming infrared images...') for path in tqdm(image_filenames_ir): update(path[0], path[1]) 

4、制作Yolo目标检测需要的数据集文件

4.1、下载DroneVehicle的coco格式的检测框标签文件

4.2、通过标注软件将coco格式的标签文件转为VOC格式的标签文件

这里我用的是X-AnyLabeling作为标注软件。

4.3、处理VOC格式的标签文件并转成Yolo格式的标签文件

处理该数据集标签文件时发现部分检测框的位置可能会在图片边缘外面,导致直接转成YOLO的时候,会出现负坐标或者大于1的坐标值,这样会导致模型训练不了或者存在一定问题,所以对该部分检测框在转换时需进行特殊处理。注意:X-AnyLabeling也可以直接导出YOLO格式标签,但是经测试X-AnyLabeling也没有处理大于1的坐标值。

xml2txt.py

import xml.etree.ElementTree as ET import shutil import os import imagesize # 定义识别目标或类集合 object = 'datasets' # 根据自定义的数据集名称 if os.path.exists("./%s/labels/"%object): # 如果文件存在 shutil.rmtree("./%s/labels/"%object) os.makedirs("./%s/labels/"%object) else: os.makedirs("./%s/labels/"%object) sets = ['train', 'val'] # 修改类别(自定义) classes =["car", "truck", "bus", "van", "freight_car"] def convert(size, box): # 坐标信息归一化至0-1 dw = 1. / size[0] dh = 1. / size[1] x = (box[0] + box[1]) / 2.0 y = (box[2] + box[3]) / 2.0 w = box[1] - box[0] h = box[3] - box[2] x = x * dw w = w * dw y = y * dh h = h * dh return (x, y, w, h) def convert_annotation(image_id): in_file = open('./%s/xml/%s.xml' % (object,image_id)) # xml文件 out_file = open('./%s/labels/%s.txt' % (object,image_id), 'w') # txt文件 image_file = open('./%s/images/%s.jpg' % (object,image_id)) # pic文件 print("in_file,",in_file) tree = ET.parse(in_file) # f = open(in_file.name,encoding="utf-8") # tree = ET.parse(f) root = tree.getroot() size = root.find('size') # 这里的width 和 height 在Autolabelimg下自动标注可能会被修改,需替换成图片的真实宽高 # w = int(size.find('width').text) # h = int(size.find('height').text) w, h = imagesize.get(image_file.name) for obj in root.iter('object'): difficult = obj.find('difficult').text cls = obj.find('name').text if cls not in classes or int(difficult) == 1: continue cls_id = classes.index(cls) # 类别序号 xmlbox = obj.find('bndbox') xmin = float(xmlbox.find('xmin').text) xmin = xmin if xmin >= 0 else 0.0 # 左上角x坐标如果小于0都化成0 xmax = float(xmlbox.find('xmax').text) xmax = xmax if xmax <= w else float(w) # 右下角x坐标如果大于图片宽度了都为图片宽度值 ymin = float(xmlbox.find('ymin').text) ymin = ymin if ymin >= 0 else 0.0 # 左上角y坐标如果小于0都化成0 ymax = float(xmlbox.find('ymax').text) ymax = ymax if ymax <= h else float(h) # 右下角y坐标如果大于图片高度了都为图片高度值 b = (xmin,xmax ,ymin ,ymax) bb = convert((w, h), b) # 归一化 out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') for image_set in sets: if not os.path.exists('./%s/labels/'%object): os.makedirs('./%s/labels/'%object) image_ids = open('./%s/ImageSets/%s.txt' % (object,image_set)).read().strip().split() list_file = open('./%s/%s.txt' % (object,image_set), 'w') for image_id in image_ids: list_file.write('./images/%s.jpg\n' % (image_id)) # 要注意图片的后缀名是什么 convert_annotation(image_id) list_file.close() 

 4.4、按上述步骤处理train、val、test三个数据集文件

我在这里只处理可见光部分的数据集,红外光数据集处理跟该处理方式相同。
我的处理思路:
1)因为不需要测试集,所以我将val验证集的1469个数据和test测试集8980个数据的20%的数据作为我的验证集,即1469+8980*0.2=3265个数据验证集。
2)将train训练集的17990个数据和test测试集8980个数据的80%的数据作为我的训练集,即17990+8980*0.8=25174个数据训练集。
3)整理我的训练集和验证集

此时数据集已是YOLO格式,可以直接训练。

5、在Yolo11网络中训练

我选择了yolo11s的网络权重进行模型训练,训练100个epoch结果如下:

可以看到训练结果还不错。

验证集上标签可视化:

6、使用训练好的模型进行预测

第一张图片是val验证集中找的,第二张图片是网络上随便找的,检测结果比较理想。

7、结语及注意事项

虽然从训练结果上看效果还不错,但是仅针对于该种无人机航拍视角下,如果是斜视视角则效果较差。其次红外光下的检测效果目前还没测过,以及可见光和红外光融合检测效果也未经测试。

需要注意的点:处理白边、处理在图片边缘外的检测框问题。

 

Read more

Llama-3.2-3B新手教程:3步搭建你的AI写作助手

Llama-3.2-3B新手教程:3步搭建你的AI写作助手 1. 为什么选Llama-3.2-3B做写作助手 你是不是也遇到过这些情况:写周报卡壳半小时、给客户写方案反复删改、想发条朋友圈却憋不出一句像样的话?别急,这次不用等灵感,一个轻量又聪明的AI写作助手已经 ready——Llama-3.2-3B。 它不是动辄几十GB的大块头,而是一个仅30亿参数、却在多语言对话和文本生成任务中表现亮眼的“小而强”模型。由Meta官方发布,经过指令微调(SFT)和人类反馈强化学习(RLHF)双重优化,它更懂怎么听懂你、怎么帮上忙,而不是自说自话。 更重要的是,它不挑设备:一台8GB内存的笔记本就能跑起来;不设门槛:不用配环境、不装CUDA、不编译源码;不绕弯路:点几下就进对话框,输入一句话,立刻开始帮你写。 这不是实验室里的Demo,而是真正能放进你日常写作流里的工具——写邮件、列提纲、润色文案、生成产品描述、甚至写小红书爆款标题,它都能接得住、写得顺、

AMD显卡终极兼容指南:llama.cpp Vulkan后端快速解决方案

AMD显卡终极兼容指南:llama.cpp Vulkan后端快速解决方案 【免费下载链接】llama.cppPort of Facebook's LLaMA model in C/C++ 项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp 你是否在AMD显卡上运行llama.cpp时遇到过Vulkan初始化失败或推理速度异常的问题?本文为你提供一套完整的AMD显卡兼容性解决方案,让你轻松解决llama.cpp在AMD设备上的各种疑难杂症。通过本指南,你将掌握从驱动优化到性能调优的全套技巧,让大语言模型在AMD显卡上流畅运行。 AMD显卡兼容性问题深度解析 AMD显卡用户在使用llama.cpp的Vulkan后端时,主要面临三大挑战: 驱动版本不匹配:不同世代的AMD显卡对Vulkan API的支持程度存在差异,特别是RDNA架构的RX 6000/7000系列。 内存管理冲突:AMD的显存分配策略与llama.cpp的预期存在偏差,导致模型加载失败。 着色器编译异常:特定驱动版本在编译SPIR-V着色器时会产生无效

Vscode新手必看:GitHub Copilot从安装到实战的5个高效用法

Vscode新手必看:GitHub Copilot从安装到实战的5个高效用法 最近和几位刚入行的朋友聊天,发现他们虽然装了Vscode,也听说过GitHub Copilot的大名,但真正用起来的却不多。要么是觉得配置麻烦,要么是打开后只会傻傻地等它自动补全,完全没发挥出这个“AI结对程序员”的威力。这让我想起自己刚开始用Copilot那会儿,也是摸索了好一阵子才找到感觉。今天,我就把自己从安装到深度使用过程中,那些真正提升效率的实战心得整理出来,希望能帮你绕过那些坑,快速把Copilot变成你的开发利器。 GitHub Copilot远不止是一个高级的代码补全工具。当你真正理解它的工作模式,并学会与之高效“对话”时,它能在代码生成、逻辑解释、问题调试乃至学习新框架等多个维度,显著改变你的编程体验。这篇文章不会重复那些官网都有的基础操作,而是聚焦于五个经过实战检验的高效用法,让你从“会用”进阶到“精通”。 1. 环境准备与深度配置:不止是安装插件 很多教程把安装Copilot描述为“点一下按钮”那么简单,但要想获得流畅稳定的体验,一些前置准备和深度配置至关重要。这就像给赛车加油

【30天从零玩转AI应用开发】第2篇:大模型API注册+调用实战

【30天从零玩转AI应用开发】第2篇:大模型API注册+调用实战

文章目录 * 前言 * 【30天从零玩转AI应用开发】第2篇:大模型API注册+调用实战(OpenAI/文心一言/通义千问) * 专栏副标题 * 专栏简介 * 摘要 * 关键词 * 前言 * 一、3大主流大模型API对比(新手必看) * 新手选择建议(避坑指南): * 二、API注册+密钥获取(文字版超详细指南) * 2.1 OpenAI注册+密钥获取(含避坑技巧) * 准备工具: * 注册步骤(每一步都标清按钮位置): * 避坑技巧: * 2.2 百度文心一言注册+密钥获取(10分钟搞定) * 准备工具: * 注册步骤: * 关键提醒: * 2.3 阿里通义千问注册+密钥获取 * 准备工具: * 注册步骤: * 三、API调用实战(Python代码可直接复制) * 3.