Home

Awesome

基于 YOLOv5 的卫星图像目标检测

1 数据准备

1.1 数据集采集

本项目使用 DOTA 数据集,数据集链接:下载地址

1.2 标签格式转换和标签分布统计

YOLO 模型的标签输入有着特定的格式:

<class> <x_center> <y_center> <width> <height>

其中,

而原数据集中的标签数据格式和 YOLO 模型要求输入的标签数据格式不一致,因此我们将 DOTA 标签数据格式批量转换成 YOLO 标签数据格式,转换格式后标签文件内容如 图1-5 所示。

<table> <tr> <td> <center><img src="./README_figures/YOLO_format_label.png" align="center" style="width: 550px;"></center> <center><font size=2>图1-5 格式转换后的数据集标签一览</font></center> </td> </tr> </table>

格式转换后,我们统计了标签中各个参数的分布。

1.3 图像分割和尺寸调整

YOLO 模型的图像输入尺寸是固定的,由于原数据集中的图像尺寸不一,我们将原数据集中的图像按目标分布的位置分割成一个个包含目标的子图,并将每个子图尺寸调整为 1024×1024。分割前的图像如 图1-9 所示,分割后的子图效果如 图1-10 所示。

<table> <tr> <td> <center><img src="./README_figures/full_img.png" align="center" style="width: 450px;"></center> <center><font size=2>图1-9 分割前的图像</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/split_img.png" align="center" style="width: 550px;"></center> <center><font size=2>图1-10 分割后的效果</font></center> </td> </tr> </table>

1.4 数据集目录结构调整

YOLOv5 在读取数据时使用特定的目录结构,调整后的数据集目录结构如 图1-11 所示,各个目录中的内容如 图1-12 ~ 图1-15 所示。

<table> <tr> <td> <center><img src="./README_figures/dataset_dir.png" align="center" style="width: 200px;"></center> <center><font size=2>图1-11 输入数据目录结构</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/image_train_dir.png" align="center" style="width: 250px;"></center> <center><font size=2>图1-12 训练集图片目录内容</font></center> </td> <td> <center><img src="./README_figures/image_val_dir.png" align="center" style="width: 220px;"></center> <center><font size=2>图1-13 验证集图片目录内容</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/label_train_dir.png" align="center" style="width: 230px;"></center> <center><font size=2>图1-14 训练集标签目录内容</font></center> </td> <td> <center><img src="./README_figures/label_val_dir.png" align="center" style="width: 200px;"></center> <center><font size=2>图1-15 验证集标签目录内容</font></center> </td> </tr> </table>

2 模型训练

2.1 环境搭建

我们使用远程 GPU 服务器(MistGPU)训练模型,服务器硬件配置如 图2-1 所示。

<table> <tr> <td> <center><img src="./README_figures/server_config.png" align="center" style="width: 160px;"></center> <center><font size=2>图2-1 GPU 服务器硬件配置</font></center> </td> </tr> </table>

服务器软件配置:

本地连接服务器的工具:FinalShell 1.0

首先我们在本地修改工程中相关配置文件并测试跑通:

<table> <tr> <td> <center><img src="./README_figures/DOTA_yaml.png" align="center" style="width: 450px;"></center> <center><font size=2>图2-2 自定义数据集路径</font></center> </td> </tr> </table>

然后我们将在本地调试好的 YOLOv5 工程打包压缩,将预处理好的数据集打包压缩,将两者上传至服务器。上传后分别用 unzip 命令解压,注意 YOLOv5 工程目录和数据集根目录要在同一级目录下,如 图2-3 所示。

<table> <tr> <td> <center><img src="./README_figures/server_dir.png" align="center" style="width: 350px;"></center> <center><font size=2>图2-3 数据集和YOLOv5目录的位置</font></center> </td> </tr> </table>

进入 yolov5/ 目录,使用以下命令安装 YOLOv5 工程所需的配置文件:

pip install -U -r requirements.txt

2.2 训练

yolov5/ 目录,运行 train.py 文件开始训练:

screen python3 train.py --weight weights/yolov5s.pt --batch 16 --epochs 100 --cache

其中的参数说明:

另:命令开头使用的 screen 是 linux 的窗口管理器,可以使训练过程在后台运行,当网络不稳定导致服务器连接中断时,可以使用 screen -r 命令重新进入训练界面。

训练开始时的日志信息如 图2-4 所示,包括配置信息、网络架构等。

<table> <tr> <td> <center><img src="./README_figures/train_log.png" align="center" style="width: 800px;"></center> <center><font size=2>图2-4 训练开始日志信息</font></center> </td> </tr> </table>

训练过程的前3个 epoch 如 图2-5 所示。

<table> <tr> <td> <center><img src="./README_figures/train_shot.png" align="center" style="width: 800px;"></center> <center><font size=2>图2-5 训练过程日志信息</font></center> </td> </tr> </table>

其中,

另:

<table> <tr> <td> <center><img src="./README_figures/GIoU.png" align="center" style="width: 540px;"></center> <center><font size=2>图2-6 GIoU 定义</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/IoU.png" align="center" style="width: 400px;"></center> <center><font size=2>图2-7 IoU 定义</font></center> </td> </tr> </table>

训练一个 epoch 后可以在 runs/ 目录下看到改 epoch 各个训练 batch 的在图上的标签,如图 2-8 所示。

<table> <tr> <td> <center><img src="./README_figures/train_batch_labels.jpg" align="center" style="width:600px;"></center> <center><font size=2>图2-8 训练 batch 标签</font></center> </td> </tr> </table>

2.3 训练和验证的结果

我们使用上述方法和数据集分别在基于 COCO 数据集的预训练模型 yolov5s 和 yolov5m 的基础上训练了自己的权重。yolov5s 模型训练用时 10 小时左右,yolov5m 模型训练用时 20 小时左右。

我们记录了每一个 epoch 的训练过程和验证过程的指标值,并绘制了评价指标曲线。yolov5s 模型的评价指标曲线如 图2-9 所示,yolov5m 评价指标模型的曲线如 图2-10 所示。

<table> <tr> <td> <center><img src="./README_figures/s_results.png" align="center" style="width: 700px;"></center> <center><font size=2>图2-9 yolov5s 模型评价指标曲线</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/m_results.png" align="center" style="width: 700px;"></center> <center><font size=2>图2-10 yolov5m 模型评价指标曲线</font></center> </td> </tr> </table>

其中,

由结果曲线可以看出,yolov5s 和 yolov5m 都取得了很好的结果,大部分曲线随着 epoch 数增加都趋于收敛。我们有以下结论:

  1. yolov5m 的验证集目标检测损失函数值在 50 个 epoch 后有轻微的上升的趋势,说明在验证集上存在轻微的过拟合问题
  2. yolov5s 和 yolov5m 在目标分类上都有着很好的效果
  3. 同等迭代次数训练后,yolov5m 的准确率会超过 0.6,高于 yolov5s 的准确率
  4. yolov5s 和 yolov5m 的 mAP 收敛值相差很小,但 yolov5m 会高于 yolov5s,即 yolov5m 的效果会稍好于 yolov5s

3 模型测试

3.1 模型效果测试

我们分别对训练好的 yolov5s 和 yolov5m 模型做卫星图像目标检测测试,测试结果如 图3-1 ~ 图3-4 所示。

<table> <tr> <td> <center><img src="./README_figures/s_test_res1.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-1-a yolov5s 测试结果1</font></center> </td> <td> <center><img src="./README_figures/m_test_res1.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-1-b yolov5m 测试结果1</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/s_test_res2.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-2-a yolov5s 测试结果2</font></center> </td> <td> <center><img src="./README_figures/m_test_res2.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-2-b yolov5m 测试结果2</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/s_test_res3.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-3-a yolov5s 测试结果3</font></center> </td> <td> <center><img src="./README_figures/m_test_res3.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-3-b yolov5m 测试结果3</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/s_test_res4.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-4-a yolov5s 测试结果4</font></center> </td> <td> <center><img src="./README_figures/m_test_res4.png" align="center" style="width: 350px;"></center> <center><font size=2>图3-4-b yolov5m 测试结果4</font></center> </td> </tr> </table>

yolov5s 和 yolov5m 模型的每张图片推断用时如 图3-5 和 图3-6 所示。

<table> <tr> <td> <center><img src="./README_figures/s_infer_shot.png" align="center" style="width: 700px;"></center> <center><font size=2>图3-5 yolov5s 模型推断用时</font></center> </td> </tr> <tr> <td> <center><img src="./README_figures/m_infer_shot.png" align="center" style="width: 700px;"></center> <center><font size=2>图3-6 yolov5m 模型推断用时</font></center> </td> </tr> </table>

3.2 模型效果总结

总的来说,yolov5s 和 yolov5m 模型效果相差不大,都能检测到给定图像中的大部分目标并正确分类。

模型效果总结:

4 未来工作

日后将考虑训练 yolov5l 以及 yolov5x 模型,增加所有模型的训练 epoch 数到 300,并对比各个模型的优劣。