Fixed label_smoothing for Detector

pull/4955/head darknet_yolo_v3_optimal
AlexeyAB 5 years ago
parent c814d56ec1
commit 81290b0737
  1. 16
      src/gaussian_yolo_layer.c
  2. 16
      src/yolo_layer.c

@ -371,13 +371,25 @@ void delta_gaussian_yolo_class(float *output, float *delta, int index, int class
{ {
int n; int n;
if (delta[index]){ 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 (classes_multipliers) delta[index + stride*class_id] *= classes_multipliers[class_id];
if(avg_cat) *avg_cat += output[index + stride*class_id]; if(avg_cat) *avg_cat += output[index + stride*class_id];
return; return;
} }
for(n = 0; n < classes; ++n){ 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 (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]; if(n == class_id && avg_cat) *avg_cat += output[index + stride*n];
} }

@ -257,7 +257,13 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int
{ {
int n; int n;
if (delta[index + stride*class_id]){ 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 (classes_multipliers) delta[index + stride*class_id] *= classes_multipliers[class_id];
if(avg_cat) *avg_cat += output[index + stride*class_id]; if(avg_cat) *avg_cat += output[index + stride*class_id];
return; return;
@ -285,7 +291,13 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int
else { else {
// default // default
for (n = 0; n < classes; ++n) { 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 (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]; if (n == class_id && avg_cat) *avg_cat += output[index + stride*n];
} }

Loading…
Cancel
Save