在完成利用官方范例目标检测网络结构SSD-mobilenet训练自己的数据之后,发现有些识别效果并不是那么令人满意,我产生了调整网络参数再训练的想法,于是我阅读了相关proto文件,和相关函数定义的py文件,对config文件添加了一点注释,希望能在调参时有所帮助,也许我使用的网络跟你的不一样,但是大部分指标应该是一样的。
授人以鱼不如授人以渔,有能力的话,我也希望你自己能阅读一下源码和解释文件,具体的方法是:根据config文件,构成的框架,对应的名字查找proto(编译的时候相信你已经用到过了)文件夹下对应的proto文件,比如我model下的SSd,我就去查找了ssd.proto,在proto文件里你可以找到这个板块里可选的参数和大致描述,然后在core和utils文件夹,在对应py文件你可以看到更为详细的函数定义和模块描述来帮助你理解(实在找不到试试文件夹搜索),当然这里也会涉及到一些比较基础前继知识,你可以自己查阅资料先了解一下:
1 anchor box,我的理解是,数据集在经过重塑为固定大小后,对每张图片的box框进行k-means聚集,找到一个尽可能符合大部分box位置的多个中心box即anchor box,然后再以anchor box为基准,得到相对坐标和相对高宽(这里就涉及到box-coder了),主要作用呢,也是比如一个位置既有人也有狗,普通的你可能只能识别人或者狗,anchor的话就能兼顾,而且因为尺寸也不一样,所以多个聚点。
2IOU 评价识别框位置好坏的重要指标,简单来说就是你的预测框和真实框相交的面积除以他俩的并集的面积
3FPN 特征金字塔,我也讲不了太清楚,你自己下去看吧
4batch norm 对图像归一化,对图像平移和缩放,相关公式你可以自行研究
5NMS 非极大值抑制的相关参数设置,这个对同一目标多个识别框解决作用很关键,你可以提高分数阈值,降低IOU阈值,减少同一图片能保留的最大box数量
6batch-size,每批次抓取的文件数量,进行计算一次损失,为什么这样用,因为你要是一下子把全部数据集导入呢,每一步训练时间很长,而且容易过拟合,那要是每一次只抓一个文件呢,最后有可能不收敛,在收敛点反复震荡。于是这就需要我们选择恰当的折中值来解决这个问题,你需要考虑你的电脑性能大小和你的数据集大小。
7epoch:batch-size里我们提到我们每一次抓取并不是全部数据集,然后epoch呢是要把一个完整数据集训练一次,进行一次前向传播,所以需要进行 数据集文件总数/batch_size 次batch
8正则化,激活函数
还有一些很具体的损失函数,优化器,随机什么的你可以自行了解。
下面附上用幕布做的注释,和我做的思维导图更配哦:
- model
- ssd
- inplace_batchnorm_update: true //是否使用在训练时更新batchnorm
- freeze_batchnorm: false //是否冻结batchnorm
- num_classes: 1 //检测的样本种类
- box_coder //box编解码的方式,共有四种:faster_rcnn_box_coder,mean_stddev_box_coder,square_box_coder,keypoint_box_coder
- faster_rcnn_box_coder//这里因为SSD借鉴的faster_RCnn于是选择这种编码方式
- y_scale: 10.0 //这里指的是anchor box的放大倍率,这里涉及到了anchor的四个公式,建议去了解一下anchor box,这个是anchor box中心坐标x坐标的放缩比例
- x_scale: 10.0 //anchor box中心坐标y坐标的放缩比例
- height_scale: 5.0 //anchor box高的放缩比例
- width_scale: 5.0//anchor box宽的放缩比例
- matcher //anchor box与ground-truth box的匹配器
- argmax_matcher //SSD算法选取argmax-matcher策略,即选取最大值策略,应当还有其他策略
- matched_threshold: 0.5 //IOU(anchor box与真实框box的交并比)与matched_threshold比较,大于作为正样本
- unmatched_threshold: 0.5//低于unmatch值作为负样本
- ignore_thresholds: false//是否以没有threshold的方式argmax_match,我的理解是都当作正样本,不区分负样本
- negatives_lower_than_unmatched: true//当IOU处于unmatch和match之间,属于中间态,该参数为true:中间态忽略掉;该参数为false:中间态作为负样本;
- force_match_for_each_row: true //强制每一个真实框都至少有一个defalt box对应防止漏检
- use_matmul_gather: true//强制使用基于矩阵乘法的收集,而不是标准的tf.gather
- similarity_calculator//选择使用何种相似度计算,这里使用IOU相似度,还有ioa,阈值-iou的有需要自行了解
- iou_similarity
- encode_background_as_zeros: true //编码背景是否置零
- anchor_generator //anchor box生成器,共有三种:grid_anchor_generator,ssd_anchor_generator,multiscale_anchor_generator
- multiscale_anchor_generator //这里使用multiscale_anchor_generator
- min_level: 3 //这里涉及到FPN,建议看一下,感觉应该是这里是特征金字塔的最低层数
- max_level: 7//同上,最高层数
- anchor_scale: 4.0//特征矩阵步长的放缩比
- aspect_ratios: [1.0, 2.0, 0.5] //每一个网格点的长宽高比
- scales_per_octave: 2
- image_resizer//图片大小重塑这里重塑为640*640
- fixed_shape_resizer
- height: 640
- width: 640
- box_predictor //box预测器共有四种:convolutional_box_predictor,mask_rcnn_box_predictor,rfcn_box_predictor,weight_shared_convolutional_box_predictor
- weight_shared_convolutional_box_predictor //选择原因不明
- depth: 256 //位置回归与目标检测之间的特征图的深度,换句话等价于卷积核的个数。box_predictor.proto里面有详细个数
- class_prediction_bias_init: -4.6 //类别预测偏执初始化
- conv_hyperparams //卷积超参数
- activation: RELU_6 //激活函数:有名的relu函数我不多说了
- regularizer //正则化操作,可使用l1(多用于区分),l2(多用于防止过拟合),这里使用来l2,而权重仅占0.00004对loss影响不大
- l2_regularizer
- weight: 0.00004
- initializer //参数初始化
- random_normal_initializer //截断正态分布初始化
- stddev: 0.01 // 标准差
- mean: 0.0 //均值
- batch_norm //批规范化,将激活函数的数值分布拉回到正态分布,防止训练过程中反向梯度消失,在这个过程中引入γ和β进行数据的缩放和平移
- scale: true, //true:操作过程中乘以γ,false:不乘以γ;
- decay: 0.997, //衰减率
- epsilon: 0.001 //添加到方差的浮点数,避免除以零
- num_layers_before_predictor: 4 //预测其前面的额外的卷积层数:4
- kernel_size: 3 //最后的卷积核尺寸
- feature_extractor //特征提取器
- type: 'ssd_mobilenet_v1_fpn_keras'
- fpn//上面的anchor生成器那部分已经讲过,这里不做赘述
- min_level: 3 //
- max_level: 7 //
- min_depth: 16 //最小特征提取器的深度
- depth_multiplier: 1.0 //施加到每个input通道卷积核数目
- conv_hyperparams//卷积超参数
- activation: RELU_6, //激活函数选择relu函数,可选择tanh,sigmoid函数
- regularizer //正则化,同上
- l2_regularizer
- weight: 0.00004
- initializer //初始化同上面
- random_normal_initializer
- stddev: 0.01
- mean: 0.0
- batch_norm //batch_norm相关参数
- scale: true
- epsilon: 0.001
- decay: 0.997,
- override_base_feature_extractor_hyperparams: true //是否覆盖基层特征提取器的超参数,这里选择覆盖
- loss
- classification_loss //loss可选参数包括:classification_loss、localization_loss、hard_example_miner、classification_weight、localization_weight,但是ssd主要是classfication(目标类别损失)和localization(目标位置损失)两个参数
- weighted_sigmoid_focal //目标类别损失可选择五个参数: weighted_sigmoid,weighted_softmax,weighted_logits_softmax,bootstrapped_sigmoid,weighted_sigmoid_focal
- alpha: 0.25 //损失的阿尔法权重因子
- gamma: 2.0 //损失的调制因子
- localization_loss//位置损失
- weighted_smooth_l1 \\目标位置损失的正则化
- classification_weight: 1.0 //类别损失在总损失的权重占比
- localization_weight: 1.0//位置损失在总损失的权重占比,这里我也有点奇怪,为什么两个都是1,意思是各占一半吗
- normalize_loss_by_num_matches: true // 是否根据匹配样本数目归一化损失
- normalize_loc_loss_by_codesize: true //是否根据编码box的编码大小归一化位置损失
- post_processing //后处理
- batch_non_max_suppression //NMS非极大值抑制的相关参数配置
- score_threshold: 1e-8 //分数低于该阈值的box过滤掉
- iou_threshold: 0.6 //和之前选择box IOU超过该阈值的去除掉(去掉重叠度高的)
- max_detections_per_class: 100 //每个类别可保留的检测框的最大数目
- max_total_detections: 100 //所有类别可保留的检测狂数目
- score_converter: SIGMOID //检测分数的转换器类别选择,包括identify,sigmoid,softmax
- train_config //训练用参数配置
- fine_tune_checkpoint_version: V2 //导入模型的版本
- fine_tune_checkpoint:"PATH_TO_BE_CONFIGURED/mobilenet_v1.ckpt-1"//初始模型的导入
- fine_tune_checkpoint_type: "classification" //读入已有模型的方式,包括classification,detection,full
- batch_size: 64 //模型每次训练抓取的数据
- sync_replicas: true //训练期间是否同步副本
- startup_delay_steps: 0 //副本启动间的训练步数了,这个和sync_reolicas是对立的,你想嘛,随时都在同步,也就不存在副本之间的
- replicas_to_aggregate: 8 //参数更新前聚合的副本数量
- num_steps: 25000 //训练步数
- data_augmentation_options //数据增强参数配置
- random_horizontal_flip //随机水平翻转
- data_augmentation_options //数据增强参数配置
- random_crop_image //图像随机裁剪
- min_object_covered: 0.0 //裁剪图像必须包含输入box框的最小比例
- min_aspect_ratio: 0.75 //和下面max构成裁剪图像的允许长宽比范围
- max_aspect_ratio: 3.0
- min_area: 0.75//和下面max组成裁剪图像与原始图像允许的面积比的范围
- max_area: 1.0
- overlap_thresh: 0.0//大致就是至少要保证最少多少的重叠范围来保证box
- optimizer //优化器,可选三个优化器:rms_prop_optimizer,momentum_optimizer,adam_optimizer
- momentum_optimizer
- learning_rate // 学习率参数配置
- cosine_decay_learning_rate //学习率按线性余弦噪声衰减
- learning_rate_base: .04 //基础学习率
- total_steps: 25000 //总步数
- warmup_learning_rate: .013333 //预阶段初始学习率
- warmup_steps: 2000 //使用初始学习步数的训练步数
- momentum_optimizer_value: 0.9 //引入这个momentum超参数 使得优化在梯度方向不变的维度上的更新速度变快,在梯度方向有所改变的维度上的更新速度变慢,从而加快收敛并减小震荡。
- use_moving_average: false //保存模型参数时,是否使用moving-avergae策略(保存模型时会将每次迭代得到的参数求平均值)
- max_number_of_boxes: 100 //最大box数量
- unpad_groundtruth_tensors: false //是否删除沿着box数量维度的真实框张量的填充
- train_input_reader: //训练集数据文件的配置路径
- label_map_path: "PATH_TO_BE_CONFIGURED/label_map.txt" //标签文件的路径
- tf_record_input_reader
- input_path: "PATH_TO_BE_CONFIGURED/train2017-?????-of-00256.tfrecord" //训练数据集存放位置
- eval_config: //测试参数配置文件
- metrics_set: "coco_detection_metrics" //度量集:
- use_moving_averages: false //是否使用move-averag策略
- batch_size: 1; //批处理数据量
- eval_input_reader //测试集数据文件的配置路径
- label_map_path: "PATH_TO_BE_CONFIGURED/label_map.txt" //同上面标签文件的路径
- shuffle: false //对测试集文件进行随机排序操作设置
- num_epochs: 1 //将一个数据集的全部文件全部导入一次,算作一次epoch;
- tf_record_input_reader //测试数据文件导入路径
- input_path: "PATH_TO_BE_CONFIGURED/val2017-?????-of-00032.tfrecord"
由于本人能力有限,部分可能注释不是很清楚,如果有大牛看到错误请指出,求别喷。