我以我的一个项目进行介绍,各位如果想运行这些程序的话,可以跳转到相应的百度的页面,我放到底下啦。基于ppyoloe-sod海星目标检测(小目标检测) - 飞桨AI Studio
0 赛事背景说明
澳大利亚令人惊叹的美丽大堡礁是世界上最大的珊瑚礁,拥有 1,500 种鱼类、400 种珊瑚、130 种鲨鱼、鳐鱼和种类繁多的其他海洋生物。
不幸的是,珊瑚礁正受到威胁,部分原因是一种特定的海星——以珊瑚为食的棘冠海星(简称COTS)的数量过剩。科学家、旅游经营者和珊瑚礁管理者建立了一个大规模的干预计划,将COTS的爆发控制在生态可持续的水平。
为了知道COTS在哪里,一种传统的珊瑚礁调查方法,称为“蝠鲼拖曳”,由浮潜潜水员执行。在被船拖曳时,他们目视评估珊瑚礁,停下来记录每200米观察到的变量。虽然这种方法通常有效,但面临明显的局限性,包括操作可扩展性、数据分辨率、可靠性和可追溯性。
大堡礁基金会建立了一个创新计划,以开发新的调查和干预方法,以提供COTS控制的阶梯式变化。水下摄像机将收集数千张珊瑚礁图像,人工智能技术可以大大提高珊瑚礁管理者检测和控制COTS爆发的效率和规模。
为了扩大基于视频的测量系统,澳大利亚国家科学机构CSIRO与谷歌合作开发创新的机器学习技术,可以准确,高效,近乎实时地分析大型图像数据集。
1 赛题任务
本次比赛的目标是通过构建在珊瑚礁水下视频上训练的物体检测模型,实时准确地识别海星。
您的工作将帮助研究人员识别威胁澳大利亚大堡礁的物种,并采取明智的行动为子孙后代保护珊瑚礁。
2 数据集介绍
下面给出数据集中六幅例图:
训练数据文件结构:
将提供用于训练的图像数据和识别标签,文件夹结构:
|-- kaggle_dataset/train2017 # 存放训练图像数据,jpg编码图像文件
|-- kaggle_dataset/val2017 # 存放训练图像数据,jpg编码图像文件
|-- kaggle_dataset/annotations # 存放属性标签标注数据
数据标注文件的结构上,属于coco格式标注。
// An highlighted block
#先解压数据集
!unzip data/data179179/kaggle_dataset.zip
#下载PaddleDetection
!git clone https://gitee.com/PaddlePaddle/PaddleDetection.git #从gitee上下载速度会快一些
#安装PaddleDetection相关依赖
!pip install -r PaddleDetection/requirements.txt
!python PaddleDetection/setup.py install
3可视化
为了精简,此处只给出可视化效果和结论,具体代码见百度AIstudio上的项目
训练集目标大小分布
注意:
- 当原始数据集全部有标注框的图片中,有1/2以上的图片标注框的平均宽高与原图宽高比例小于0.04时,建议进行切图训练。
所以根据上面的说明,海星检测这个数据集其实介于“可切可不切”之间。当然,我们可以继续试验下,看看切图是否可以取得更加优秀的效果
各类别目标形状分布
各类别目标中心点形状分布
训练集目标个数分布
分析结论:海星检测的数据集图片分辨率相同,均为1280*720、小目标占比相当大。总的来说,这是个比较典型的小目标检测场景。
4 方案
本项目使用飞桨目标检测开发套件PaddleDetection,它可以端到端地完成从训练到部署的全流程目标检测应用。
具体方案
算法选择
由于本项目是典型的小目标检测,所以选取针对小目标优化的PP-YOLOE-SOD模型,并采取切图方法
相比PP-YOLOE模型,PP-YOLOE-SOD改进点主要包括在neck中引入 Transformer全局注意力机制 以及在回归分支中使用 基于向量的DFL 。
数据增强
- RandomExpand: {fill_value: [123.675, 116.28, 103.53]}
- GridMask: {}
- Mixup: {}
- Cutmix: {}
- RandomCrop: {}
- RandomFlip: {}
# 安装`sahi`库,用来切图
!pip install sahi
# 对训练集标注进行切图
!python PaddleDetection/tools/slice_image.py --image_dir kaggle_dataset/train2017\
--json_path kaggle_dataset/annotations/train.json --output_dir kaggle_dataset/train2017_400_sliced --slice_size 400 --overlap_ratio 0.25
# 对验证集标注进行切图
!python PaddleDetection/tools/slice_image.py --image_dir kaggle_dataset/val2017\
--json_path kaggle_dataset/annotations/valid.json --output_dir kaggle_dataset/val2017_400_sliced --slice_size 400 --overlap_ratio 0.25
####参数说明
#image_dir 原始数据集图片文件夹的路径
#json_path coco标注数据文件地址
#output_dir 切图结果所在文件位置
#slice_size 切图大小(默认为正方形)
#overlap_ratio 切分时的子图之间的重叠率
模型训练
直接使用PaddleDetection进行模型训练的过程可以很简单,改改配置文件就好了。详细说明可查看PaddleDetection模型参数配置教程。
本项目使用的模型是ppyoloe_p2_crn_l_80e_sliced_xview_400_025.yml
,相关配置文件如下:
configs/ppyoloe/_base_/xview_sliced_400_025_detection.yml
- 数据配置文件
configs/smalldet/ppyoloe_p2_crn_l_80e_sliced_xview_400_025.yml
- sniper模型配置文件
configs/runtime.yml
- 运行时配置文件
configs/ppyoloe/_base_/ppyoloe_crn.yml
- 模型配置文件
configs/ppyoloe/_base_/optimizer_300e.yml
- 优化器配置文件
configs/ppyoloe/_base_/ppyoloe_reader.yml
- 数据读取配置文件
在使用配置文件,尤其是数据配置文件时,读者请注意尽量使用绝对路径配置数据集,可以避免不少报错。
毫无疑问,切图后模型的训练是要基于切图数据集的,配置如下:
metric: COCO
num_classes: 1
TrainDataset:
!COCODataSet
image_dir: train_images_400_025
anno_path: train_400_025.json
dataset_dir: kaggle_dataset/train2017_400_sliced
data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']
EvalDataset:
!COCODataSet
image_dir: valid_images_400_025
anno_path: valid_400_025.json
dataset_dir: kaggle_dataset/val2017_400_sliced
# 开始训练,训练环境为单卡V100(32G)
!python PaddleDetection/tools/train.py -c configs/ppyoloe_p2_crn_l_80e_sliced_xview_400_025.yml --use_vdl=True -o worker_num=8 --eval
模型评估
# 开始训练,训练环境为单卡V100(32G)
!python PaddleDetection/tools/train.py -c configs/ppyoloe_p2_crn_l_80e_sliced_xview_400_025.yml --use_vdl=True -o worker_num=8 --eval
效果如下:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.502
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.810
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.574
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.172
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.574
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.760
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.499
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.591
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.619
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.408
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.670
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.800
[12/05 12:13:32] ppdet.engine INFO: Total sample number: 2663, averge FPS: 26.871781479080514
训练结果
方案效果对比
方案 | ap @[ IoU=0.50:0.95] |
---|---|
ppyoloe | 0.315 |
切图+ppyoloe-sod | 0.490 |
切图+ppyoloe-sod +数据增强 | 0.502 |
进一步改进的方向
- 采用多模型融合的策略
- 使用更大的backbone,如convnext
- 可以尝试使用two_stage算法
- 进一步扩展数据增强
5总结
本项目是一个典型的小目标检测场景,直接用yolo算法做简单的finetune并不能取得很好的结果,在本项目只取得了ap为0.315的成绩。
所以针对此场景,采用切图的方法,并选取了针对小目标场景优化后的算法,效果得到明显改善,ap达到了0.490。进一步采取数据增强的方式,模型ap值提高到0.502。
同时,本项目仍然有很大的优化空间。