YOLOv5 小目标检测、无人机视角小目标检测-程序员宅基地

技术标签: yolov5  计算机视觉  目标检测  VisDrone  

1.简述

近年随着无人机的快速发展,通用无人机已广泛应用于摄影、农业、监控等多个领域。这里举个例子,比如我们要监控城市主干道的交通情况,就可以通过无人机传回画面来实时监控。我们可以通过人工智能技术来分析传回的图像,来统计行人、汽车的流通量。

然而,也是存在难点:(1)部分目标过小,无人机拍摄的画面比较远时,而行人在远景中就显得非常小,容易漏检;(2)航拍的视频画面中,有大量的检测物体,可能会同时出现几十上百个目标,而目标被遮挡或重叠,也造成不小的难度。

这里我采用YOLOv5算法及VisDrone2021数据集来实现自己的小目标检测任务。

2.数据集处理

(1)数据集下载

VisDrone2021数据集,是无人机视觉目标检测的数据集,VisDrone2021版本和VisDrone2019是同一个数据集,里面包含很多的小目标。这个数据集不需要注册,可以免费下载。作者提供了百度网盘和谷歌网盘的下载方式。

下载地址:Object Detection – VisDrone

(2)密集区域过滤

整理数据集的时候发现有一个分类是 "ignored regions",这个是忽略的区域,因为有些区域包含了密集的很小的目标,是无法进行标注的,所以我们要把这个区域忽视掉。这里我直接用opencv来进行覆盖住就可以了。

 (遮挡前)

 

(密集小目标遮挡后)

(3)图片分割、标签生成

因为我们要检测的图像分辨率很大,比如无人机拍摄的图片尺寸为5630x4314,但又有些目标很小,如果直接把图像缩放到640x640训练的话,效果不好,很多小目标就检测不到了。

因为:yolov5使用了5次下采样,最后输出的特征图大小是20 * 20, 40 * 40, 80 * 80

80* 80 负责检测小目标的,对应到640 * 640 上,每格特征图对应的感受野大小是 640/80=8 * 8。再对应到原图中,以长边为例,5630/640 * 8 = 71,即原图中目标小于71像素的目标,是无法学习到有效特征的。

所以要对原图分割成多个小图再进行检测,我这里把图像分割成 2行3列,即6个小图。

有一点值得注意的是,有一些目标正好位于两个小图中间,正好被截断了,这就可能导致检测不到目标。为了避免这种情况,我们在两个小图之间设置一个overlap重叠区域,这里我设置的重叠区域面积占总面积的20%。

然后把标签中boxes的坐标也要跟着做相应的变换,保存到VisDrone_chip文件夹中。同时,生成yolov5训练所需要的标签格式。

原图分割后生成的训练目录:

3.模型训练

(1)创建自己的数据

我们首先用git拉取YOLOv5的代码,github地址:

GitHub - ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLiteYOLOv5 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.https://github.com/ultralytics/yolov5.git

然后在yolov5/data/ 目录下创建自己的数据集配置文件 VisDrone_data.yaml

# VisDrone2019-DET dataset https://github.com/VisDrone/VisDrone-Dataset

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
train: ./data/VisDrone_chip/images/train  # train images (relative to 'path')  6471 images
val: ./data/VisDrone_chip/images/val  # val images (relative to 'path')  548 images
test: ./data/VisDrone_chip/images/test  # test images (optional)  1610 images

# Classes
nc: 10  # number of classes
names: ['pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor']

这里我们把 "others"这个分类去掉,一共10个类别。

(2)创建自己的模型

进入到yolov5/models/ 目录下,拷贝一个模型作为自己的模型,这里我分别尝试了YOLOv5的small版本和large版本模型,这里就用small版本进行讲解。

cp yolov5s.yaml yolov5s_visdrone.yaml

然后修改类别的数量,这里共有10个分类,把nc的参数改为10: 

(3)模型训练

下载pretrain模型模型 YOLOv5s , 存放在yolov5 目录里。

开始训练:

python train.py --img 640 --batch 16 --epochs 100 --data ./data/VisDrone_data.yaml --weights yolov5s.pt

这里我训练100个epochs,经过9个多小时的训练,训练结果如下:

 

 [email protected] 达到了0.591,效果挺好的。

YOLOv5l 版本则经过漫长的26个小时训练, [email protected] 达到了0.648,效果非常好。

4.推理合并

在模型推理的时候,输入的是一张无人机拍下是原始图像,我们同样也需要把原图切割成多个小图来推理,再把小图的推理的结果合并到原图,然后再统一做nms操作。

步骤:

(1)小图跑模型推理,得到推理结果pred;

(2)对pred的结果中boxes位置进行坐标转换,转换为对应于原图中的位置;

(3)把各个小图推理的结果用 torch.cat 来进行合并;

(4)使用nms非极大值抑制 过滤掉重复的框。

训练后模型检测效果:

显示标签的效果:

 

 

 可以看到效果是非常好的,无论对于大目标还是行人等小目标,无论夜间还是白天的画面,精度的表现都挺不错的。


转载文章请注明出处:YOLOv5 小目标检测_liguiyuan的博客-程序员宅基地

参考:

深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎

目标检测任务超大图像的切图实现_zengwb的博客-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012505617/article/details/121753656

智能推荐

Python之turtle库基本知识点_python的特点,turtle的基本控制-程序员宅基地

文章浏览阅读2.8w次,点赞25次,收藏101次。1.turtle库是Python标准库之一,是入门级的图形绘制函数库。2.turtle绘图原理:有一只海龟,其实在窗体正中心,在画布上游, 走过的轨迹形成了绘制的图形,海龟由程序控制,可以变换 颜色、改变宽度等。3.turtle绘图窗体布局:最小单位是像素 setup()设置窗体大小及位置 格式:turtle.setup(width,height,startx,starty..._python的特点,turtle的基本控制

Vuex的核心概念:Action,问题呈现:计时器案例,定义Action,触发Action,触发actions异步任务时携带参数,触发actions的第二种方式 ,_vue 定义action-程序员宅基地

文章浏览阅读353次,点赞6次,收藏12次。如果通过异步操作变更数据,必须通过Action,而不能使用Mutation,但是在Action中还是要通过触发Mutation的方式间接变更数据。得出结论:在mutations函数中不能写异步的代码。触发actions的第二种方式。Action用于处理异步任务。此时我们就引出了Action。问题呈现:计时器案例。_vue 定义action

什么是递归函数?-程序员宅基地

文章浏览阅读10w+次,点赞189次,收藏680次。递归函数递归例题特点效率优点递归函数递归递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。 所以递归要有两个要素,结束条件与递推关系注:递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当..._递归函数

C/C++中的 getline()_c getline-程序员宅基地

文章浏览阅读9.9k次,点赞6次,收藏12次。C/C++中的getline()函数总结_c getline

Linux中识别中文失效_linux无法识别中文文件名-程序员宅基地

文章浏览阅读628次。用于:在linux中操作中文,或者word,pdf等 时,linux中文失效。_linux无法识别中文文件名

计组习题解1.17-1.24-程序员宅基地

文章浏览阅读342次,点赞10次,收藏8次。BCBCACCA。

随便推点

ROS之旅(六)远端rviz监控_ssh在本地远程启动rviz-程序员宅基地

文章浏览阅读2.7k次,点赞4次,收藏19次。我们发现当客户端通过SSH连接服务端后调用其rviz时十分卡顿,接下来解决此问题。1.确定主从机ip、用户名、主机名个人理解:本文操作过程只有主机上可以运行ROS,从机与主机共用一个rosmaster,从机打开rviz其实是打开了主机下的rviz,因此可以共享ros话题,实现“传图”效果,实则传输的是话题内容,而SSH远程连接后在打开rviz实际上传输的是图像数据因此非常卡顿。我用的主机为一个搭载激光雷达的小车,其ip:192.168.31.92 用户名:qust-mbot主机名:qu..._ssh在本地远程启动rviz

盘点73个Python各行各业管理系统源码Python爱好者不容错过_python 项目管理系统源码-程序员宅基地

文章浏览阅读175次。盘点73个Python各行各业管理系统源码Python爱好者不容错过_python 项目管理系统源码

分享111个HTML社会教育模板,总有一款适合您_html教育人事系统模板-程序员宅基地

文章浏览阅读147次。分享111个HTML社会教育模板,总有一款适合您_html教育人事系统模板

unipush离线推送_unipush 安卓离线推送notification1.setintent-程序员宅基地

文章浏览阅读3.2k次。unipush离线推送首先找到项目中的 manifest.json文件 > App模块配置 > 勾选Push消息推送,然后点击配置跳转到uniapp开发者中心,找到Uni Push > 修改应用信息。填写 应用名称 Android 包名 Android 应用签名获取Android 应用签名找到你打包时的.keystore证书所在文件目录 cmd进来keytool -list -v -keystore 文件_unipush 安卓离线推送notification1.setintent

linux centos7.9改dns和ip_centos7.9 dns客户端-程序员宅基地

文章浏览阅读428次。vi /etc/sysconfig/network-scripts/ifcfg-ens32_centos7.9 dns客户端

ThinkPHP6项目基操(13.实战部分 项目中的自定义异常处理总结 错误页面&API错误)_thinkphp6自定义403和404页面-程序员宅基地

文章浏览阅读8.7k次,点赞9次,收藏25次。项目中的自定义异常处理总结 错误页面&API错误前言一、异常分类1. 控制器找不到2. 方法找不到3. 请求资源不存在4. 系统內部异常、HTTP异常等二、异常处理1. 前置处理2. 异常处理详细代码(1) 控制器找不到(2) 方法找不到(3) 请求资源不存在及系统错误异常三、异常检测前言  一般项目中路由分为返回模板引擎页面和返回api接口json数据,两种方式异常需要返回不同的内容,如果是模板引擎页面遇到异常需要返回错误页面,如果是api接口遇到异常需要返回json数据。  开发模式和上线_thinkphp6自定义403和404页面