YOLOv5 小目标检测、无人机视角小目标检测
近年随着无人机的快速发展,通用无人机已广泛应用于摄影、农业、监控等多个领域。这里举个例子,比如我们要监控城市主干道的交通情况,就可以通过无人机传回画面来实时监控。我们可以通过人工智能技术来分析传回的图像,来统计行人、汽车的流通量。
然而,也是存在难点:(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个多小时的训练,训练结果如下:
mAP@0.5 达到了0.591,效果挺好的。
YOLOv5l 版本则经过漫长的26个小时训练, mAP@0.5 达到了0.648,效果非常好。
4.推理合并在模型推理的时候,输入的是一张无人机拍下是原始图像,我们同样也需要把原图切割成多个小图来推理,再把小图的推理的结果合并到原图,然后再统一做nms操作。
步骤:
(1)小图跑模型推理,得到推理结果pred;
(2)对pred的结果中boxes位置进行坐标转换,转换为对应于原图中的位置;
(3)把各个小图推理的结果用 torch.cat 来进行合并;
(4)使用nms非极大值抑制 过滤掉重复的框。
训练后模型检测效果:
显示标签的效果:
可以看到效果是非常好的,无论对于大目标还是行人等小目标,无论夜间还是白天的画面,精度的表现都挺不错的。
转载文章请注明出处:YOLOv5 小目标检测_liguiyuan的博客-CSDN博客
参考:
深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎
目标检测任务超大图像的切图实现_zengwb的博客-CSDN博客