TensorFlow 1.4 OD API训练单类车牌检测模型评估指标全为-1.000
TensorFlow目标检测API评估输出全量负值问题
问题背景
使用TensorFlow 1.4版本OD API(目标检测API)构建车牌检测模型,完成初始几个检查点的评估计算后,所有结果均为异常负值。此前曾使用相同pipeline流程完成多类目标检测模型训练,本次为首次训练单类目标检测模型,怀疑存在关键配置遗漏,遂附上完整pipeline配置文件排查原因。
注:COCO检测评估机制在读取不到有效真实标注或检测结果时,会固定返回-1作为占位值,不代表模型精度为负
异常评估输出
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
完整pipeline配置
model { ssd { num_classes: 1 image_resizer { fixed_shape_resizer { height: 320 width: 320 } } feature_extractor { type: "ssd_mobiledet_edgetpu" depth_multiplier: 1.0 min_depth: 16 conv_hyperparams { regularizer { l2_regularizer { weight: 4e-05 } } initializer { truncated_normal_initializer { mean: 0.0 stddev: 0.03 } } activation: RELU_6 batch_norm { decay: 0.97 center: true scale: true epsilon: 0.001 train: true } } use_depthwise: true override_base_feature_extractor_hyperparams: false } box_coder { faster_rcnn_box_coder { y_scale: 10.0 x_scale: 10.0 height_scale: 5.0 width_scale: 5.0 } } matcher { argmax_matcher { matched_threshold: 0.5 unmatched_threshold: 0.5 ignore_thresholds: false negatives_lower_than_unmatched: true force_match_for_each_row: true use_matmul_gather: true } } similarity_calculator { iou_similarity { } } box_predictor { convolutional_box_predictor { conv_hyperparams { regularizer { l2_regularizer { weight: 4e-05 } } initializer { random_normal_initializer { mean: 0.0 stddev: 0.03 } } activation: RELU_6 batch_norm { decay: 0.97 center: true scale: true epsilon: 0.001 train: true } } min_depth: 0 max_depth: 0 num_layers_before_predictor: 0 use_dropout: false dropout_keep_probability: 0.8 kernel_size: 3 box_code_size: 4 apply_sigmoid_to_scores: false class_prediction_bias_init: -4.6 use_depthwise: true } } anchor_generator { ssd_anchor_generator { num_layers: 6 min_scale: 0.2 max_scale: 0.95 aspect_ratios: 1.0 aspect_ratios: 2.0 aspect_ratios: 0.5 aspect_ratios: 3.0 aspect_ratios: 0.3333 } } post_processing { batch_non_max_suppression { score_threshold: 1e-08 iou_threshold: 0.6 max_detections_per_class: 100 max_total_detections: 100 use_static_shapes: true } score_converter: SIGMOID } normalize_loss_by_num_matches: true loss { localization_loss { weighted_smooth_l1 { delta: 1.0 } } classification_loss { weighted_sigmoid_focal { gamma: 2.0 alpha: 0.75 } } classification_weight: 1.0 localization_weight: 1.0 } encode_background_as_zeros: true normalize_loc_loss_by_codesize: true inplace_batchnorm_update: true freeze_batchnorm: false } } train_config { batch_size: 32 data_augmentation_options { random_horizontal_flip { } } data_augmentation_options { ssd_random_crop { } } sync_replicas: true optimizer { momentum_optimizer { learning_rate { cosine_decay_learning_rate { learning_rate_base: 0.8 total_steps: 400000 warmup_learning_rate: 0.13333 warmup_steps: 2000 } } momentum_optimizer_value: 0.9 } use_moving_average: false } fine_tune_checkpoint: "/content/pretrained_model/ssdlite_mobiledet_edgetpu_320x320_coco_2020_05_19/ft32/model.ckpt" num_steps: 5000 startup_delay_steps: 0.0 replicas_to_aggregate: 32 max_number_of_boxes: 100 unpad_groundtruth_tensors: false } train_input_reader { label_map_path: "/content/dataset/label_map.pbtxt" tf_record_input_reader { input_path: "/content/dataset/train.record" } } eval_config { num_examples: 51 metrics_set: "coco_detection_metrics" use_moving_averages: false } eval_input_reader { label_map_path: "/content/dataset/label_map.pbtxt" shuffle: false num_epochs: 1 tf_record_input_reader { input_path: "/content/dataset/test.record" } } graph_rewriter { quantization { delay: 0 weight_bits: 8 activation_bits: 8 } }
常见原因排查
- 标签映射文件不匹配
pipeline设置num_classes:1,要求label_map.pbtxt内类的id从1开始,与TFRecord文件中存储的标注标签id完全一致。若出现id错配、标签缺失、标注id越界的问题,评估阶段无法读取有效GT框,会触发-1值返回逻辑。 - 评估数据集读取异常
验证eval_input_reader配置的测试集TFRecord路径有效性,逐样本确认标注框非空、坐标为0-1区间的归一化值,不存在越界、空标注样本。若测试集内所有样本无有效标注,评估流程无法计算指标,会输出全量-1值。 - 预训练权重加载异常
当前配置的预训练检查点为2020年发布的COCO SSD Mobiledet EdgePU模型,与TensorFlow 1.4版本的OD API版本不兼容,加载时会出现特征层权重缺失、随机初始化的问题,导致模型输出完全随机,无法匹配任何GT框。同时修改num_classes为1时,需确认预训练检查点的分类头维度匹配规则,避免出现权重加载失败、前向输出异常。 - 量化配置过早生效
当前graph_rewriter块设置量化延迟为0,即从训练第一步就开启8bit量化,初始阶段的量化误差会导致模型输出失真,无法输出有效检测框参与指标计算。
验证操作步骤
- 查看训练阶段日志,确认定位损失、分类损失值可正常下降,验证训练数据读取流程无异常
- 加载对应检查点对测试集单图做推理,确认模型可输出带置信度的检测框
- 单独读取测试集TFRecord文件,打印所有样本的标注数量、坐标、标签值,排除空标注、坐标越界问题
- 临时注释全流程量化配置,重新启动评估流程,观察指标输出是否恢复正常值
内容的提问来源于stack exchange,提问作者Nam Vu
相关产品推荐
相关产品推荐

