From 81290b07376c5abb4988a492dda70913bb90133d Mon Sep 17 00:00:00 2001 From: AlexeyAB Date: Mon, 2 Mar 2020 17:36:08 +0300 Subject: [PATCH] Fixed label_smoothing for Detector --- src/gaussian_yolo_layer.c | 16 ++++++++++++++-- src/yolo_layer.c | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/gaussian_yolo_layer.c b/src/gaussian_yolo_layer.c index 7e9efb21..101005ee 100644 --- a/src/gaussian_yolo_layer.c +++ b/src/gaussian_yolo_layer.c @@ -371,13 +371,25 @@ void delta_gaussian_yolo_class(float *output, float *delta, int index, int class { int n; if (delta[index]){ - delta[index + stride*class_id] = (1 - label_smooth_eps) - output[index + stride*class_id]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*class_id] = 1 - out_val; + } + else { + delta[index + stride*class_id] = 1 - output[index + stride*class_id]; + } if (classes_multipliers) delta[index + stride*class_id] *= classes_multipliers[class_id]; if(avg_cat) *avg_cat += output[index + stride*class_id]; return; } for(n = 0; n < classes; ++n){ - delta[index + stride*n] = ((n == class_id) ? (1 - label_smooth_eps) : (0 + label_smooth_eps/classes)) - output[index + stride*n]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - out_val; + } + else { + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - output[index + stride*n]; + } if (classes_multipliers && n == class_id) delta[index + stride*class_id] *= classes_multipliers[class_id]; if(n == class_id && avg_cat) *avg_cat += output[index + stride*n]; } diff --git a/src/yolo_layer.c b/src/yolo_layer.c index 86a78895..d80dcc1d 100644 --- a/src/yolo_layer.c +++ b/src/yolo_layer.c @@ -257,7 +257,13 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int { int n; if (delta[index + stride*class_id]){ - delta[index + stride*class_id] = (1 - label_smooth_eps) - output[index + stride*class_id]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*class_id] = 1 - out_val; + } + else { + delta[index + stride*class_id] = 1 - output[index + stride*class_id]; + } if (classes_multipliers) delta[index + stride*class_id] *= classes_multipliers[class_id]; if(avg_cat) *avg_cat += output[index + stride*class_id]; return; @@ -285,7 +291,13 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int else { // default for (n = 0; n < classes; ++n) { - delta[index + stride*n] = ((n == class_id) ? (1 - label_smooth_eps) : (0 + label_smooth_eps/classes)) - output[index + stride*n]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - out_val; + } + else { + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - output[index + stride*n]; + } if (classes_multipliers && n == class_id) delta[index + stride*class_id] *= classes_multipliers[class_id]; if (n == class_id && avg_cat) *avg_cat += output[index + stride*n]; }