精华内容
参与话题
问答
  • 目标检测】Faster RCNN算法详解

    万次阅读 多人点赞 2016-04-21 15:08:06
    继RCNN,fast RCNN之后,目标检测界的领军人物Ross Girshick在2015年提出faster RCNN。目标检测速度达到15fps。

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information Processing Systems. 2015.

    本文是继RCNN[1],fast RCNN[2]之后,目标检测界的领军人物Ross Girshick团队在2015年的又一力作。简单网络目标检测速度达到17fps,在PASCAL VOC上准确率为59.9%;复杂网络达到5fps,准确率78.8%。

    作者在github上给出了基于matlabpython的源码。对Region CNN算法不了解的同学,请先参看这两篇文章:《RCNN算法详解》《fast RCNN算法详解》

    思想

    从RCNN到fast RCNN,再到本文的faster RCNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
    这里写图片描述

    faster RCNN可以简单地看做“区域生成网络+fast RCNN“的系统,用区域生成网络代替fast RCNN中的Selective Search方法。本篇论文着重解决了这个系统中的三个问题:

    1. 如何设计区域生成网络
    2. 如何训练区域生成网络
    3. 如何让区域生成网络和fast RCNN网络共享特征提取网络

    区域生成网络:结构

    基本设想是:在提取好的特征图上,对所有可能的候选框进行判别。由于后续还有位置精修步骤,所以候选框实际比较稀疏。
    这里写图片描述

    特征提取

    原始特征提取(上图灰色方框)包含若干层conv+relu,直接套用ImageNet上常见的分类网络即可。本文试验了两种网络:5层的ZF[3],16层的VGG-16[[^-4]],具体结构不再赘述。
    额外添加一个conv+relu层,输出5139256维特征(feature)。

    候选区域(anchor)

    特征可以看做一个尺度5139的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{1282,2562,5122}×\{128^2, 256^2, 512^2 \}\times{1282,2562,5122}×三种比例{1:1,1:2,2:1}\{ 1:1, 1:2, 2:1\}{1:1,1:2,2:1}。这些候选窗口称为anchors。下图示出5139个anchor中心,以及9种anchor示例。
    这里写图片描述

    在整个faster RCNN算法中,有三种尺度。
    原图尺度:原始输入的大小。不受任何限制,不影响性能。
    归一化尺度:输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor在这个尺度上设定。这个参数和anchor的相对大小决定了想要检测的目标范围。
    网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224*224。

    窗口分类和位置精修

    分类层(cls_score)输出每一个位置上,9个anchor属于前景和背景的概率;窗口回归层(bbox_pred)输出每一个位置上,9个anchor对应窗口应该平移缩放的参数。
    对于每一个位置来说,分类层从256维特征中输出属于前景和背景的概率;窗口回归层从256维特征中输出4个平移缩放参数。

    就局部来说,这两层是全连接网络;就全局来说,由于网络在所有位置(共51*39个)的参数相同,所以实际用尺寸为1×1的卷积网络实现。

    实际代码中,将51399个候选位置根据得分排序,选择最高的一部分,再经过Non-Maximum Suppression获得2000个候选结果。之后才送入分类器和回归器。
    所以Faster-RCNN和RCNN, Fast-RCNN一样,属于2-stage的检测算法。

    区域生成网络:训练

    样本

    考察训练集中的每张图像:
    a. 对每个标定的真值候选区域,与其重叠比例最大的anchor记为前景样本
    b. 对a)剩余的anchor,如果其与某个标定重叠比例大于0.7,记为前景样本;如果其与任意一个标定的重叠比例都小于0.3,记为背景样本
    c. 对a),b)剩余的anchor,弃去不用。
    d. 跨越图像边界的anchor弃去不用

    代价函数

    同时最小化两种代价:
    a. 分类误差
    b. 前景样本的窗口位置偏差
    具体参看fast RCNN中的“分类与位置调整”段落

    超参数

    原始特征提取网络使用ImageNet的分类样本初始化,其余新增层随机初始化。
    每个mini-batch包含从一张图像中提取的256个anchor,前景背景样本1:1.
    前60K迭代,学习率0.001,后20K迭代,学习率0.0001。
    momentum设置为0.9,weight decay设置为0.0005。[4]

    共享特征

    区域生成网络(RPN)和fast RCNN都需要一个原始特征提取网络(下图灰色方框)。这个网络使用ImageNet的分类库得到初始参数W0W_0W0,但要如何精调参数,使其同时满足两方的需求呢?本文讲解了三种方法。
    这里写图片描述

    轮流训练

    a. 从W0W_0W0开始,训练RPN。用RPN提取训练集上的候选区域
    b. 从W0W_0W0开始,用候选区域训练Fast RCNN,参数记为W1W_1W1
    c. 从W1W_1W1开始,训练RPN…
    具体操作时,仅执行两次迭代,并在训练时冻结了部分层。论文中的实验使用此方法。
    如Ross Girshick在ICCV 15年的讲座Training R-CNNs of various velocities中所述,采用此方法没有什么根本原因,主要是因为”实现问题,以及截稿日期“。

    近似联合训练

    直接在上图结构上训练。在backward计算梯度时,把提取的ROI区域当做固定值看待;在backward更新参数时,来自RPN和来自Fast RCNN的增量合并输入原始特征提取层。
    此方法和前方法效果类似,但能将训练时间减少20%-25%。公布的python代码中包含此方法。

    联合训练

    直接在上图结构上训练。但在backward计算梯度时,要考虑ROI区域的变化的影响。推导超出本文范畴,请参看15年NIP论文[5]。

    实验

    除了开篇提到的基本性能外,还有一些值得注意的结论

    • 与Selective Search方法(黑)相比,当每张图生成的候选区域从2000减少到300时,本文RPN方法(红蓝)的召回率下降不大。说明RPN方法的目的性更明确
      这里写图片描述

    • 使用更大的Microsoft COCO库[6]训练,直接在PASCAL VOC上测试,准确率提升6%。说明faster RCNN迁移性良好,没有over fitting。
      这里写图片描述


    1. Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2014. ↩︎

    2. Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015. ↩︎

    3. M. D. Zeiler and R. Fergus, “Visualizing and understanding convolutional neural networks,” in European Conference on Computer Vision (ECCV), 2014. ↩︎

    4. learning rate-控制增量和梯度之间的关系;momentum-保持前次迭代的增量;weight decay-每次迭代缩小参数,相当于正则化。 ↩︎

    5. Jaderberg et al. “Spatial Transformer Networks”
      NIPS 2015 ↩︎

    6. 30万+图像,80类检测库。参看http://mscoco.org/。 ↩︎

    展开全文
  • 目标检测】RCNN算法详解

    万次阅读 多人点赞 2016-04-05 23:10:36
    深度学习用于目标检测的RCNN算法

    Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2014.

    Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作。作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖,如今供职于Facebook旗下的FAIR。
    这篇文章思路简洁,在DPM方法多年平台期后,效果提高显著。包括本文在内的一系列目标检测算法:RCNN, Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码

    思想

    本文解决了目标检测中的两个关键问题。

    问题一:速度

    经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上提取特征,进行判断。

    问题二:训练集

    经典的目标检测算法在区域中提取人工设定的特征(Haar,HOG)。本文则需要训练深度网络进行特征提取。可供使用的有两个数据库:
    一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。
    一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。
    本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。

    流程

    RCNN算法分为4个步骤

    • 一张图像生成1K~2K个候选区域
    • 对每个候选区域,使用深度网络提取特征
    • 特征送入每一类的SVM 分类器,判别是否属于该类
    • 使用回归器精细修正候选框位置
      这里写图片描述

    候选区域生成

    使用了Selective Search1方法从一张图像生成约2000-3000个候选区域。基本思路如下:

    • 使用一种过分割手段,将图像分割成小区域
    • 查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置
    • 输出所有曾经存在过的区域,所谓候选区域

    候选区域生成和后续步骤相对独立,实际可以使用任意算法进行。

    合并规则

    优先合并以下四种区域:

    • 颜色(颜色直方图)相近的
    • 纹理(梯度直方图)相近的
    • 合并后总面积小的
    • 合并后,总面积在其BBOX中所占比例大的

    第三条,保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。

    例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。
    不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

    第四条,保证合并后形状规则。

    例:左图适于合并,右图不适于合并。
    这里写图片描述

    上述四条规则只涉及区域的颜色直方图、纹理直方图、面积和位置。合并后的区域特征可以直接由子区域特征计算而来,速度较快。

    多样化与后处理

    为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。

    作者提供了Selective Search的源码,内含较多.p文件和.mex文件,难以细查具体实现。

    特征提取

    预处理

    使用深度网络提取特征之前,首先把候选区域归一化成同一尺寸227×227。
    此处有一些细节可做变化:外扩的尺寸大小,形变时是否保持原比例,对框外区域直接截取还是补灰。会轻微影响性能。

    预训练

    网络结构
    基本借鉴Hinton 2012年在Image Net上的分类网络2,略作简化3
    这里写图片描述
    此网络提取的特征为4096维,之后送入一个4096->1000的全连接(fc)层进行分类。
    学习率0.01。

    训练数据
    使用ILVCR 2012的全部数据进行训练,输入一张图片,输出1000维的类别标号。

    调优训练

    网络结构
    同样使用上述网络,最后一层换成4096->21的全连接网络。
    学习率0.001,每一个batch包含32个正样本(属于20类)和96个背景。

    训练数据
    使用PASCAL VOC 2007的训练集,输入一张图片,输出21维的类别标号,表示20类+背景。
    考察一个候选框和当前图像上所有标定框重叠面积最大的一个。如果重叠比例大于0.5,则认为此候选框为此标定的类别;否则认为此候选框为背景。

    类别判断

    分类器
    对每一类目标,使用一个线性SVM二类分类器进行判别。输入为深度网络输出的4096维特征,输出是否属于此类。
    由于负样本很多,使用hard negative mining方法。
    正样本
    本类的真值标定框。
    负样本
    考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本

    位置精修

    目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
    回归器
    对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000\lambda=10000λ=10000
    输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。
    训练样本
    判定为本类的候选框中,和真值重叠面积大于0.6的候选框。

    结果

    论文发表的2014年,DPM已经进入瓶颈期,即使使用复杂的特征和结构得到的提升也十分有限。本文将深度学习引入检测领域,一举将PASCAL VOC上的检测率从35.1%提升到53.7%
    本文的前两个步骤(候选区域提取+特征提取)与待检测类别无关,可以在不同类之间共用。这两步在GPU上约需13秒。
    同时检测多类时,需要倍增的只有后两步骤(判别+精修),都是简单的线性运算,速度很快。这两步对于100K类别只需10秒。

    以本论文为基础,后续的fast RCNN4(参看这篇博客)和faster RCNN5(参看这篇博客)在速度上有突飞猛进的发展,基本解决了PASCAL VOC上的目标检测问题。


    1. J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selective search for object recognition. IJCV, 2013. ↩︎

    2. A. Krizhevsky, I. Sutskever, and G. Hinton. ImageNet classification with deep convolutional neural networks. In NIPS, 2012 ↩︎

    3. 所有层都是串行的。relu层为in-place操作,偏左绘制。 ↩︎

    4. Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015. ↩︎

    5. Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information Processing Systems. 2015. ↩︎

    展开全文
  • 目标检测】Fast RCNN算法详解

    万次阅读 多人点赞 2016-04-12 13:05:42
    继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。

    Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

    继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。在Github上提供了源码

    同样使用最大规模的网络,Fast RCNN和RCNN相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。在PASCAL VOC 2007上的准确率相差无几,约在66%-67%之间.

    思想

    基础:RCNN

    简单来说,RCNN使用以下四步实现目标检测:
    a. 在图像中确定约1000-2000个候选框
    b. 对于每个候选框内图像块,使用深度网络提取特征
    c. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
    d. 对于属于某一特征的候选框,用回归器进一步调整其位置
    更多细节可以参看这篇博客

    改进:Fast RCNN

    Fast RCNN方法解决了RCNN方法三个问题:

    问题一:测试时速度慢
    RCNN一张图像内候选框之间大量重叠,提取特征操作冗余。
    本文将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。

    问题二:训练时速度慢
    原因同上。
    在训练时,本文先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。

    问题三:训练所需空间大
    RCNN中独立的分类器和回归器需要大量特征作为训练样本。
    本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

    以下按次序介绍三个问题对应的解决方法。

    特征提取网络

    基本结构

    图像归一化为224×224直接送入网络。

    前五阶段是基础的conv+relu+pooling形式,在第五阶段结尾,输入P个候选区域(图像序号×1+几何位置×4,序号用于训练)?。
    这里写图片描述

    注:文中给出了大中小三种网络,此处示出最大的一种。三种网络基本结构相似,仅conv+relu层数有差别,或者增删了norm层。

    roi_pool层的测试(forward)

    roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。
    这里写图片描述

    roi_pool层的训练(backward)

    首先考虑普通max pooling层。设xix_ixi为输入层的节点,yjy_jyj为输出层的节点。
    ∂L∂xi={0δ(i,j)=false∂L∂yjδ(i,j)=true\frac{\partial L}{\partial x_i}=\begin{cases}0&\delta(i,j)=false\\ \frac{\partial L}{\partial y_j} & \delta(i,j)=true\end{cases}xiL={0yjLδ(i,j)=falseδ(i,j)=true

    其中判决函数δ(i,j)\delta(i,j)δ(i,j)表示i节点是否被j节点选为最大值输出。不被选中有两种可能:xix_ixi不在yjy_jyj范围内,或者xix_ixi不是最大值。

    对于roi max pooling,一个输入节点可能和多个输出节点相连。设xix_ixi为输入层的节点,yrjy_{rj}yrj为第rrr个候选区域的第jjj个输出节点。
    这里写图片描述
    ∂L∂xi=Σr,jδ(i,r,j)∂L∂yrj\frac{\partial L}{\partial x_i}=\Sigma_{r,j}\delta(i,r,j)\frac{\partial L}{\partial y_{rj}}xiL=Σr,jδ(i,r,j)yrjL

    判决函数δ(i,r,j)\delta(i,r,j)δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于xix_ixi的梯度等于所有相关的后一层梯度之和。

    网络参数训练

    参数初始化

    网络除去末尾部分如下图,在ImageNet上训练1000类分类器。结果参数作为相应层的初始化参数。
    这里写图片描述
    其余参数随机初始化。

    分层数据

    在调优训练时,每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个候选框。这R个候选框可以复用N张图片前5个阶段的网络特征。
    实际选择N=2, R=128。

    训练数据构成

    N张完整图片以50%概率水平翻转。
    R个候选框的构成方式如下:

    类别 比例 方式
    前景 25% 与某个真值重叠在[0.5,1]的候选框
    背景 75% 与真值重叠的最大值在[0.1,0.5)的候选框

    分类与位置调整

    数据结构

    第五阶段的特征输入到两个并行的全连层中(称为multi-task)。
    这里写图片描述
    cls_score层用于分类,输出K+1维数组ppp,表示属于K类和背景的概率。
    bbox_prdict层用于调整候选区域位置,输出4*K维数组ttt,表示分别属于K类时,应该平移缩放的参数。

    代价函数

    loss_cls层评估分类代价。由真实分类uuu对应的概率决定:
    Lcls=−log⁡puL_{cls}=-\log p_uLcls=logpu

    loss_bbox评估检测框定位代价。比较真实分类对应的预测参数tut^utu和真实平移缩放参数为vvv的差别:
    Lloc=Σi=14g(tiu−vi)L_{loc}=\Sigma_{i=1}^4 g(t^u_i-v_i)Lloc=Σi=14g(tiuvi)
    g为Smooth L1误差,对outlier不敏感:
    g(x)={0.5x2∣x∣<1∣x∣−0.5otherwiseg(x)=\begin{cases} 0.5x^2& |x|<1\\|x|-0.5&otherwise \end{cases} g(x)={0.5x2x0.5x<1otherwise

    总代价为两者加权和,如果分类为背景则不考虑定位代价:
    L={Lcls+λLlocu为前景Lclsu为背景L=\begin{cases} L_{cls}+\lambda L_{loc}& u为前景\\ L_{cls} &u为背景\end{cases}L={Lcls+λLlocLclsuu

    源码中bbox_loss_weights用于标记每一个bbox是否属于某一个类

    全连接层提速

    分类和位置调整都是通过全连接层(fc)实现的,设前一级数据为xxx后一级为yyy,全连接层参数为WWW,尺寸u×vu\times vu×v。一次前向传播(forward)即为:
    y=Wxy=Wxy=Wx
    计算复杂度为u×vu\times vu×v

    WWW进行SVD分解,并用前t个特征值近似:
    W=UΣVT≈U(:,1:t)⋅Σ(1:t,1:t)⋅V(:,1:t)TW=U\Sigma V^T\approx U(:,1:t) \cdot \Sigma(1:t,1:t) \cdot V(:,1:t)^TW=UΣVTU(:,1:t)Σ(1:t,1:t)V(:,1:t)T

    原来的前向传播分解成两步:
    y=Wx=U⋅(Σ⋅VT)⋅x=U⋅zy=Wx = U\cdot (\Sigma \cdot V^T) \cdot x = U \cdot zy=Wx=U(ΣVT)x=Uz
    计算复杂度变为u×t+v×tu\times t+v \times tu×t+v×t
    在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。
    这里写图片描述

    在github的源码中,这部分似乎没有实现。

    实验与结论

    实验过程不再详述,只记录结论

    • 网络末端同步训练的分类和位置调整,提升准确度
    • 使用多尺度的图像金字塔,性能几乎没有提高
    • 倍增训练数据,能够有2%-3%的准确度提升
    • 网络直接输出各类概率(softmax),比SVM分类器性能略好
    • 更多候选窗不能提升性能

    同年作者团队又推出了Faster RCNN,进一步把检测速度提高到准实时,可以参看这篇博客
    关于RCNN, Fast RCNN, Faster RCNN这一系列目标检测算法,可以进一步参考作者在15年ICCV上的讲座Training R-CNNs of various velocities

    展开全文
  • 目标检测:YOLOv3: 训练自己的数据

    万次阅读 多人点赞 2018-03-26 10:59:02
    ------------------------------ 本文仅供学习交流,如有错误,望交流指教 ------------------------------ windows 版本:请参考:https://github.com/AlexeyAB/darknet linux 版本:请参考本文与...

     

    update:20200424

    YOLOV4出来啦!!!快去把玩一下!!!

    https://github.com/AlexeyAB/darknet

     

    ------------------------------ 本文仅供学习交流,如有错误,望交流指教 ------------------------------

    windows       版本:请参考:https://github.com/AlexeyAB/darknet

    linux               版本:请参考本文与 https://pjreddie.com/darknet/yolo

    caffe-yolov3 版本:请参考:https://blog.csdn.net/Chen_yingpeng/article/details/80692018【测试可用】

    第一部分:论文与代码

    第二部分:如何训练自己的数据

    第三部分:疑惑解释

    第四部分:测试相关

    第一部分:论文与代码

    论  文:https://pjreddie.com/media/files/papers/YOLOv3.pdf

    翻  译:https://zhuanlan.zhihu.com/p/34945787

    代  码:https://github.com/pjreddie/darknet

    官  网:https://pjreddie.com/darknet/yolo

    旧  版:

     https://pjreddie.com/darknet/yolov2/

     https://pjreddie.com/darknet/yolov1/

     

    第二部分:如何训练自己的数据

     

    说明:

    (1)平台 linux + 作者官方代码 【训练指令请参考官网教程:https://pjreddie.com/darknet/yolo】
    迭代:900 次
    速度:稍微慢于v2
    测试:记得更改cfg文件

    目的:给网友提供参考,所以样本和迭代次数较少,仅供学习!

    (2)为了方便大家学习,这里提供了182张训练数据、标注以及对应的配置文件,数据是4类【人,车头,车尾,车侧身】: 

    训练数据、配置文件、模型、训练日志、标注工具放在QQ群:371315462935621769

    具体下载地址在群文件的YOLOv3.txt!

    群基本满了,进群也是潜水,所以直接下载吧:

        百度云:
        链接:https://pan.baidu.com/s/1wEtpdQBuMtXn_9CGhEvHTQ
        密码:bwpx

        CSDN

          https://download.csdn.net/download/lilai619/11130832

    【群文件补充了training_list.txt以及labels文件】,欢迎目标检测与语义分割的小伙伴进群交流。

    训练自己的数据主要分以下几步:

    (0)数据集制作:

    A.制作VOC格式的xml文件

    工具:LabelImg 【群文件提供了exe免安装版本以及使用说明】

    B.将VOC格式的xml文件转换成YOLO格式的txt文件

    脚本:voc_label.py,根据自己的数据集修改就行了。

    (1)文件修改

    (A)关于 .data .names 两个文件修改非常简单,参考官网或者群文件YOLOv3.txt连接中的文件。

    (B)关于cfg修改,以6目标检测为例,主要有以下几处调整(蓝色标出),也可参考我上传的文件,里面对应的是4类。#表示注释,根据训练和测试,自行修改。

    [net]
    # Testing
    # batch=1
    # subdivisions=1
    # Training
     batch=64

     subdivisions=8

    ......

    [convolutional]
    size=1
    stride=1
    pad=1
    filters=33###75

     

    activation=linear

    [yolo]
    mask = 6,7,8
    anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
    classes=6###20
    num=9
    jitter=.3
    ignore_thresh = .5
    truth_thresh = 1
    random=0###1

     

    ......

    [convolutional]
    size=1
    stride=1
    pad=1
    filters=33###75
    activation=linear

    [yolo]
    mask = 3,4,5
    anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
    classes=6###20
    num=9
    jitter=.3
    ignore_thresh = .5
    truth_thresh = 1
    random=0###1

    ......

    [convolutional]
    size=1
    stride=1
    pad=1
    filters=33###75
    activation=linear

    [yolo]
    mask = 0,1,2
    anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
    classes=6###20
    num=9
    jitter=.3
    ignore_thresh = .5
    truth_thresh = 1
    random=0###1

    A.filters数目是怎么计算的:3x(classes数目+5),和聚类数目分布有关论文中有说明;

    B.如果想修改默认anchors数值,使用k-means即可;

    C.如果显存很小,将random设置为0,即关闭多尺度训练;

    D.其他参数如何调整,有空再补;

    E.前100次迭代loss较大,后面会很快收敛;

    Region xx: cfg文件中yolo-layer的索引;

    Avg IOU:   当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;

    Class:        标注物体的分类准确率,越大越好,期望数值为1;

    obj:            越大越好,期望数值为1;

    No obj:      越小越好;

    .5R:            以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本

    0.75R:         以IOU=0.75为阈值时候的recall;

    count:        正样本数目。

    F.模型测试:

    6类测试效果模型与配置文件稍后放到群文件,但数据暂不提供】

              

    4类的测试效果,182张迭代900次时的检测效果。【群文件的YOLOv3.txt有百度云盘的下载地址】

    配置文件中的相关参数:完整版本见群文件。

     

    训练指令;多GPU训练指令;恢复训练指令

     

    第三部分:训练问题详解

    图片来自群文件,侵权联系删除

    Tips0: 数据集问题

    如果是学习如何训练,建议不要用VOC或者COCO,这两个数据集复杂,类别较多,复现作者的效果需要一定的功力,迭代差不多5w次,就可以看到初步的效果。所以,不如挑个简单数据集的或者手动标注个几百张就可以进行训练学习。

    Tips1: CUDA: out of memory 以及 resizing 问题

    显存不够,调小batch,关闭多尺度训练:random = 0。

    Tips2: 在迭代前期,loss很大,正常吗?

    经过几个数据集的测试,前期loss偏大是正常的,后面就很快收敛了。

    Tips3: YOLOV3中的mask作用?

    参考#558 #567

    Every layer has to know about all of the anchor boxes but is only predicting some subset of them. This could probably be named something better but the mask tells the layer which of the bounding boxes it is responsible for predicting. The first yolo layer predicts 6,7,8 because those are the largest boxes and it's at the coarsest scale. The 2nd yolo layer predicts some smallers ones, etc.

    The layer assumes if it isn't passed a mask that it is responsible for all the bounding boxes, hence the ifstatement thing.

    Tips3: YOLOV3中的num作用?

    #参考567

    num is 9 but each yolo layer is only actually looking at 3 (that's what the mask thing does). so it's (20+1+4)*3 = 75. If you use a different number of anchors you have to figure out which layer you want to predict which anchors and the number of filters will depend on that distribution.

    according to paper, each yolo (detection) layer get 3 anchors with associated with its size, mask is selected anchor indices.

    Tips4: YOLOV3训练出现nan的问题?

    参考#566

    You must be training on a lot of small objects! nan's appear when there are no objects in a batch of images since i definitely divide by zero. For example, Avg IOU is the sum of IOUs for all objects at that level / # of objects, if that is zero you get nan. I could probably change this so it just does a check for zero 1st, just wasn't a priority.

    所以在显存允许的情况下,可适当增加batch大小,可以一定程度上减少NAN的出现。

    Tips5: Anchor box作用是?

    参考#568

    Here's a quick explanation based on what I understand (which might be wrong but hopefully gets the gist of it). After doing some clustering studies on ground truth labels, it turns out that most bounding boxes have certain height-width ratios. So instead of directly predicting a bounding box, YOLOv2 (and v3) predict off-sets from a predetermined set of boxes with particular height-width ratios - those predetermined set of boxes are the anchor boxes.

     

    Anchors are initial sizes (width, height) some of which (the closest to the object size) will be resized to the object size - using some outputs from the neural network (final feature map):

    darknet/src/yolo_layer.c

    Lines 88 to 89 in 6f6e475

      b.w = exp(x[index + 2*stride]) * biases[2*n] / w;
      b.h = exp(x[index + 3*stride]) * biases[2*n+1] / h;

     

    • x[...] - outputs of the neural network

    • biases[...] - anchors

    • b.w and b.h result width and height of bounded box that will be showed on the result image

    Thus, the network should not predict the final size of the object, but should only adjust the size of the nearest anchor to the size of the object.

    In Yolo v3 anchors (width, height) - are sizes of objects on the image that resized to the network size (width= and height= in the cfg-file).

    In Yolo v2 anchors (width, height) - are sizes of objects relative to the final feature map (32 times smaller than in Yolo v3 for default cfg-files).

     

    Tips6: YOLOv2和YOLOv3中anchor box为什么相差很多?

    参考#562 #555

     

    Now anchors depends on size of the network-input rather than size of the network-output (final-feature-map): #555 (comment)
    So values of the anchors 32 times more.

    Now filters=(classes+1+coords)*anchors_num where anchors_num is a number of masks for this layer.
    If mask is absence then anchors_num = num for this layer:

    darknet/src/yolo_layer.c

    Lines 31 to 37 in e4acba6

      if(mask) l.mask = mask;
      else{
      l.mask = calloc(n, sizeof(int));
      for(i = 0; i < n; ++i){
      l.mask[i] = i;
      }
      }

     

    Each [yolo] layer uses only those anchors whose indices are specified in the mask=

     

     

    So YOLOv2 I made some design choice errors, I made the anchor box size be relative to the feature size in the last layer. Since the network was downsampling by 32 this means it was relative to 32 pixels so an anchor of 9x9 was actually 288px x 288px.

    In YOLOv3 anchor sizes are actual pixel values. this simplifies a lot of stuff and was only a little bit harder to implement

     

    Tips7: YOLOv3打印的参数都是什么含义?

     

    详见yolo_layer.c文件的forward_yolo_layer函数。

        printf("Region %d Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, .5R: %f, .75R: %f,  count: %d\n", net.index, avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, recall75/count, count);

    刚开始迭代,由于没有预测出相应的目标,所以查全率较低【.5R 0.75R】,会出现大面积为0的情况,这个是正常的。

     

    第四部分:测试问题

    由于比较忙,评论不会及时回复。请大家参考下方问题、评论区或者加群讨论。

    (1)** Error in `./darknet': free(): invalid next size (fast): 0x000055d39b90cbb0 ***已放弃 (核心已转储) 

    请使用以下测试指令!

    ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

    训练与测试指令,请参考官网连接:https://pjreddie.com/darknet/yolo/

    (2)如何进行模型的评估(valid)?

    评估指令,请参考官网连接:https://pjreddie.com/darknet/yolo/

    (3)bounding box正确,标签错乱,这里提供两种方案供选择。

    A.不改源码,不用重新编译

       修改coco.names中内容,为自己的检测目标类别

    B.改源码,需要重新编译[ 先 make clean ,然后再 make]

    原因是作者在代码中设置了默认,所以修改 examples/darknet.c文件,将箭头指示的文件替换成自己的。然后重新编译即可。

    (4)模型保存问题

    A:保存模型出错?

    一般是 .data 文件中指定的文件夹无法创建,导致模型保存时出错。自己手动创建即可。

    B:模型什么时候保存?如何更改

    迭代次数小于1000时,每100次保存一次,大于1000时,没10000次保存一次。

    自己可以根据需求进行更改,然后重新编译即可[ 先 make clean ,然后再 make]

    代码位置: examples/detector.c line 138

    C:使用预训练模型直接保存问题

    darknet53.conv.74作为预训练权重文件,因为只包含卷积层,所以可以从头开始训练。

    xxx.weights作为预权重文件训练,因为包含所有层,相当于恢复快照训练,会从已经保存的迭代次数往下训练。如果cfg中迭代次数没改,所以不会继续训练,直接保存结束。

    (5)中文标签问题

    这个解决方案较多,我就简单的说一下我的方案【群文件labels提供了参考代码】

    A:首先生成对应的中文标签,

    修改代码中的字体,将其替换成指中文字体,如果提示提示缺少**模块,安装就行了。

     

    B:添加自己的读取标签和画框函数

    (6)图片上添加置信值

    代码比较熟悉的童鞋,使用opencv在画框的函数里面添加一下就行了。

    (7)图片保存名称

    测试的时候,保存的默认名称是predictions.自己改成对应的图片名称即可。

    (8)Floating, point, exception (core, dumped)

    https://github.com/pjreddie/darknet/issues/140#issuecomment-375791093

    (9)多GPU训练时模型保存问题

    https://github.com/pjreddie/darknet/issues/664#issuecomment-405448653

    假设你有3块GPU,当单张GPU运行100次时【该保存模型了】,实际上迭代了100*3=300次【3块卡嘛】,当单张GPU运行200次时【该保存模型了】,实际上迭代了200*3=600次【3块卡嘛】,依次类推。

    第五部分:论文阅读

    优点:速度快,精度提升,小目标检测有改善;

    不足:中大目标有一定程度的削弱,遮挡漏检,速度稍慢于V2。

     

     

    v2: anchors[k-means]+多尺度+跨尺度特征融合
    v3: anchors[k-means]+多尺度+跨尺度特征融合


    v2,v3两者都是有上面的共同特点,简单的多尺度不是提升小目标的检测的关键。


    v2: 32x的下采样,然后使用anchor进行回归预测box
    问题:较大的下采样因子,通常可以带来较大的感受野,这对于分类任务是有利,但会损害目标检测和定位【小目标在下采样过程中消失,大目标边界定位不准】


    v3: 针对这个问题,进行了调整。就是在网络的3个不同的尺度进行了box的预测。【说白了就是FPN的思想】在下采样的前期就进行目标的预测,这样就可以改善小目标检测和定位问题。
    不理解的话,稍微看一下FPN,就明白了。这个才是v3提升小目标的关键所在。

     

                                                                (๑•ᴗ•๑)觉得有用,赏个植发的小钱钱。(๑•ᴗ•๑)

       

     

     

     

    展开全文
  • 目标检测

    千次阅读 2019-02-26 19:22:31
    文章目录第八章 目标检测8.1 基本概念8.1.1 什么是目标检测?8.1.2 目标检测要解决的核心问题?8.1.2 目标检测算法分类?8.2 Two Stage目标检测算法8.2.1 R-CNN8.2.2 Fast R-CNN8.2.3 Faster R-CNN8.2.4 R-FCN8.2.5 ...
  • 光流法运动目标检测

    千次阅读 2019-05-21 10:07:11
    接上篇,OpenCV视频目标跟踪及背景分割器,本篇介绍OpenCV—python目标跟踪==》光流法 回顾: 目标跟踪是对摄像头视频中的移动目标进行定位的过程。实时目标跟踪是许多计算机视觉应用的重要任务,如监控、基于感知...
  • 睿智的目标检测30——Pytorch搭建YoloV4目标检测平台

    万次阅读 多人点赞 2020-05-24 14:14:13
    睿智的目标检测30——Pytorch搭建YoloV4目标检测平台学习前言什么是YOLOV4代码下载YOLOV4改进的部分(不完全)YOLOV4结构解析1、主干特征提取网络Backbone2、特征金字塔3、YoloHead利用获得到的特征进行预测4、预测...
  • 需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 课程链接:https://edu.csdn.net/course/detail/29123  当前,人脸口罩佩戴检测是急需的应用,而YOLOv4是...
  • 目标检测(一)——目标检测综述(持续更新中)

    万次阅读 多人点赞 2018-05-09 09:56:09
    目标检测 目标检测要解决的核心问题 目标检测最新进展 目标检测应用
  • 睿智的目标检测26——Pytorch搭建yolo3目标检测平台

    万次阅读 多人点赞 2020-04-13 15:15:43
    睿智的目标检测26——Pytorch搭建yolo3目标检测平台学习前言源码下载yolo3实现思路一、预测部分1、主题网络darknet53介绍2、从特征获取预测结果3、预测结果的解码4、在原图上进行绘制二、训练部分1、计算loss所需...
  • 目标检测综述

    万次阅读 多人点赞 2019-07-09 21:36:26
    这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。 其中“定位”的意思是判断汽车在图片中的具体位置。 近几年来,目标...
  • 目标检测之 IoU

    万次阅读 多人点赞 2018-09-24 15:09:07
    IoU 作为目标检测算法性能 mAP 计算的一个非常重要的函数。 但纵观 IoU 计算的介绍知识,都是直接给出代码,给出计算方法,没有人彻底地分析过其中的逻辑,故本人书写该篇博客来介绍下其中的逻辑。 IoU 的全称为交...
  • 人脸人眼目标检测

    千次下载 热门讨论 2011-11-16 10:58:16
    基于opencv2.3.1实现的人脸目标检测,利用了基于Haar特征级联分类器,效果很好
  • 课程演示环境:Ubuntu需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测... 《YOLOv4目标检测实战:人脸口罩佩戴识别》《YOLOv4目标检测实战:中国交通标志识别》《YOLOv4目标检测:原理与源码解析》
  • 课程分为三个小项目:足球目标检测(单目标检测)、梅西目标检测(单目标检测)、足球和梅西同时目标检测(两目标检测)。本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。包括:安装Darknet、给自己的数据集...
  • 需要学习Ubuntu系统YOLOv4的同学请前往《YOLOv4目标检测实战:人脸口罩佩戴检测》 课程链接:https://edu.csdn.net/course/detail/28860  当前,人脸口罩佩戴检测是急需的应用,而YOLOv4是新推出的...
  • YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。 本课程将学习YOLOv3实现darknet的网络模型改进方法。具体包括: • PASCAL VOC数据集的整理、训练与测试  • Eclipse IDE的安装与使用  • ...
  • YOLOv3目标检测实战:交通标志识别

    千人学习 2019-05-29 21:58:00
    除本课程《YOLOv3目标检测实战:交通标志识别》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括: 《YOLOv3目标检测实战:训练自己的数据集》 《YOLOv3目标检测:原理与源码解析...
  • YOLOv3目标检测:原理与源码解析

    千人学习 2019-06-07 22:10:10
    Linux创始人Linus Torvalds有一句名言:Talk is cheap, Show me ... 建议先学习课程《YOLOv3目标检测实战:训练自己的数据集》或课程《YOLOv3目标检测实战:交通标志识别》,对YOLOv3的使用方法了解以后再学习本课程。
  • 从YOLOv1到YOLOv3,目标检测的进化之路

    万次阅读 多人点赞 2018-06-04 18:11:14
    本文来自 CSDN 网站,作者 EasonApp。作者专栏: http://dwz.cn/7ZGrifYOLOv1这是继 RCNN,fast-RCNN 和 faster-...
  • YOLOv4目标检测:原理与源码解析

    千人学习 2020-06-26 08:48:34
    需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》, 课程链接 https://edu.csdn.net/course/detail/29865 【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言:...
  • 视频目标检测

    千次阅读 2019-06-17 10:47:12
    1视频目标检测的简介 视频目标检测要解决的问题就是对视频中每一帧都正确的识别和定位对于图像的目标检测,视频是高度冗余的,包含大量的时间冗余性和空间冗余性,就是在不同的时间或者空间看起来是相似的。充分的...
  • 睿智的目标检测20——利用mAP计算目标检测精确度

    万次阅读 多人点赞 2020-03-06 17:12:48
    睿智的目标检测20——利用mAP计算目标检测精确度学习前言GITHUB代码下载知识储备1、IOU的概念2、TP TN FP FN的概念3、precision(精确度)和recall(召回率)4、概念举例5、单个指标的局限性什么是AP绘制mAP ...
  • 基于红外图像的弱小目标检测与跟踪

    万次阅读 热门讨论 2018-01-06 22:30:27
    经典的小目标检测与跟踪方法是DBT,即先根据检测概率和虚警概率计算单帧图像的检测门限,然后对每帧图像进行分割,并将目标的单帧检测结果与目标运动轨迹进行关联,最后进行目标跟踪,适应于信噪比比较高的情况,...

空空如也

1 2 3 4 5 ... 20
收藏数 39,026
精华内容 15,610
关键字:

目标检测