干货满满~阿里天池目标检测保姆级教程


本文总结来自阿里天池AI学习的直播课《天池CV赛事老司机,手把手带你入门目标检测赛题》~非常全面的为大家介绍了如何参与阿里天池目标检测的相关比赛,以及比赛中的一些宝贵的经验分享!干货满满!
录播链接 :https://tianchi.aliyun.com/course/video?liveId=41141

主讲人郑烨
中科院计算所博士生在读,研究方向为FSOD。CV比赛奖项收割者,有较为丰富的目标检测比赛经验。

1赛前准备

1.1设备

显卡:英伟达公司,支持cuda和cudnn的加速,很多开源的框架可以支持
显存:限制训练时候的输入图像,限制batchsize的大小,模型的复杂度;显卡的数量对于比赛来说并没有那么关键,对于数据量庞大的比赛表重要。
是否支持半精度fp16的训练:可以加速训练
硬盘:固态硬盘,减少IO时间,提高训练时间
内存:非常多的bbox时,可能会OOM
cpu:够用就好

1.2必备技术

python、计算机视觉基础、机器学习基础、深度学习基础、深度学习框架

1.3相关论文

https://github.com/hoya012/deep_learning_object_detection
在这里插入图片描述

1.4开源工具

mmdetection【pytorch】
https://github.com/open-mmlab/mmdetection

detectron2 【pytorch和caffe都可以】
https://github.com/facebookresearch/detectron2

simpleDet
https://github.com/TuSimple/simpledet

PaddleDetection
https://github.com/PaddlePaddle/PaddleDetection

tensorflow detection api object_detection
https://github.com/tensorflow/models/tree/master/research/object_detection

2比赛规则分析

比赛基本流程
规则理解掌握
数据分析
baseline
方案迭代改进
代码和模型提交
答辩准备
答辩
时间节点及不同阶段关联性
初赛如果和复赛关联性不大,可以基本ok就行,不需要花费太大精力

2.1评分指标

指路 https://github.com/rafaelpadilla/Object-Detection-Metrics【对目标检测很多的评测指标都做了很好的介绍】

a.mAP(配合不同IOU要求)
在这里插入图片描述
新手容易认为左图mAP高,实际上往往更低一些!
新手常见错误:score阈值的给定由可视化结果决定,例如0.5
经验:score阈值适当的降低可以提高mAP
b.acc【纯背景图像和有目标图像的二分类的准确率】+mAP
c.F1-score

2.2模型限制的解决方法

a.体积限制
1.直接将float32格式模型保存为float16格式
2.采用fp16训练保存float16格式模型
3.移除不必要的参数,例如optimizer优化过程的参数等【有的开源框架会默认保存一些参数,方便恢复训练,占得比例还挺高】

b.数量限制
由于数量难以界定,现在一般不采用

c.运行时间限制
模型轻量化【backbone,head等】
减少模型数量
减小infer尺度【多尺度预测的时候少选一些尺度】
多进程异步数据加载【提前预加载数据】
模型压缩量化、蒸馏剪枝等

3数据分析

3.1感受野&anchor&训练尺度

感受野&anchor&训练尺度可以通过以下几个方面分析拿到的数据:
a. 图像大小分布
医疗、遥感数据常见很大,需要合理的crop
数据集内图像大小差异较大:padding+crop
结合自身设备初步判断训练的尺度上限
b.Gt boxes大小及长宽比例分布
bbox的大小分部影响anchor scale设计
bbox长宽比例影响anchor ratio设计
类内和类间bbox大小的分布,影响整体算法的设计,例如多尺度及专家模型以及后处理

举例:宫颈癌比赛
在这里插入图片描述
如上图:
ASC-H类:大的比较少;
Candida:小中大都有;
Trichomonas:比较小
c.Gt boxes与图像大小相对比例分布
由比例可以计算目标经过resize进入网络时候的实际大小,从而:

	结合实际大小决定训练尺度的选取
	决定anchor scale
	决定 anchor ratio
	决定backbone的选取(模型感受野)

d.Gt boxes类别分布
数据分布非常不均衡,呈现长尾分布,

	上采样增强
	下采样增强
	训练动态加权采样
	稀少数据专家模型

小结

	感受野&anchor&训练尺度三者互相协调
	1.确定训练尺度【可原图resize】
	2.anchor scale和anchor ratio接近目标的分布可以加快收敛
	3.模型感受野要尽量大于目标长边
	【resize原图,增加深度,最后的卷积采用空洞卷积,引入DCN模块】

	当一个训练尺度或者一个模型难以协调的时候
	1.多尺度训练预测
	2.专家模型【这里是基于尺度的专家】
	3.模型改进【三叉戟网络TridentNet】

注意当有些时候,你对手中的数据集进行了模型赶紧,但是官方换榜之后,测得的结果并没有更好,这可能是因为你官方的测试集与手头数据集部分不均匀,要多手准备。
知乎相关链接:
https://zhuanlan.zhihu.com/p/44106492
https://zhuanlan.zhihu.com/p/55824651

3.2Domain分布

eg.训练集:白天+雨天

3.3实战分析数据特殊性质

1.物品检测—x光图像危险品语义分割

因为正常的图片较多,而含有危险品目标的数据量较少,因此可以通过“贴图”+"抠图"进行数据集mixup扩增(上交有发过相关的文章)
在这里插入图片描述
2.基于虚拟仿真环境下的自动驾驶交通标志识别
因为图很大,目标很小。第一步粗检测,第二步,细检测(以hrnet为backbone应对iou要求极高的检测)
在这里插入图片描述
3. 天池广东智能制造赛场-布匹瑕疵点检测
因为瑕疵大小相差较大,长宽比例较大(可以anchor调整的更加极端)由于给定了无目标的模板【没有瑕疵的图片】,所以可以进行通道拼接输入,做差输入。
在这里插入图片描述

3.4数据集划分

  1. 为了拟合比赛中的测试集,可以针对性划分
  2. 特殊的类训练相应的专家系统。

3.5训练采样方式

  1. 在线加权采样
    按照类别数量比例加权
    按照图片类别丰富度加权【百度参加365的策略】
  2. OHEM等基于loss的采样

3.6正常数据(背景数据)的使用

  1. 拼接:将含目标数据与正常图像拼接在一起进行训练【拼接造假图然后训练rpn,使得rpn能够一开始也能够在正常数据上有效果】
  2. 抠图+粘贴 将目标crop出来以后通过各种方式贴在正常数据上
  3. 如果背景数据与含目标数据具有对应关系:做差、通道拼接【如布匹问题,江小白酒瓶】

4实战

4.1算法选择

  1. Anchor based
  2. Anchor free
  3. One stage
  4. Tow stage
  5. Anchor based+Tow stage【目前推荐】
    在这里插入图片描述
    说明:
    基于类间关系的后处理:有些类不共存
    基于目标大小及位置的先验:目标必须在瓶子上等【都可以从数据中分析发现】

4.2预训练

在这里插入图片描述
说明:推荐使用在检测数据集上预训练的权重
1.更有利于rpn等网络的权重初始化,前景和背景的区分使得rpn收敛的更快,而在ImageNet上预训练的结果则没有这样的优势。
2.如果使用的网络带DCN,预训练的时候用带DCN的预训练效果会更好,总而言之,预训练尽量为后续少走弯路。

4.3模型集成

直接nms
score加权集成
bboxes voting集成
专家单类替代【类分布少的专家,尺寸专家直接替代掉,不要和原来集成,可能集成了还不如只用专家模型

4.4调参

1.理解数据和算法!调的时候心里有底!
2.与模型复杂度无关的参数先在小的backbone上调试
3.控制变量法!不然就是瞎调!

比赛心态

1.学习第一,兴趣驱动
2.从入门到top,只需要一次认真的参赛
【认认真真把该学习的东西学习一遍,第二次基本上很快就能摸到top了】

答疑环节

  1. 线下的增强怎么做?
    增强可以对bbox内的框内的目标单独增强,比如人可能躺着、站着、坐着
  2. 本地好,线上不好,怎么办?
    答:随机划分可能存在线上线下分布不同,应该提前备案。
  3. 数据脏怎么办?
    标准的方式,半监督的清洗,官方数据train出来之后,再infer一下【一些与答案相差较大的,如果不允许人工标注就直接扔掉】。
  • 16
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java 数组是存储相同类型数据的集合,它们具有固定大小并且在创建后大小不可更改。在Java中,数组通过声明和初始化来创建。声明数组的语法形式如下: ```java int[] arr; // 声明了一个 int 类型的数组 ``` 在声明数组之后,需要通过初始化该数组,也就是为数组分配内存和赋初值。初始化数组的方式有两种:静态初始化和动态初始化。静态初始化是在声明数组的同时给数组元素赋初值的方法,语法形式如下: ```java int[] arr = {1, 2, 3, 4, 5}; // 静态初始化数组 ``` 动态初始化是在声明数组后通过循环或用户输入等方式给数组元素赋值的方法,语法形式如下: ```java int[] arr = new int[5]; // 动态初始化数组 for (int i = 0; i < arr.length; i++) { arr[i] = i + 1; } ``` Java 数组还具有一些常用的属性和方法,如`length`属性用来获取数组的长度,`clone()`方法用来复制数组,`toString()`方法用来将数组转换为字符串等。 除了一维数组外,Java 还支持多维数组,如二维数组、三维数组等。多维数组的声明和初始化方式与一维数组类似,只是需要使用多个`[]`来表示维度。 值得注意的是,Java 中的数组是引用类型,因此在传递数组参数时,实际上传递的是数组的引用,而不是数组的副本。这意味着在方法中对数组的修改会影响到原数组。 总的来说,了解和掌握 Java 数组的声明、初始化、属性和方法,并能灵活运用,对于 Java 编程是非常重要的。希望本文能够为大家提供关于 Java 数组的全面解析和干货知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值