YOLO算法学习
借鉴GoogLeNet,有24个卷积层+2个全连接层:卷积层负责特征提取,全连接层做分类回归。
检测的步骤:
1.对图像缩放到448*448,图像分割为7*7(S*S)个Cell
2.利用卷积层对图像做特征提取;每个Cell中分析出两个(B个)最大概率的目标box,同时得到box的位置信息(中心坐标、高、宽)及box中物体存在的概率(confidence);针对分类目标的20种(C)结果,得到每个box中的目标对应20个种类的概率大小。
3.针对卷积网络得到的7*7*(5*2+20)维度(或者说是S*S*(5*B+C)维度)的信息,通过全连接层做类别和bbox回归,得到检测结果。
训练时候:
先用分类训练数据(imageNet)预训练分类网络:20层卷积层+平均池化+FC,输入图像为224*224
然后,将分类预训练的结果迁移到检测网络(448*448 20层conv+随机初始化的4层conv+2FC)进行分类训练
其中讲解的损失函数的构建过程也很有意思:
为坐标参数(8个)与类别参数(20个)之间的均衡性,引入了权重系数;坐标检测的权重系数明显比类别预测的权重大;
对object的confidence,由于大部分bbox中没有,为避免直接置零导致的不收敛,将含object的conficence预测的权重系数设为正常的1,不含object的权重系数设为低于1(0.5);
对分类的权重系数设为1,对于每一个object,只取IOU最大的box来专门负责其检测(准们的预测器只针对专门的类别);
对于不同的bbox大小,按照均方根计算位置偏移error,以避免线性计算导致的虽然计算的位置偏移值一致,但其实大bbox位置偏移相对来说并不严重,而小的bbox位置偏移太多这一现象。
在预测的时候:
每个bbox对应得到一个object的confidence值(Pobj | IOU)和classification信息(Pclass | Pobj),二者的乘机(class-specific confidence score)则代表每个bbox的分类概率及准确度信息;
在FC里对每个类别的confidence score进行排序,用阈值去掉较低的boxes,然后执行NMS(Non-Maximum Suppression)得到最终的分类框;
缺陷:
对中心靠近的物体和较小物体的检测效果不好,主要原因是一个网格中只预测了两个box(且只属于一类?);
泛化能力在物体表现出少见的长宽比及其他情况时较差;
影响到检测效果差的主要原因是定位误差,因为损失函数的构建中位置因素影响很大,特别表现在大小物体的处理上待加强。
训练细节:
作者在PASCAL VOC2007和PASCAL VOC2012数据集上进行了训练和测试。训练135轮,batch size为64,动量为0.9,学习速率延迟为0.0005. Learning schedule为:第一轮,学习速率从0.001缓慢增加到0.01(因为如果初始为高学习速率,会导致模型发散);保持0.01速率到75轮;然后在后30轮中,下降到0.001;最后30轮,学习速率为0.0001.
作者还采用了dropout和 data augmentation来预防过拟合。dropout值为0.5;data augmentation包括:random scaling,translation,adjust exposure和saturation。
YOLO2/YOLO9000在YOLO的基础上改进,主要体现在增强定位精度:有10条改进+联合训练+多层分类
Batch Normalization:批归一化,加速收敛
High Resolution Classifier:更高像素的分类图像数据(224-->448)
Convolutional With Anchor Boxes:作者去除了YOLO的全连接层,采用固定框(anchor boxes)来预测bounding boxes。首先,去除了一个pooling层来提高卷积层输出分辨率。然后,修改网络输入尺寸:由448×448改为416,使特征图只有一个中心。物品(特别是大的物品)更有可能出现在图像中心。采用anchor boxes,提升了精确度。YOLO每张图片预测98个boxes,但是采用anchor boxes,每张图片可以预测超过1000个boxes。
Dimension Clusters:anchor box的初始需要人工选择,人工选择合适的box能加快收敛。采用K-means聚类方法来自动选择最佳的初始boxes
Direct location prediction:保证和加快anchor box位置收敛的方法:预测位置匹配性
Fine-Grained Features:更精确的特征(finer grained features)可以提高对于小目标的检测。作者向网络加入passtrough层以增加特征。passthrough类似于ResNet,将高分辨率特征和低分辨率特征结合
Multi-Scale Training:在训练时,每隔几轮便改变模型输入尺寸,以使模型对不同尺寸图像具有鲁棒性。每隔10batches,模型随机选择一种新的输入图像尺寸(320,352,...608,32的倍数,因为模型下采样因子为32)。该训练规则强迫模型取适应不同的输入分辨率。模型对于小尺寸的输入处理速度更快,因此YOLOv2可以按照需求调节速度和准确率。在低分辨率情况下(288×288),YOLOv2可以在保持和Fast R-CNN持平的准确率的情况下,处理速度可以达到90FPS。在高分辨率情况下,YOLOv2在VOC2007数据集上准确率可以达到state of the art(78.6mAP)
darknet 中最重要的三个struct定义是 network_state, network, layer; 新版本network_state 已经并入到 network 里去了。
代码可以先忽略 gpu 部分,不同种类的网络层都是通过 layer 里面的函数指针 forward backward 和 update 定义本种类的执行规则。如 connected layer 就有 forward_connected_layer backward_connected_layer update_connected_layer 三个方法,gru layer 等也是一样;
原子运算只在 blas.c 和 gemm.c 里,网络的运算在 network.c 中,最重要的是 train_network_datum ,train_networks, train_network_batch 和 network_predict;
train_network_datum 是输入数据用 float_pair , 就是 float *x , float *y 结对;
im2col函数:将图像按照卷积核展开为以列排列的数组,从而将卷积运算转化为矩阵运算。
im2col的图解(含卷积乘部分):http://blog.csdn.net/mrhiuser/article/details/52672824
代码解释(部分地方有错误):http://blog.csdn.net/langb2014/article/details/51546208
转化之后使用sparse_gemm(sgemm)进行矩阵乘计算(可以同步将BN计算完成)。