zoukankan      html  css  js  c++  java
  • yolo---参数解释之训练log中各参数

                                                                             yolo---参数解释之训练log中各参数

    ******训练log中各参数的意义*************************************************************
    yolov3-voc
    Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
    Resizing
    384
    Loaded: 0.000077 seconds
    Region 82 Avg IOU: 0.293486, Class: 0.443128, Obj: 0.680025, No Obj: 0.532993, .5R: 0.142857, .75R: 0.000000,  count: 7
    Region 94 Avg IOU: 0.203765, Class: 0.575399, Obj: 0.361495, No Obj: 0.513690, .5R: 0.000000, .75R: 0.000000,  count: 4
    Region 106 Avg IOU: 0.148327, Class: 0.769327, Obj: 0.539390, No Obj: 0.469288, .5R: 0.000000, .75R: 0.000000,  count: 1
    ...
    ...
    ...
    Region 82 Avg IOU: 0.257638, Class: 0.441840, Obj: 0.617525, No Obj: 0.531992, .5R: 0.071429, .75R: 0.000000,  count: 14
    Region 94 Avg IOU: 0.070440, Class: 0.604375, Obj: 0.246185, No Obj: 0.513274, .5R: 0.000000, .75R: 0.000000,  count: 6
    Region 106 Avg IOU: 0.072315, Class: 0.733155, Obj: 0.818539, No Obj: 0.469309, .5R: 0.000000, .75R: 0.000000,  count: 1
    156: 840.799866, 840.799866 avg, 0.000000 rate, 1.843955 seconds, 64 images
    *******************************************************************
    训练结果显示参数说明:
    (1)Learning Rate: 0.001, 学习率 .
        学习率: 决定了参数移动到最优值的速度快慢. 
        如果学习率过大,很可能会越过最优值导致函数无法收敛,甚至发散;反之,如果学习率过小,优化的效率可能过低,算法长时间无法收敛,也易使算法陷入局部最优(非凸函数不能保证达到全局最优)。合适的学习率应该是在保证收敛的前提下,能尽快收敛。
        设置较好的learning rate,需要不断尝试。在一开始的时候,可以将其设大一点,这样可以使weights快一点发生改变,在迭代一定的epochs之后人工减小学习率。
        在yolo训练中,网络训练160epoches,初始学习率为0.001,在60和90epochs时将学习率除以10。
    (2)Momentum: 0.9, 滑动平均模型 .
        在训练的过程中不断地对参数求滑动平均,这样能够更有效地保持稳定性,使其对当前参数更新不敏感。例如加动量项的随机梯度下降法就是在学习率上应用滑动平均模型。,一般会选择0.9~0.95.
    
    (3)Decay: 0.0005, 权重衰减 .
        使用的目的是防止过拟合,当网络逐渐过拟合时网络权值往往会变大,因此,为了避免过拟合,在每次迭代过程中以某个小因子降低每个权值,也等效于给误差函数添加一个惩罚项,常用的惩罚项是所有权重的平方乘以一个衰减常量之和。权值衰减惩罚项使得权值收敛到较小的绝对值。
    
    (4)Region 82, Region 94, Region 106表示三个不同尺度(8294106)上预测到的不同大小的参数。
        82 卷积层为最大的预测尺度, 使用较大的 mask, 但是可以预测出较小的物体;
        94 卷积层为中间的预测尺度, 使用中等的 mask;
        106卷积层为最小的预测尺度, 使用较小的 mask, 可以预测出较大的物体.
        @https://blog.csdn.net/xiao_lxl/article/details/85127959
    
    (5)上述列举中,表示所有训练图片中的一个批次(batch)
        批次大小的划分根据在cfg/yolov3.cfg中设定的, 批次大小的划分根据我们在 .cfg 文件中设置的subdivisions参数。
        在当前使用的 .cfg 文件中 batch = 64 ,subdivision = 8,所以在训练输出中,训练迭代包含了8组(8组Region 82, Region 94, Region 106),每组又包含了8张图片,跟设定的batch和subdivision的值一致。
        注: 也就是说每轮迭代会从所有训练集里随机抽取 batch = 64 个样本参与训练,所有这些 batch 个样本又被均分为 subdivision = 8 次送入网络参与训练,以减轻内存占用的压力)
    
    (6)观察某一个尺度上的参数, 下面以第一行 Region 82 分析:
    【Region 82 Avg IOU: 0.293486, Class: 0.443128, Obj: 0.680025, No Obj: 0.532993, .5R: 0.142857, .75R: 0.000000,  count: 7】
    •   Region Avg IOU:0.293486: 表示在当前 subdivision 内的图片的平均 IOU, 代表预测的矩形框和真实目标的交集与并集之比, 这里是 29.36%,由于刚开始训练,所以此模型的精度远远不够。
    •   Class: 0.443128:   标注物体分类的正确率, 期望该值趋近于1;
    •   Obj: 0.680025:    越接近 1 越好;
    •   No Obj:0.532993:  期望该值越来越小, 但不为零;
    •   .5R: 0.142857:    以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本.
                           是在 recall/count 中定义的, 是当前模型在所有 subdivision 图片中检测出的正样本与实际的正样本的比值。全部的正样本被正确的检测到应该是1。
    •   .75R: 0.000000 :   以IOU=0.75为阈值时候的recall;
    •   count: 7:         所有当前 subdivision 图片(本例中一共 8 张)中包含正样本的图片的数量。 
                           在输出 log 中的其他行中, 可以看到其他subdivision 也有的只含有 61 个正样本, 说明在 subdivision 中含有不包含在检测对象 classes 中的图片
    
    (7)批输出【 9798:  0.370096,  0.451929 avg,  0.001000 rate,  3.300000 seconds,  627072 images 】
    •   9798: 指示当前训练的迭代次数
    •   0.370096: 是总体的Loss(损失)
    •   0.451929 avg: 是平均Loss,这个数值应该越低越好,一般来说,一旦这个数值低于0.060730 avg就可以终止训练了。
    •   0.001000 rate: 代表当前的学习率,是在.cfg文件中定义的。
    •   3.300000 seconds: 表示当前批次训练花费的总时间。
    •   627072 images: 这一行最后的这个数值是9798*64的大小,表示到目前为止,参与训练的图片的总量。
    
    
    (8)分块输出【 Region Avg IOU: 0.326577,Class: 0.742537,Obj: 0.033966,No Obj: 0.000793,Avg Recall: 0.12500,count: 8 】
    •   Region Avg IOU: 0.326577: 表示在当前subdivision内的图片的平均IOU,代表预测的矩形框和真实目标的交集与并集之比,这里是32.66%,这个模型需要进一步的训练。
    •   Class: 0.742537: 标注物体分类的正确率,期望该值趋近于1。
    •   Obj: 0.033966: 越接近1越好。
    •   No Obj: 0.000793: 期望该值越来越小,但不为零。
    •   Avg Recall: 0.12500: 是在recall/count中定义的,是当前模型在所有subdivision图片中检测出的正样本与实际的正样本的比值。在本例中,只有八分之一的正样本被正确的检测到。(和最开始初定的阈值有关系)
    •   count: 8:count后的值是所有的当前subdivision图片(本例中一共8张)中包含正样本的图片的数量。在输出log中的其他行中,可以看到其他subdivision也有的只含有6或7个正样本,说明在subdivision中含有不含检测对象的图片。
    @https://blog.csdn.net/xiao_lxl/article/details/85127959
    ********************************************************************************************
    ...
    ...
    ...
    Loading weights from ./wp_data/case3-cls84-weights/yolov3_weight.conv.66...
     seen 64 
    Done!
    Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
     If error occurs - run training with flag: -dont_show 
    Resizing
    608 x 608 
     try to allocate additional workspace_size = 215.15 MB 
     CUDA allocate done! 
    Loaded: 0.000069 seconds
    
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: 0.130423, GIOU: 0.130423), Class: 0.777553, Obj: 0.372095, No Obj: 0.434500, .5R: 0.000000, .75R: 0.000000, count: 1
    ...
    ...
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434966, .5R: -nan, .75R: -nan, count: 0
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.347062, GIOU: 0.260316), Class: 0.537231, Obj: 0.459746, No Obj: 0.507364, .5R: 0.142857, .75R: 0.000000, count: 14
    ...
    ...
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434781, .5R: -nan, .75R: -nan, count: 0
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.255715, GIOU: 0.049848), Class: 0.641193, Obj: 0.390348, No Obj: 0.507421, .5R: 0.000000, .75R: 0.000000, count: 7
    ...
    ...
    
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434521, .5R: -nan, .75R: -nan, count: 0
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.272013, GIOU: 0.236511), Class: 0.617063, Obj: 0.395308, No Obj: 0.507380, .5R: 0.000000, .75R: 0.000000, count: 4
    ...
    ...
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434870, .5R: -nan, .75R: -nan, count: 0
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.315608, GIOU: 0.164685), Class: 0.552984, Obj: 0.492209, No Obj: 0.507285, .5R: 0.142857, .75R: 0.000000, count: 14
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 106 Avg (IOU: 0.249113, GIOU: 0.112020), Class: 0.505489, Obj: 0.479450, No Obj: 0.473681, .5R: 0.028571, .75R: 0.028571, count: 35
    ...
    ...
    v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 106 Avg (IOU: 0.243135, GIOU: 0.081533), Class: 0.508788, Obj: 0.439726, No Obj: 0.473779, .5R: 0.076923, .75R: 0.000000, count: 52
    
     1: 1974.407104, 1974.407104 avg loss, 0.000000 rate, 3.823940 seconds, 64 images
    Loaded: 0.000018 seconds
    

    ***说明:v3(mse loss, Normalizer :( iou :0.750000) cls:1.000000)这句话,心里就很忐忑,后来知道了可能是新版本ab优化后的,加了些超参
    ********************************************************************************************
    参考@https://www.cnblogs.com/hls91/p/10911997.html已实践了几次,正确性进一步尚待验证。简单说明:1)如果看到avg loss =nan?     说明训练错误; 某一行的Class=-nan说明目标太大或者太小,某个尺度检测不到,属于正常 
    @https://zhuanlan.zhihu.com/p/25110930 @https://blog.csdn.net/maweifei/article/details/81148414
    2)什么时候应该停止训练?     当loss不在下降或者下降极慢的情况可以停止训练,一般loss=0.7左右就可以了
    (3)在训练集上测试正确率很高,在其他测试集上测试效果很差?  说明过拟合了。解决,提前停止训练,或者增大样本数量训练
    (4)如何提高目标检测正确率包括IOU,分类正确率?     设置yolo层 random =1,增加不同的分辨率。或者增大图片本身分辨率。或者根据你自定义的数据集去重新计算anchor尺寸(darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416 then set the same 9 anchors in each of 3 [yolo]-layers in your cfg-file)
    (5)如何增加训练样本?     样本特点尽量多样化,亮度,旋转,背景,目标位置,尺寸. 添加没有标注框的图片和其空的txt文件,作为negative数据
    (6)训练的图片较小,但是实际检测图片大,怎么检测小目标?     
        1.使在用416*416训练完之后,也可以在cfg文件中设置较大的width和height,增加网络对图像的分辨率,从而更可能检测出图像中的小目标,而不需要重新训练
        2.set `[route] layers = -1, 11`
          set ` [upsample] stride=4`
    (7)网络模型耗费资源多大?(我用过就两个)
        [yolov3.cfg]  [236MB COCO-91类]  [4GB GPU-RAM]
        [yolov3.cfg]  [194MB VOC-20类]  [4GB GPU-RAM]
        [yolov3-tiny.cfg]  [34MB COCO-91类]  [1GB GPU-RAM]
        [yolov3-tiny.cfg]  [26MB VOC-20类]  [1GB GPU-RAM]
    (8)多GPU怎么训练?
         首先用一个gpu训练1000次迭代后的网络,再用多gpu训练
    darknet.exe detector train data/voc.data cfg/yolov3-voc.cfg /backup/yolov3-voc_1000.weights -gpus 0,1,2,39)有哪些命令行来对神经网络进行训练和测试?     
        1.检测图片: builddarknetx64darknet.exe detector test data/coco.data cfg/yolov3.cfg yolov3.weights  -thresh 0.25 xxx.jpg
        2.检测视频:将test 改为 demo ; xxx.jpg 改为xxx.mp4
        3.调用网络摄像头:将xxx.mp4 改为 http://192.168.0.80:8080/video?dummy=x.mjpg -i 0
        4.批量检测:-dont_show -ext_output < data/train.txt >  result.txt
        5.手持端网络摄像头:下载mjpeg-stream 软件, xxx.jpg 改为 IP Webcam / Smart WebCam
    (10)如何评价模型好坏?
        builddarknetx64darknet.exe detector map datadefect.data cfgyolov3.cfg backupyolov3.weights
        利用上面命令计算各权重文件,选择具有最高IoU(联合的交集)和mAP(平均精度)的权重文件
    (11)如果测试时出现权重不能识别目标的情况?
          很可能是因为yolov3.cfg文件开头的Traing下面两行没有注释掉,并且把Testing下面两行去掉注释就可以正常使用.
    (12)模型什么时候保存?如何更改?
        迭代次数小于1000时,每100次保存一次,大于1000时,没10000次保存一次。
        自己可以根据需求进行更改,然后重新编译即可[ 先 make clean ,然后再 make]。
        代码位置: examples/detector.c line 13813)yolo v3 论文阅读
        优点:速度快,精度提升,小目标检测有改善;
        不足:中大目标有一定程度的削弱,遮挡漏检,速度稍慢于V2。
    
    参考@https://www.cnblogs.com/hls91/p/10911997.html ,https://blog.csdn.net/lilai619/article/details/7969510
  • 相关阅读:
    提交代码报错不同方式
    pow log 与 (int)
    优先队列的创建
    积性函数
    静态主席树,动态主席树(一种可持久化线段树)
    codeblocks 输入、输出文件的位置
    后缀自动机
    BellmanFord 最短路
    struct
    hdu1501 动态规划
  • 原文地址:https://www.cnblogs.com/carle-09/p/12192231.html
Copyright © 2011-2022 走看看