系统学习CV-CNN ALL/QA

GPU云服务器

https://www.jikecloud.net/docs/inst-diffs-turtorial.html
https://www.matpool.com/

CNN

fast RCNN家族

传统的目标检测模型,一般使用多个不同尺度滑动窗口的方式来作为特征提取器与分类器的输入,但是这中方法计算量大,滑动窗口选择的区域没有目的性,生成的检测框冗余度高,遍历过程时间复杂度也高,传统的特征提取器能力弱于现代的CNN特征提取网络
RCNN在如何生成候选区域方面进行了改进,就是利用selective search方法生成候选区域,相比滑动窗口具有尺度性、且计算速度快,对目标具有更高的找回类率。同时利用CNN来进行特征提取
RCNN的缺点也很明显,就是selective search提取的感兴趣区域时速度仍然很慢,且提取的区域仍然有很多相互重叠的目标。并且CNN只能接受固定大小的输入,每个感兴趣区域都要输入到CNN中进行提取特征,速度很慢
Fast RCNN针对RCNN的问题,使用一个CNN对全图进行提取特征,然后将selective search得到的ROI映射到特征图中,得到ROI对应的特征区域,这样可以避免重复多次的CNN前向传播使用,减少计算时间。同时提出了ROI pooling层,使得模型可以接受不同尺度ROI的输入,并得到固定大小的ROI特征。最后不再使用SVM进行分类,而是将分类和边界框回归整合在一行框架中,从而使模型能够进行端到端的训练,在训练时使用了多任务损失函数
Fast RCNN还有缺点,selectiv search的使用,仍然是计算耗时严重的
Faster RCNN针对Fast RCNN的缺点提出了RPN网络 真正的实现端到端的训练。RPN本质上是根据预先生成的anchor并根据网络预测偏移量来微调anchor,从而代替selective search生成区域候选框
Mask RCNN 为了提高检测精度,在backbone中使用了FPN结构。再有ROI pooling投影存在量化问题,量化的过程会存在丢失部分信息,和多出部分信息的问题,因此Mask RCNN提出ROI Align结构进行替换,本质上就是利用双线性插值来获得像素点的信息,这样能够使用周围数据的所有信息 因此不存在信息丢失的问题,且没有对ROI区域进行量化处理,也就不存在对齐问题。最后Mask RCNN 为了实现图像分割,增加了一个mask branch 来实现逐像素的预测分割

RCNN

步骤

候选区域生成:利用selective Search方法生成1k-2k个候选区域
特征提取:对每个候选区域,使用CNN提取特征
类别判断:特征送入每一类的SVM分类器,类别是否始于该类
位置精修:使用回归器精细修正候选位置

selective search

计算速度快,具有很高的召回率,基于颜色、纹理、大小和形状兼容计算相似区域的分层分组

补充不同尺度、多样性、快速计算
见文档

调整图像区域

resize图像,使其满足CNN输入要求
各项异性缩放会导致不必要的失真,各项同性并paddIng是更好的选择

特征提取

生成该区域的4096维特征
原文使用的是alexnet,可以使用任意的backbone

类别判断

将4096维特征放入到CVM中进行判断,是否包含感兴趣物体,以及物体类别是什么
SVM是二分类分类器,每个类别都要使用一个SVM分类器,假设一共有20个类,那么需要20+1个SVM分类器,其中一个是背景

边界框回归

训练细节训练全是基于selective后的区域 来进行正负样本选择和边界框回归loss计算的
https://blog.csdn.net/u011974639/article/details/78053203

正负样本的选取

根据IOU选择,如果selective search生成的某一个候选区域和GT的边界框IOU>0.3,那么就是正样本,否则为负样本

CNN训练

迁移学习 fine tune
不使用SVM,而是CNN+全连接层+分类层+softmax,训练CNN
selective 和 GT: IOU>0.5为正样本,IOU<0.5为负样本
IOU=0.5是因为CNN模型容量过大,需要的数据多,所有要放宽限制,获得更多的数据,防止过拟合
CNN训练结束后,去掉 分类层+softmax ,得到4096维特征

SVM训练

直接用4096维特征进行训练
不直接使用分类层+softmax 是因为训练CNN的时候选择数据比较宽泛,选择的样本不够直接
不同于CNN 训练,selective 和GT:IOU大于0.7为正样本,IOU<0.3为负样本

RCNN-NMS

bbox集合B,bbox对应的得分S——这个得分是类别概率,还是是否存在目标的得分???(RNN应该没有是否存在目标这个预测值,因为在RPN中已经是候选区域了,所以进行NMS的时候就是根据每一类的预测概率进行排序)

见文档,最终要的就是排序步骤和IOU阈值选择

fast RCNN

https://zhuanlan.zhihu.com/p/79054417
针对RCNN的问题(每个候选区域都需要输入到CNN中提取特征,也就是需要使用selective search次CNN,再有一个问题是CNN只能接受固定尺寸的输入,可能导致信息丢失???

关键的改进

使用一个CNN对全图进行特征提取,并将selective search 得到的ROI 映射到特征图中,从而得到ROI对应的特征区域
得到ROI对应的特征,执行roi pooling得到固定尺寸的特征,然后进行softmax分类和bbox回归
优点

先用CNN提取特征,然后用投影的方式得到ROI特征,避免重复多次的CNN前项传播,减少计算时间
ROI pooling 层可以对输入的任意大小的ROI特征图进行处理,得到固定尺寸大小的特征,避免在对ROI图像进行操作导致信息损失的问题
不再使用SVM,从而将分类和bbox回归统一到一个框架中

投影量化

左上角坐标 ( x , y ) / s t r i d e (x,y)/stride (x,y)/stride,并向下取整,这里就存在量化损失,见文档

ROI Pooling

https://mp.weixin.qq.com/s/mLTKtKnx40MjH0V5NElNOA
本质上就是gird+max pooling

训练细节

RCNN是多阶段训练,fastRCNN是端到端训练(分类损失+位置损失
https://blog.csdn.net/u011974639/article/details/78053203(每个ROI(候选区域)都有一个损失,且每个类都有一个边界框回归模型???)
使用smooth L1损失(比L1收敛更快,比L2防止梯度爆炸)
采样策略???

faster RCNN (有时间再读原论文)

https://zhuanlan.zhihu.com/p/31426458
https://zhuanlan.zhihu.com/p/32404424
https://mp.weixin.qq.com/s/ogYlkwoTbfOqJi3zC22EqA(重要)
https://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/

code
[cannot import name ‘_mask’ from ‘pycocotools’](cannot import name ‘_mask’ from ‘pycocotools’)(百度)
https://blog.csdn.net/qq_41917697/article/details/114331008
https://www.cnblogs.com/FZfangzheng/p/10852141.html

https://www.bilibili.com/video/BV1R5411M7wN?p=2

https://blog.csdn.net/watermelon1123/article/details/99570700
https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_object_detection/faster_rcnn
https://www.bilibili.com/video/BV1of4y1m7nj?p=3

关键改进

用RPN 来代替seletive search

RPN

文档中的图很重要
目的

输入是特征图(不是原始图像),在特征图上根据特征信息得到推荐的感兴趣区域ROI,并对ROI进行判定,判断其实前景还是背景,并修正Bbox的位置(在目标检测模块中有二次修正bbox的步骤)
输出是anchor的信息(前景or背景,bbox的值)

细节

RPN中也使用了anchor概念,anchor是在特征图(也就是RPN的输入)上(在特征图的每个元素上)设置的9个不同的anchor(3个不同的尺度和3的不同的比例)——目的就是要进行多尺度的识别
预测:(特征图的每个点)预测2K个前景or背景+4K个边界框参数,这个边界框参数对应的是anchor
预测有两个分支

前景背景分类分支:对特征图进行1 * 1的卷积,输出18维通道(也就对应了2k个值)
边界框回归分支:对特征图进行1 * 1的卷积,输出36=4*9维通道(也就对应了4k个值)

RPN的anchor采样

对于每个GT,选择和GT IOU最高的anchor做为正样本
对于剩下的anchor,选择和任意GT 的IOU大于0.7的anchor作为正样本
负样本直接从与GT IOU小于0.3的anchor中选择
每张图片的RPN正负样本的总数不超过256,其中正样本的占比=0.5

其他流程和实现细节见源码和自己的xmind笔记(重要)

faster RCNN backbone输出的分辨率要比yolov3的分辨率要大,所以faster RCNN 在小目标检测上要好于yolov3

mask RCNN

没有仔细看实现细节,重点看roi align

roi Align

问题

ROI pooling投影存在量化问题,量化的过程会存在丢失部分信息,和多出部分信息的问题

解决

双线性插值 来获得虚拟像素点的信息
即:使用了周围数据的所有信息 因此不存在信息丢失的问题,且没有对ROI区域进行量化处理,也就是说所有点的位置与原始(图像)的点是一一对应的,不存在对齐问题

yolo家族

https://zhuanlan.zhihu.com/p/70387154
https://zhuanlan.zhihu.com/p/297965943(重要)
https://zhuanlan.zhihu.com/p/143747206(重要)
https://zhuanlan.zhihu.com/p/136382095

yolov1

https://zhuanlan.zhihu.com/p/32525231
https://zhuanlan.zhihu.com/p/68149466
https://zhuanlan.zhihu.com/p/166254616(重要)
https://www.zhihu.com/search?type=content&q=yolov1

S × S S{\times}S S×S 每个grid-cell 负责检测那些中心点落在该格子内的目标
B B B 预测B个Bbox B ( 5 + c o n f i d e n c e s c o r e ) B(5+confidence_score) B(5+confidencescore)
c o n f i d e n c e s c o r e confidence_score confidencescore Bbox置信度=边界框包含目标的可能性*边界框准确度(以IOU来衡量)
C C C一个grid-cell 预测C个类别
还有一个类别置信度的概念: conf_score与类别概率的乘积
最终 7 × 7 × ( B × 5 + c ) 7{\times}7{\times}(B{\times}5+c) 7×7×(B×5+c)

训练注意事项
https://zhuanlan.zhihu.com/p/166254616(重要)

GT 就是以GTbbox的中心点及其对应的grid-cell为参考,包括xywh,score,p(i)
然后网络是直接预测和回归上面这些参数的 并送入loss 没有调整anchor的过程,因为V1没有使用anchor
只有与GTIOU最大的那个预测框 才会被认为是正样本 用于计算损失
在NMS(注意NMS是在推理中使用)中是按照bbox置信度考虑排序,而不是其他参数

损失函数要重点理解

yolov2

https://www.paddlepaddle.org.cn/tutorials/projectdetail/2162949#anchor-15
https://zhuanlan.zhihu.com/p/35325884
https://mp.weixin.qq.com/s/UHSHdGL3GucmUozglmZESw
相比V1

使用了BN
使用高分辨率分类样本进行微调
使用anchor 来提升召回率(提高召回率的同时,可以进行多尺度检测)
每个grid cell 按照anchor数量进行预测,同时对每个anchor预测(xyxy+c)+P
聚类提取anchor 降低微调anchor的难度
借鉴了RCNN中的方法边界框回归方法,但是约束了边界框的回归范围,这是因为RCNN的边界框回归方式在训练初期容易不稳定
边界框置信度也做了 σ {\sigma} σ约束
passthrough 拆分提高对细粒度特征的监测,使得特征图中保留一些细节信息
多尺度训练,使得能够使用各种尺度大小的对象

anchor 聚类

参考代码

https://github.com/ybcc2015/DeepLearning-Utils/tree/master/Anchor-Kmeans
https://zhuanlan.zhihu.com/p/109968578

https://blog.csdn.net/just_sort/article/details/103386047
https://zhuanlan.zhihu.com/p/165525977

yolov3-损失函数部分还要看

https://www.paddlepaddle.org.cn/tutorials/projectdetail/2162949#anchor-15(重要)
https://zhuanlan.zhihu.com/p/76802514(重要)
https://zhuanlan.zhihu.com/p/49995236(重要)
https://mp.weixin.qq.com/s/nr6HdT7FKGmxNSEV7zB16w(重要)
自己的技术报告
相比V2

注意体现在三个方面
调整网络结构——多尺度检测(注意不是多尺度训练),当然v3也使用了多尺度训练
Bbox预测
logistic 分类取代softmax分类,使得类别预测不互斥,也就是多标签分类

其他补充

借鉴了resnet,同时没有pooling层,用卷积操作代替下采样,防止有效信息的丢失,这对小目标检测是友好的

yolov4

https://mp.weixin.qq.com/s/IQuPWNv_g9Vh9HUd0BFMFA
https://zhuanlan.zhihu.com/p/149239211(还没看)
相比V3

输入端

离线在线增强,Mosaic和mixup,cmBN(原作没有使用,因为使用的时候有问题),SAT自对抗训练(没听过)(blog说影响并不大)

backbone

CSP+Mish激活函数
bropblock

neck

FPN+PAN SPP

预测和loss

CIOU_loss+DIOU_NMS

Mosaic

https://www.bilibili.com/video/av200532949/
https://zhuanlan.zhihu.com/p/174019699
随机缩放,随机分布拼接,增加了小目标,提高小目标精度、丰富检测背景
提高计算效率,BN时使用的数据更多

CSP

https://zhuanlan.zhihu.com/p/116611721
增加CNN特征学习能力
减少计算量的同时保持精度
降低资源消耗

Mish

激活函数见 下面激活函数部分

dropblock

起到正则化的作用
cutout属于数据增强,作用于输入端
dropblock作用于特征图

spp

https://blog.csdn.net/qq_38109282/article/details/117293611
https://blog.csdn.net/qq_39056987/article/details/104327638
实现多尺度的融合

Aspp

https://zhuanlan.zhihu.com/p/343605155
spp是pooling+concat
Aspp是空洞卷积+concat

FPN+PAN

FPN 传递语义信息
PAN 传递定位信息
直接见yolov5源码

label smooth

label smooth 让网络不要过于自信,也就是防止网络过拟合,使得类间距更大
yolov5视频讲解

yolov5

https://mp.weixin.qq.com/s/IQuPWNv_g9Vh9HUd0BFMFA
https://zhuanlan.zhihu.com/p/172121380
https://github.com/ultralytics/yolov5/issues/280(网络结构图)

code解读

https://blog.csdn.net/weixin_36714575/category_10816714.html
https://blog.csdn.net/weixin_42716570/article/details/112993638
https://blog.csdn.net/mary_0830/category_9537792.html?spm=1001.2014.3001.5482
https://zhuanlan.zhihu.com/p/183838757
https://blog.csdn.net/xiaoleige0713/article/details/114261794
https://blog.csdn.net/qq_21539375/article/details/118501448
https://blog.csdn.net/sinat_38213499/article/details/118155398
https://blog.csdn.net/q1u1ng/category_10215618.html
https://www.zhihu.com/people/yi-kou-xie-rong-tian?utm_source=qq&utm_medium=social&utm_oi=1126440820345319424
https://blog.csdn.net/tpz789/article/details/108844004
其他
https://github.com/pprp/datawhale_cv_competition
https://flyfish.blog.csdn.net/article/details/117594265
csdn[yolov5添加]

补充

边界框预测

这里与yolov3/4不同
https://blog.csdn.net/flyfish1986/article/details/117425996
https://www.bilibili.com/video/BV19K4y197u8?p=12
https://blog.csdn.net/weixin_36714575/article/details/114238645
https://blog.csdn.net/qq_21539375/article/details/118279022
https://github.com/ultralytics/yolov5/issues/471

损失函数

https://www.bilibili.com/video/BV19K4y197u8?p=11&spm_id_from=pageDriver

NMS实验

https://github.com/Zzh-tju/yolov5
https://blog.csdn.net/qq_33270279/article/details/103721790

FPN家族

BiFPN

https://mp.weixin.qq.com/s/WYG0XAhoPTOn_qCilT9yfw

采样策略

(不同的算法具有不同的采样策略,这里不进一步展开)
anchor生成与设置

为了避免漏检,需要尽可能保证anchor的大小和宽高与待测物体尺寸基本一致,只有这样才能让物体与anchor的重叠IOU较大,从而被判定为正样本
从而导致 训练 时没有一个anchor与目标的IOU大于阈值,从而被判定为负样板,从而造成漏检
实际中,Anchor的设置会按照数据集中的物体的尺寸的 实际分布 来进行设置,也就是对所有物体的Bbox标签匡高比进行统计,然后从统计结果中选择那些比例最为接近的anchor尺寸

NMS家族

普通NMS可以看见上面RCNN家族

在yolo中一般是根据边界框置信度(v5使用的是类别置信度)进行每一类的nms排序

softmax-NMS

https://blog.csdn.net/c2250645962/article/details/106210819
https://blog.csdn.net/qq_23944915/article/details/115107566
就是更改置信度得分,还是每次取出最大的得分的Bbox,IOU越大惩罚的越重

Merge-NMS

直接见yolov5源码

DIOU-NMS

还有一个是博客中看到的(要查一下)

loss 与梯度

https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650732724&idx=4&sn=5230b8bb1811cda38ab97afb417d1613&chksm=871b3ccab06cb5dcdf0bdfadcc7ae85d8ae95588bed0b884a55ba50b76d541771104675fbb3e&scene=21#wechat_redirect(从神经元的角度考虑)
https://zhuanlan.zhihu.com/p/98863801(很重要,没看完!!!)

正则化
https://editor.csdn.net/md?articleId=117122309

l1 / l2 smoothl1

https://www.zhihu.com/search?type=content&q=l1%E6%8D%9F%E5%A4%B1%E5%92%8Csmooth%20l1

focal loss

https://zhuanlan.zhihu.com/p/49981234
https://blog.csdn.net/qq_38253797/article/details/116292496?spm=1001.2014.3001.5501

IOU损失家族

https://zhuanlan.zhihu.com/p/359982543
https://zhuanlan.zhihu.com/p/94799295(code)
https://www.bilibili.com/video/BV1ZC4y147DV?from=search&seid=8067738630989770213(1:44:03)
https://zhuanlan.zhihu.com/p/143747206
L2(MSE)损失不能正确的反应Bbox与GT之间的位置关系,因此IOU损失被提出

IOU

l o s s = − l n ( I O U ) loss=-ln(IOU) loss=ln(IOU)
更常见的形式 l o s s = 1 − I O U loss=1-IOU loss=1IOU
缺点:如果Bbox与GT不相交或者完全包含,那么IOU=0,loss梯度为0,无法优化
IOU无法区别对齐方向(也就是相对位置)

GIOU

l o s s = 1 − G I O U loss=1-GIOU loss=1GIOU
考虑了Bbox和GT的重叠方式,用到了闭包区域(Bbox和GT的并集最小包围框)
缺点:收敛慢,回归不够准确,只解决了不相交的情况,没有解决完全包含的情况

DIOU

l o s s = 1 − D I O U loss=1-DIOU loss=1DIOU
考虑了二者之间的距离、重叠率和尺度,回归更加稳定,训练不发散,收敛快
也就是解决了GIOU完全包围情况下的位置关系

CIOU

l o s s = 1 − C I O U loss=1-CIOU loss=1CIOU
引入宽高比的概念

anchor - free(有时间再看)

其他网络结构

https://zhuanlan.zhihu.com/p/28749411(没看,待看)

分组卷积 / 深度可分离卷积

https://zhuanlan.zhihu.com/p/65377955
深度可分离卷积很好理解,分组卷积不好理解 c o u t g ∗ g \frac{c_{out}}{g}*g gcoutg也就是卷积核不共享组

每组利用 c o u t g \frac{c_{out}}{g} gcout个卷积核,每个卷积核的维度是 c i n g ∗ h ∗ w \frac{c_{in}}{g}*h*w gcinhw
pytorch: c o u t ∗ c i n g r o u p ∗ h ∗ w = g ∗ ( c o u t g r o u p ∗ c i n g r o u p ∗ h ∗ w ) c_{out}*\frac{c_{in}}{group}*h*w=g*(\frac{c_{out}}{group}*\frac{c_{in}}{group}*h*w) coutgroupcinhw=g(groupcoutgroupcinhw)

全局平均池化

https://zhuanlan.zhihu.com/p/164716705

自适应平均池化

https://blog.csdn.net/qq_41997920/article/details/98963215
https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/AdaptiveAvgPool2D_cn.html#adaptiveavgpool2d

1*1卷积与小卷积核

小卷积核:减少参数量,增加非线性,增加模型深度
1 * 1 : 降维、同小卷积核,且增强通道相关性核多样性

add 和 concat

https://blog.csdn.net/weixin_40446557/article/details/89191113
https://blog.csdn.net/jj0629/article/details/103825437
https://www.zhihu.com/search?type=content&q=add%20%E5%92%8C%20concat

哔哩哔哩pytorch框架(还没看)

BN家族

https://zhuanlan.zhihu.com/p/166101119

BN

用于数据标准化,防止梯度消失(和梯度爆炸?)
减少参数初始化对网络的影响
收敛更快,可以使用更大的学习率
https://www.bilibili.com/video/BV1Lx411j7GT?from=search&seid=16114684765682505473
https://www.bilibili.com/video/BV1bx411V798?from=search&seid=28822509775837685
https://www.bilibili.com/video/BV1Mx411L7v7?from=search&seid=28822509775837685
https://blog.csdn.net/qq_25737169/article/details/79048516
两个可学习的参数

γ {\gamma} γ β {\beta} β 用于缩放和平移,能够保留输入有用的信息

layer Normalization / instance Normalization

简单了解没深入
https://www.zhihu.com/search?type=content&q=layer%20normalization

group BN

https://zhuanlan.zhihu.com/p/35005794

激活函数家族

https://mp.weixin.qq.com/s/MFqiWPJgI9y6fGL16FMdCg
https://zhuanlan.zhihu.com/p/172254089(重要)

输出正值说明是有效信息,负值说明无效
激活函数负(左侧)是为了防止神经元死亡和梯度更新的锯齿效应,加快收敛速度

sigmoid

软饱和,梯度消失,输出为非0均值

tanh

输出0均值,比sigmoid收敛速度快
软饱和,梯度消失

Relu

正值,非饱和,避免梯度消失
负值,硬饱和,直接造成神经元死亡

leaky Relu/PRelu

解决Relu硬饱和问题

ELU

左侧软饱和,右侧非饱和,输出近似0均值
左侧软饱和对输入变化或噪声更鲁棒
软饱和到-1

softPlus

会发生梯度消失

Swish

不错

Mish

略优于Swish

模型评估家族

分类top1/top5

https://blog.csdn.net/ha010/article/details/80742906

P/R

precision

精确度 T P T P + F P \frac{TP}{TP+FP} TP+FPTP
recall
召回率 T P T P + F N \frac{TP}{TP+FN} TP+FNTP

F1

与P-R有关,反应了综合性能
相当于调和平均 评估模型的总体性能

F 1 = 2 × P × R P + R F1=2{\times}\frac{P{\times}R}{P+R} F1=2×P+RP×R

ROC/AUC

ROC的面积是AUC

PR曲线/AP

不同recall 下的 precision
MS COCO https://cocodataset.org/#detection-eval
https://aistudio.baidu.com/aistudio/education/lessonvideo/687008
https://zhuanlan.zhihu.com/p/107989173?from_voters_page=true
https://zhuanlan.zhihu.com/p/88896868

就是AUC (IOU阈值不同PR不同,AP也不同)
11点插值,得到AP_11
全点插值,得到AP_all

MAP

平均AP in 所有的类别
MS COCO https://cocodataset.org/#detection-eval

度量目标检测器对所有类别的精度,即AP的平均
mAP=1/N * (sum(AP))

Datasets

PASCAL VOC

ULR:

https://pjreddie.com/projects/pascal-voc-dataset-mirror/
https://www.kaggle.com/zaraks/pascal-voc-2007
https://www.kaggle.com/huanghanchina/pascal-voc-2012
http://host.robots.ox.ac.uk/pascal/VOC/
http://host.robots.ox.ac.uk:8080/leaderboard/main_bootstrap.php
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/guidelines.html

官方建议使用train+val进行训练
2010年换了AP计算方法

数据格式

Annotations
	xxxx.xml
Imagesets
	Main
		cls_train.txt
			xxxx -1
			xxxx -1
		cls_val.txt
		train.txt
		val.txt
		trainval.txt
JPEGImages
	xxxx.jpg

bbox坐标格式

xyxy 绝对值 min/max

MS COCO

得不到测试集的标签

2014= train(83)+val(41)+test(41)
2015=train(83)+val(41)+test(81)
2017=train(118)+val(5)+test(41|dev\challenge)
test-dev就是2017test|dev
minival train(80)+35val_subset evaluate on 5valsubset

建议在2017train and val上训练

ULR:

https://pjreddie.com/projects/coco-mirror/

数据格式

coo2017
	train2017
	val2017
		annotations
			instances_train.json
			instances_val.json

bbox坐标格式

xywh 绝对值 左上角+高宽

评估指标和计算方法-(一定要看还没看)
COCOAPI

"""
一个目标的标注信息: dict
    -- segmentation
    -- area
    -- iscrowd
    -- image_id 所属的图片
    -- category_id 91类别里边的
    -- id 该目标的id

coco
    -- anns:dict
        -- 一个目标:标注信息 : dict
    -- catToImgs: type(defaultDict:80)
        按category_id分:list
        -- 图片 也就是每个类对应的图片id :dict
    -- cats:dict
        80个元素 但是对应的是91个类别里边的类id
    -- dataset:dict
        完整的数据集表示
        --info
        --licenses
        --images
        --annotations
        --categories
    --imgToAnns
        (用来过滤没有标签的样本)
        -- img_id: 标注 :dict
    --imgs:dict
        -- img_id : 图片信息 :dict

# 得到满足条件的目标的id 
coco.getAnnIds(imgIds,catIds,areaRng,iscrowd)
    得到对应img_id 也就是这张图片下的所有目标id  
    getAnnIds 可以传入一个图片的id 也可以传入所有图片id组成的list
    还可以传入其他参数

# 得到满足条件的类别的cat_id
coco.getCatIds(catNums=[],supNums=[])
    catNums:List[str] 指定类
    supNums:List[str] 对应的超类

# 得到满足条件的图像ID
coco.getImgIds(imgsIds,catIds)
    imgIds:List[]
    catIds:list[]
    

# 得到满足条件的标注信息
coco.loadAnns(ids)
    ids:List[]
    传入的是目标id
    返回List[dict{标注信息}]

# 得到满足条件的图像信息
coco.loadImgs(ids)
    ids:List[]
    传入的是图像id
    返回的是List[dict{图像信息}]
# 得到满足条件的类别信息
coco.loadCats(ids)
    ids:List[]
    传入的是类别id
    返回的是List[dict{类别信息}]
    
# 
coco.loadRes(resFile)
    resFile 算法保存的结果文件,json文件 根据官方格式进行计算
    json:
        [
            {
                'image_id':图片的id,
                'category_id':对应于91类中的类别id,
                'bbox':[
                        左上角xy,宽高
                ],
                'score':该类的预测概率
            },
            {
                xxx
            }
        ]
        
# 评估
from pycocotools.cocoeval import COCOeval

coco_evaluator=COCOeval(cocoGt=COCO(annotation_file=xxx),cocoDt=coco.loadRes(xxx),iouType='bbox)
coco_evaluator.evaluate()
coco_evaluator.accumulate()
coco_evaluator.summarize()
"""

https://blog.csdn.net/qq_37541097/article/details/112248194
https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocoEvalDemo.ipynb

半自动标注

https://github.com/tzutalin/labelImg
https://zhuanlan.zhihu.com/p/337363286

训练问题

https://blog.csdn.net/weixin_44791964/article/details/107517428 (重要)

好用的库/website

timm

https://github.com/rwightman/pytorch-image-models
https://fastai.github.io/timmdocs/
https://rwightman.github.io/pytorch-image-models/
https://mp.weixin.qq.com/s/tvt8pfKUSV8lcPbTVDIZig

paperswithcode

https://paperswithcode.com/lib/timm

小目标检测

问题与改进思路

1.特征融合
2.上下文分析

局部上下文 – 大卷积核
语义上下文 – 高层特征
空间上下文

3.类别不平衡

数据采样 – 随机采样,在线采样,硬采样(选择子集)、软采样(设置样本权重)
损失函数 – 权重

4.正样本太少

多尺度、增多小目标anchor

1.多尺度
2.数据增强
3.训练策略
4.上下分分析
5.GAN
6.数据集

VOC、COCO Caltech\KITTI(行人车辆) SOD小目标数据集(与自动驾驶无关)

策略

多尺度训练——训练策略
可变性、膨胀卷积 ——模型结构
SNIP SNIPER (SNA)——训练策略(计算复杂度高)(从综述来看效果好)
focal loss——损失函数
过采样和复制——数据增强(计算复杂度高)
PGAN(貌似不是很好) MTGAN——基于GAN (MTGAN可以试试)
高分辨率输入提高小目标的检测性能
SCAN——上下文信息

我的想法注意力机制(SENet+FFT)
其他数据增强方法+p6
https://github.com/gene-chou/EFPN-detectron2/blob/master/detectron/modeling/backbone/ftt.py
https://github.com/zzl-pointcloud/Data_Augmentation_Zoo_for_Object_Detection

我的另一个想法

BiFPN+sspnet+attention+focal loss +aspp+数据增强+ 其他调参技巧
stitcher可以考虑

CNN-问题

https://zhuanlan.zhihu.com/p/113443895

lesson5

  • hook
  • optimizer groups
  • 学习率
  • weight decay
  • nn.ParameterList
  • 梯度爆炸
  • batch_size 和learning_rate选择

lesson6

  • 相邻的一些特征放在一起,会更容易得到“解”
  • 卷积padding实验
  • 学习率怎么调整
  • matlibplot

lesson8

numpy pytorch reshape
加深宽度和加大深度的作用
pooling层的作用

datasets

  • coco minival

复杂度计算

  • FLOPS

lesson9

-ResNet

  • 如何设置batchsize 和lr
  • 调整batchsize 和lr后另一个怎办
  • loss抑制不下降的时候怎办(减小学习率)
  • 学习率衰减怎选取合适
  • 优化算法怎么选取合适
  • 权重选择应该怎么选择

实验中:如果loss怎么都不下降,精度和验证都不下降,考虑是模型的问题,要不要换一个更大的模型
过拟合就要考虑采用防止过拟合的方法
目标数据集合源数据集的情况,是否选择微调
加入通道注意力机制泛化能力更强,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值