目录
敏感度和召回率
对于一个特定的测试样本:
真阳性的含义为“AI预测正确,且AI预测结果为阳性”,那么就可以推断到:预测为阳性,实际结果为阳性。
假阴性的含义为“AI错判为阴性”,那么就可以推断到:预测为阴性,实际结果为阳性。
对正例的识别能力:叫敏感度(sensitivity) = TP/TP+FP,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力,又名真阳性率;
敏感度叫查准率,分母是全部预测为正例(阳性),包括:正确预测为正例TP+错误预测为正例FP(误检),分之是正确判断为正例(阳性)TP;
对覆盖面的度量:召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN);
召回率叫查全率,分母是全部实际的正例,包括:正确预测为正例(TP)+错误预测为负例FN(漏检);分之是正确判断为正例(阳性)TP;
- P(Positive)的含义:P = TP+FN; 预测为正例(阳性)
- N (Negative)的含义:N = TN+FP; 预测为负例(阴性)
- “真”(True)和“假”(False):表示预测结果是否正确。名称中的“阳性”(Positive)和“阴性”(Negative)表示预测结果。
- 真阳性(True Positive,TP):预测为阳性,实际为阳性;正确的预测为阳性
- 真阴性(True Negative,TN):预测为阴性,实际为阴性;正确的预测为阴性
- 假阳性(False Positive,FP):预测为阳性,实际为阴性;错误的预测为阳性
- 假阴性(False Negative,FN):预测为阴性,实际为阳性。错误的预测为隐性
- FP也称为误检(False alarm),错误的预测为阳性
- FN也称为漏报(miss detection)。错误的预测为阴性
总结:
TP、FP、TN、FN理解记忆:
(1)先看第二个字母,P代表做出正例的判定(比如理解为预测下雨这件事会发生),而N代表代表做出负例的判定(比如理解为预测下雨这件事不发生)
(2)然后看第一个字母,T代表模型做出的判定是正确(True)的(比如理解为天气预报的结果和实际当天情况符合),F代表模型做出的判定是正确(False )的(比如理解为天气预报的结果和实际当天情况不符合)
- 正确率(accuracy)
正确率是我们最常见的评价指标,accuracy = (TP+TN)/(P+N),这个很容易理解,就是被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好;
- 错误率(error rate)
错误率则与正确率相反,描述被分类器错分的比例,error rate = (FP+FN)/(P+N),对某一个实例来说,分对与分错是互斥事件,所以accuracy =1 - error rate;
- 灵敏度(sensitivity)-真阳性率(这两个指标,反映的是诊断试验本身的特性,即发现患者、确定非患者的能力)
sensitivity = TP/P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力,又名真阳性率;
- 特异度(specificity) -真阴性率(这两个指标,反映的是诊断试验本身的特性,即发现患者、确定非患者的能力)
specificity = TN/N,表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力,又名真阴性率;
- 召回率(recall)-查全率
召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN);
YOLO到底做了什么?
YOLO之前,双阶段(two-stage)的R-CNN系列算法在目标检测领域独占鳌头。先利用RPN(Region Proposal CNN)基于候选框提取的CNN网络生成感兴趣区域,再对该区域进行分类与位置回归。
优缺点:提升了精度,但限制了检测速度。
2016年,单阶段(one-stage)的YOLO(You Only Look Once) 初出茅庐。利用CNN卷积神经网络进行特征提取,并识别种类和位置。
优缺点:检测速度很快,但精度明显下降。
YOLO核心思想
把目标检测转变成一个回归问题。将整个图像作为网络的输入,仅仅经过一个神经网络,得到边界框的位置及其所属的类别。
YOLOV3的目标检测算法过程是什么?
假设我们眼里看到是这样一幅图,这是一只猫,你们一眼就可以知道这只猫在什么位置。但是计算机要怎么确定这个猫的位置呢?计算机在图片上画出这个框需要四个参数,分别是中心点的 X 轴、外轴、坐标框的高和宽。有了这四个参数之后,计算机就能确定猫的位置了。
将输入图像划分成 S ∗ S S * SS∗S个网格,如果一个物体的中心点落入一个grid cell(单元格)内,那么这个grid cell就负责检测这个物体。每一个grid cell预测B BB个bounding boxes,以及这些bounding boxes的分数。这个分数反映了模型预测这个grid cell是否含有物体,以及是这个物体的可能性是多少。
定义 c o n f i d e n c e ,如果这个 cell 中不存在物体,则得分为0 ;否则的话,分数为 predicted box(预测框)与ground truth(真实框)之间的 IoU(交并比)。
每个 bounding box 由五个预测值组成:x,y,w,h,confidence。坐标(x,y)代表了 bounding box 的中心点相对于 grid cell 边界的值,(w,h) 则是 bounding box 的宽和高相对于整幅图像的值,confidence 就是 IoU 值。
在测试阶段,把每个栅格的条件类别概率乘上每个 bounding box 的 confidence,这样既包含了 bounding box 包含物体的类别信息,也包含了预测框和真实框的符合程度。
图片划分为S × S S×SS×S个grid , 每个grid cell预测B BB个bounding boxes,类别数为C CC。预测值是一个S × S × ( B ∗ 5 + C ) S×S×(B*5+C)S×S×(B∗5+C)的张量。在论文中,使用 PASCAL VOC 数据集,S = 7 , B = 2 , C = 20 S=7,B=2,C=20S=7,B=2,C=20, 最终预测值为7 × 7 × 30 7×7×307×7×30的张量。
YOLOV3怎么样确定这四个参数的呢?
当一张图片被传入到 YOLOV3网络中时,首先被调整到 416 乘 416 的大小。为了防止失真,会在图像的边缘加上灰调之后,YOLOV3会将这幅图像分成 13 *13,26*26,52*522 的网格由于图像在多次卷积压缩后,小物体的特征容易消失,所以 52 * 52 的网格用于检测小物体。
13 * 13 的网格用于检测大物体。由于猫是一个比较大的物体,所以它有 13 * 13 的网格检测,每个网格点负责其右下角区域的检测。如果物体的中心点落在这个区域,这个物体的位置就由这个网格点来确定。总结而言,YOLOV3不过是把一张图片划分成不同的网络,每个网格点负责其右下角区域的预测。只要物体的中心点落在这个区域,这个物体就由这个网格点来确定。这就是 YOLO的原理了。
YOLO用实战案例说明过程?
图像位置:x,y,w,h
网格:13*13;26*26;52*52,图像化分为网格
环境配置:
Anaconda+Python3.7+CUDA7.4.1.5 ( 用 Cudnn10.0替换下面的包 )+pytorch
安装pytorch:
conda create -n pytorch python=3.6;
activate pytorch;
pip install 包名(torch-1.2.0-cp36-c-36m-win_amd64.whl);
pip install torchvision-0.4.0-cp36-cp36m-win_amd64.whl;
import torch
预测目标过程:
主干特征提取网络-》提取特征 输入一个416*416*3-》进行下采样,宽高会不断的被压缩,通道数不断扩张; 我们获得一堆的特征层,用来表示输入进来图片的特征; 52,52,256; 26,26,512 ;13,13,1024 ,一共做了5次卷积后变成 13,13,75-》13,13,3(3个先验框),25(20+1-先验框是否有物体+4个参数属于一个先验框)
输入图像尺寸:448×448(固定值,与全连接层的输出大小有关),经过24个卷积与2个全连接层后,最后输出的特征图为7x7x30。
在3x3的卷积后接1x1卷积,既降低了计算量,也提升了模型的非线性能力。
除最后一层使用线性激活函数外,其余层都使用Leaky ReLU激活函数。
在训练中使用Dropout与数据增强的方法来防止过拟合。
训练时的图像尺寸:224×224;测试时的图像尺寸:448×448。
原因:224×224×3 相比448×448×3相差四倍,其像素点大幅度降低,减少对计算机的性能要求。
YOLO算法的思想
先把图片划分为不同大小的网格,每个网格中都会先用3个先验框来识别是否真实的包含物体,如果位置不合适,可以调整框的位置,从而提取特征,采用特征金字塔的模式进行特征提取。
YOLO系算法的思想都是,首先通过特征提取网络对输入图像提取特征,得到一定大小的特征图(比如13*13),然后将输入图像划分网格成13*13个单元格,接着如果Ground Truth中某个目标的中心坐标落在哪个单元格中,那么就由该单元格来预测该目标,每个单元格都会预测固定数量的边界框(v1中是2个,v2中是5个,v3中是3个),这几个边界框中只有和Ground Truth的IOU最大的边界框才会被选定用来预测该目标。
先搞定核心的概念
1. layer
这一列顾名思义,是层名称。
数字是层编号,后面是层名称。
conv:卷积层。
res:shortcut层(跨层连接,借鉴 resnet 而来,所以用res表示)
yolo:YOLO层。
route:融合层,就是把层进行合并,然后输出到下一层。(后面再仔细讲)
upsample:上采样层。2. filters
这是对于 conv 来说的,代表过滤器的通道数,和后面 output 的通道数是一致的。
(上述的过滤器和常说的卷积核是一样的东西,就是卷积运算的那个动函数)
这一列中对应非 conv 层的数字在后面讲解各层时再说明。3. size
这一列和 filters 一样,也是只对于 conv 来说的,代表过滤器的大小和步长。
如:3 x 3 / 1,代表过滤器大小为 3*3,步长为 1。4. input
这一层的输入,416 x 416 x 3,代表输入大小为 416 x 416,通道数为 3。5. output
这一层的输出,416 x 416 x 32,代表输入大小为 416 x 416,通道数为 32。
YOLO V1的网络架构解析
目标检测任务通常需要图像的细节信息,YOLO v1将图像分辨率从224*224提高到448*448,该模型是一个卷积神经网络模型。
- 主干网络:24个卷积层,激活函数使用LeakyReLU函数。将输入图像分辨率调整到448∗448∗3,经过该主干网络后得到7∗7∗1024的特征图。其中,1*1卷积核用于控制特征图数量的增加或减少,捕捉深度上的模式;
- 检测头:将特征图展开成一维张量,经过第一个全连接层得到4096个特征,再经过第二个全连接层得到1470个特征;
- 维度变换:通过维度变换得到7∗7∗30的特征张量(每张图片的网格数是7*7的,每个格子对应30个特征值,其中30个特征值的前10个是两个候选框的值x,y,w,h,c,后面的20代表的是20个分类,即属于每个类别的概率)。
训练时,先在ImageNet数据集上预训练前20个卷积层用于提升性能,该数据集的图像分辨率是224*224*3,物体类型是1000个。然后,随机初始化后面4个卷积层和2个全连接层的权重,用于目标检测任务训练。
YOLO V1损失函数
看到这里读者或许会有疑问,YOLO里的每个格点,是怎么知道该预测哪个物体的?
这就是神经网络算法的能力。首先拿到一批标注好的图片数据集,按照规则打好标签,之后让神经网络去拟合训练数据集。训练数据集中的标签是通过人工标注获得,当神经网络对数据集拟合的足够好时,那么就相当于神经网络具备了一定的和人一样的识别能力。
神经网络结构确定之后,训练效果好坏,由损失函数和优化器决定。YOLO v1使用随机梯度下降法作为优化器。这里重点解读一下YOLO v1使用的损失函数。
损失函数由 4 个部分组成,均使用均方差损失。参数如下:共有 S2 个区域(7x7=49),B表示每个网格有2个边框,obj表示对应真实物体,noobj表示没有对应真实物体。
采用NMS非极大值抑制,提取每个网格预测的两个边框中,IoU最大的边框。
(1)位置误差:计算边框的预测值与真实值的位置误差。
前一个部分计算正样中心点坐标的损失,前一个部分计算正样本宽和高的损失。
其中:λcoord用于调整位置误差的权重。由于不同物体的尺寸大小对宽高差值影响极大,因此对w和h进行平方根处理,降低对物体尺度的敏感度,强化小物体的损失权重。
(2)置信度误差(obj):前景误差:计算边框与正样本的误差。
若边框的IoU大于置信度阈值,则该边界框属于前景。若存在多个满足要求的边框,则进行非极大值抑制。我们希望前景框的误差趋近于1。
(3)置信度误差(noobj):背景误差:计算边框与负样本的误差。
若边框的IoU小于置信度阈值或IoU=0,则该边界框属于背景。我们希望背景框的误差趋近于0。
其中:λnoobj用于调整负样本置信度损失的权重(默认为0.5)。由于背景框的数量远远大于前景框,故对背景框误差设置阈值(如:0.1),降低背景框误差对损失函数的影响。
(4)分类误差:计算每个边框得到的20个分类概率值与正样本的误差。
YOLO V1目标预测
在训练时,我们希望两个框同时工作,但真正计算损失的时候,我们只去对 IoU 最大的框进行梯度下降和修正。类似于一个相同的工作,让两个人一起做,为了保障工作正常完成。在训练最后,会发现两个框意见开始出现了分歧,比如一个框倾向于去检测细长型的物体。另一个框倾向于去检测扁宽型的物体。
总结一下就是,在训练阶段,输出的两个 Bbox 只会选择其中一个参与损失的计算(和 gd IoU大的那个)。
在测试阶段,输出的两个 Bbox 只有一个有实际预测的意义。通过前面讲解,可以看到 YOLO v1 至多只能预测 49 个目标,即每个“负责”区域输出一个目标。注意:我们可以使用不止 2 个 Bbox,理论上 Bbox 越多效果越好,但是效率会降低。作者取两个 Bbox 的原因是因为性能和效率的取舍。
YOLO V2训练策略
2017年,提出了yolov2和yolo9000,yolo9000能够实时检测超过9000种物体,主要检测网络还是yolov2。
yolov2的核心:主要解决yolov1召回率偏低以及定位精度不足的问题,但整体网络架构没有改变。
yolov2的特点:相比其它检测器,速度更快、精度更高、可以适应多种尺寸的输入图像。
主要区别:
(1)yolov1是利用全连接层直接预测Bounding Box的坐标。yolov2借鉴了Faster R-CNN的思想,引入Anchor机制,并利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率;
(2)同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测。
YOLO V2分类的训练策略
网络训练在 ImageNet 1000类分类数据集上训练了160epochs,使用随机梯度下降,初始学习率为0.1, polynomial rate decay with a power of 4, weight decay of 0.0005 and momentum of 0.9 。训练期间使用标准的数据扩大方法:随机裁剪、旋转、变换颜色(hue)、变换饱和度(saturation), 变换曝光度(exposure shifts)。在训练时,把整个网络在更大的448*448分辨率上Fine Turnning 10个 epoches,初始学习率设置为0.001,这种网络达到达到76.5%top-1精确度,93.3%top-5精确度。
YOLO V2检测的训练策略
网络去掉了最后一个卷积层,而加上了三个3 ∗ 3 3*33∗3卷积层,每个卷积层有1024个Filters,每个卷积层紧接着一个1 ∗ 1 1*11∗1卷积层。对于VOC数据,网络预测出每个网格单元预测五个Bounding Boxes,每个Bounding Boxes预测5个坐标和20类,所以一共125个Filters,增加了Passthough层来获取前面层的细粒度信息,网络训练了160epoches,初始学习率0.001,数据扩大方法相同,对COCO与VOC数据集的训练对策相同。
YOLOV3网络
在YOLO v3论文中,作者提出了一个名为Darknet-53的更深的特征提取器架构。正如其名称所示,它包含53个卷积层,每个卷积层后面跟随批量归一化层和Leaky ReLU激活函数。没有使用任何形式的池化,而使用带有步长2的卷积层来降采样特征图。这有助于防止池化经常归因于低级特征的丢失。
YOLO对输入图像的大小不变。然而,在实践中,由于我们在实现算法时可能遇到各种问题,因此我们可能希望坚持使用恒定的输入大小。
其中一个重要问题是,如果我们想以批量方式处理图像(GPU可以并行处理批量图像,从而提高速度),则需要所有图像具有固定的高度和宽度。这是将多个图像连接成大批量所需的。
网络通过称为网络步长的因素对图像进行下采样。例如,如果网络的步长为32,则大小为416 x 416的输入图像将产生大小为13 x 13的输出。通常,网络中任何一层的步长都等于该层的输出比输入图像小的因子。
- V3最大的改进就是网络结构,使其更适合小目标检测。
- 特征做的更细致,融入多持续特征图信息来预测不同规格物体。
- 先验框一共9种,3种scale,每种3个规格,通过聚类得到9个先验框。
- 大的先验框交给13*13, 中等交给26*26,小的交给52*52。
- softmax改进,预测多标签任务。
将V3和V2差异总结
- loss不同:作者v3替换了v2的softmax loss 变成logistic loss,而且每个ground truth只匹配一个先验框。
- anchor bbox prior不同:v2作者用了5个anchor,一个折衷的选择,所以v3用了9个anchor,提高了IOU。
- detection的策略不同:v2只有一个detection,v3一下变成了3个,分别是一个下采样的,feature map为13*13,还有2个上采样的eltwise sum,feature map为26*26,52*52,也就是说v3的416版本已经用到了52的feature map,而v2把多尺度考虑到训练的data采样上,最后也只是用到了13的feature map,这应该是对小目标影响最大的地方。
- backbone不同:这和上一点是有关系的,v2的darknet-19变成了v3的darknet-53,为啥呢?就是需要上采样啊,卷积层的数量自然就多了,另外作者还是用了一连串的3*3、1*1卷积,3*3的卷积增加channel,而1*1的卷积在于压缩3*3卷积后的特征表示,这波操作很具有实用性,一增一减,效果棒棒。
为什么有这么大的提高?v2和v3比,同样是416的feature map,v2作者当时也是做了很多尝试和借鉴,实现了匹敌SSD的效果,但是他因为被借鉴的内容所困扰,导致性能的停留,因此v3再借鉴,应该是参考了DSSD和FPN,这应该是之后的潮流了,做了一下结果性能提高很大,可能作者本人都没想到。