初学者必看,提供海星检测项目从零开始小目标检测sota算法(ppyoloe-sod)

该文介绍了如何运用PP-YOLOE-SOD模型解决小目标检测问题,特别是针对海星检测。通过数据切图、数据增强等技术,模型性能得到了提升,AP值达到0.502。文章讨论了大堡礁保护的背景,以及人工智能在珊瑚礁管理中的作用。
摘要由CSDN通过智能技术生成

我以我的一个项目进行介绍,各位如果想运行这些程序的话,可以跳转到相应的百度的页面,我放到底下啦。基于ppyoloe-sod海星目标检测(小目标检测) - 飞桨AI Studio

0 赛事背景说明

澳大利亚令人惊叹的美丽大堡礁是世界上最大的珊瑚礁,拥有 1,500 种鱼类、400 种珊瑚、130 种鲨鱼、鳐鱼和种类繁多的其他海洋生物。

不幸的是,珊瑚礁正受到威胁,部分原因是一种特定的海星——以珊瑚为食的棘冠海星(简称COTS)的数量过剩。科学家、旅游经营者和珊瑚礁管理者建立了一个大规模的干预计划,将COTS的爆发控制在生态可持续的水平。

为了知道COTS在哪里,一种传统的珊瑚礁调查方法,称为“蝠鲼拖曳”,由浮潜潜水员执行。在被船拖曳时,他们目视评估珊瑚礁,停下来记录每200米观察到的变量。虽然这种方法通常有效,但面临明显的局限性,包括操作可扩展性、数据分辨率、可靠性和可追溯性。

大堡礁基金会建立了一个创新计划,以开发新的调查和干预方法,以提供COTS控制的阶梯式变化。水下摄像机将收集数千张珊瑚礁图像,人工智能技术可以大大提高珊瑚礁管理者检测和控制COTS爆发的效率和规模。

为了扩大基于视频的测量系统,澳大利亚国家科学机构CSIRO与谷歌合作开发创新的机器学习技术,可以准确,高效,近乎实时地分析大型图像数据集。

1 赛题任务

赛题链接

赛题介绍视频(YouTube)

本次比赛的目标是通过构建在珊瑚礁水下视频上训练的物体检测模型,实时准确地识别海星。

您的工作将帮助研究人员识别威胁澳大利亚大堡礁的物种,并采取明智的行动为子孙后代保护珊瑚礁。

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]
ppyoloe0.315
切图+ppyoloe-sod0.490
切图+ppyoloe-sod +数据增强0.502

进一步改进的方向

  • 采用多模型融合的策略
  • 使用更大的backbone,如convnext
  • 可以尝试使用two_stage算法
  • 进一步扩展数据增强

5总结

本项目是一个典型的小目标检测场景,直接用yolo算法做简单的finetune并不能取得很好的结果,在本项目只取得了ap为0.315的成绩。
所以针对此场景,采用切图的方法,并选取了针对小目标场景优化后的算法,效果得到明显改善,ap达到了0.490。进一步采取数据增强的方式,模型ap值提高到0.502。
同时,本项目仍然有很大的优化空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值