Added label_smooth_eps=0.1 for [yolo] and [Gaussian_yolo] layer for Label Smoothing

pull/7577/head
AlexeyAB 6 years ago
parent 67e94dc1de
commit 318919e1cb
  1. 1
      include/darknet.h
  2. 2
      src/detector.c
  3. 12
      src/gaussian_yolo_layer.c
  4. 2
      src/parser.c
  5. 12
      src/yolo_layer.c

@ -257,6 +257,7 @@ struct layer {
float learning_rate_scale; float learning_rate_scale;
float clip; float clip;
int focal_loss; int focal_loss;
float label_smooth_eps;
int noloss; int noloss;
int softmax; int softmax;
int classes; int classes;

@ -141,7 +141,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i
args.show_imgs = show_imgs; args.show_imgs = show_imgs;
#ifdef OPENCV #ifdef OPENCV
args.threads = 3 * ngpus; // Amazon EC2 Tesla V100: p3.2xlarge (8 logical cores) - p3.16xlarge args.threads = 6 * ngpus; // 3 for - Amazon EC2 Tesla V100: p3.2xlarge (8 logical cores) - p3.16xlarge
//args.threads = 12 * ngpus; // Ryzen 7 2700X (16 logical cores) //args.threads = 12 * ngpus; // Ryzen 7 2700X (16 logical cores)
mat_cv* img = NULL; mat_cv* img = NULL;
float max_img_loss = 5; float max_img_loss = 5;

@ -330,16 +330,16 @@ void averages_gaussian_yolo_deltas(int class_index, int box_index, int stride, i
} }
} }
void delta_gaussian_yolo_class(float *output, float *delta, int index, int class_id, int classes, int stride, float *avg_cat) void delta_gaussian_yolo_class(float *output, float *delta, int index, int class_id, int classes, int stride, float *avg_cat, float label_smooth_eps)
{ {
int n; int n;
if (delta[index]){ if (delta[index]){
delta[index + stride*class_id] = 1 - output[index + stride*class_id]; delta[index + stride*class_id] = (1 - label_smooth_eps) - output[index + stride*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 : 0) - output[index + stride*n]; delta[index + stride*n] = ((n == class_id) ? (1 - label_smooth_eps) : (0 + label_smooth_eps/classes)) - output[index + stride*n];
if(n == class_id && avg_cat) *avg_cat += output[index + stride*n]; if(n == class_id && avg_cat) *avg_cat += output[index + stride*n];
} }
} }
@ -452,7 +452,7 @@ void forward_gaussian_yolo_layer(const layer l, network_state state)
int class_id = state.truth[best_t*(4 + 1) + b*l.truths + 4]; int class_id = state.truth[best_t*(4 + 1) + b*l.truths + 4];
if (l.map) class_id = l.map[class_id]; if (l.map) class_id = l.map[class_id];
int class_index = entry_gaussian_index(l, b, n*l.w*l.h + j*l.w + i, 9); int class_index = entry_gaussian_index(l, b, n*l.w*l.h + j*l.w + i, 9);
delta_gaussian_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, 0); delta_gaussian_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, 0, l.label_smooth_eps);
box truth = float_to_box_stride(state.truth + best_t*(4 + 1) + b*l.truths, 1); box truth = float_to_box_stride(state.truth + best_t*(4 + 1) + b*l.truths, 1);
delta_gaussian_yolo_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, state.net.w, state.net.h, l.delta, (2-truth.w*truth.h), l.w*l.h, l.iou_normalizer, l.iou_loss, l.uc_normalizer, 1, l.yolo_point); delta_gaussian_yolo_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, state.net.w, state.net.h, l.delta, (2-truth.w*truth.h), l.w*l.h, l.iou_normalizer, l.iou_loss, l.uc_normalizer, 1, l.yolo_point);
} }
@ -506,7 +506,7 @@ void forward_gaussian_yolo_layer(const layer l, network_state state)
int class_id = state.truth[t*(4 + 1) + b*l.truths + 4]; int class_id = state.truth[t*(4 + 1) + b*l.truths + 4];
if (l.map) class_id = l.map[class_id]; if (l.map) class_id = l.map[class_id];
int class_index = entry_gaussian_index(l, b, mask_n*l.w*l.h + j*l.w + i, 9); int class_index = entry_gaussian_index(l, b, mask_n*l.w*l.h + j*l.w + i, 9);
delta_gaussian_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat); delta_gaussian_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat, l.label_smooth_eps);
++count; ++count;
++class_count; ++class_count;
@ -537,7 +537,7 @@ void forward_gaussian_yolo_layer(const layer l, network_state state)
int class_id = state.truth[t*(4 + 1) + b*l.truths + 4]; int class_id = state.truth[t*(4 + 1) + b*l.truths + 4];
if (l.map) class_id = l.map[class_id]; if (l.map) class_id = l.map[class_id];
int class_index = entry_gaussian_index(l, b, mask_n*l.w*l.h + j*l.w + i, 9); int class_index = entry_gaussian_index(l, b, mask_n*l.w*l.h + j*l.w + i, 9);
delta_gaussian_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat); delta_gaussian_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat, l.label_smooth_eps);
++count; ++count;
++class_count; ++class_count;

@ -365,6 +365,7 @@ layer parse_yolo(list *options, size_params params)
} }
//assert(l.outputs == params.inputs); //assert(l.outputs == params.inputs);
l.label_smooth_eps = option_find_float_quiet(options, "label_smooth_eps", 0.0f);
l.scale_x_y = option_find_float_quiet(options, "scale_x_y", 1); l.scale_x_y = option_find_float_quiet(options, "scale_x_y", 1);
l.iou_normalizer = option_find_float_quiet(options, "iou_normalizer", 0.75); l.iou_normalizer = option_find_float_quiet(options, "iou_normalizer", 0.75);
l.cls_normalizer = option_find_float_quiet(options, "cls_normalizer", 1); l.cls_normalizer = option_find_float_quiet(options, "cls_normalizer", 1);
@ -456,6 +457,7 @@ layer parse_gaussian_yolo(list *options, size_params params) // Gaussian_YOLOv3
} }
//assert(l.outputs == params.inputs); //assert(l.outputs == params.inputs);
l.label_smooth_eps = option_find_float_quiet(options, "label_smooth_eps", 0.0f);
l.scale_x_y = option_find_float_quiet(options, "scale_x_y", 1); l.scale_x_y = option_find_float_quiet(options, "scale_x_y", 1);
l.uc_normalizer = option_find_float_quiet(options, "uc_normalizer", 1.0); l.uc_normalizer = option_find_float_quiet(options, "uc_normalizer", 1.0);
l.iou_normalizer = option_find_float_quiet(options, "iou_normalizer", 0.75); l.iou_normalizer = option_find_float_quiet(options, "iou_normalizer", 0.75);

@ -217,11 +217,11 @@ void averages_yolo_deltas(int class_index, int box_index, int stride, int classe
} }
} }
void delta_yolo_class(float *output, float *delta, int index, int class_id, int classes, int stride, float *avg_cat, int focal_loss) void delta_yolo_class(float *output, float *delta, int index, int class_id, int classes, int stride, float *avg_cat, int focal_loss, float label_smooth_eps)
{ {
int n; int n;
if (delta[index + stride*class_id]){ if (delta[index + stride*class_id]){
delta[index + stride*class_id] = 1 - output[index + stride*class_id]; delta[index + stride*class_id] = (1 - label_smooth_eps) - output[index + stride*class_id];
if(avg_cat) *avg_cat += output[index + stride*class_id]; if(avg_cat) *avg_cat += output[index + stride*class_id];
return; return;
} }
@ -248,7 +248,7 @@ 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 : 0) - output[index + stride*n]; delta[index + stride*n] = ((n == class_id) ? (1 - label_smooth_eps) : (0 + label_smooth_eps/classes)) - output[index + stride*n];
if (n == class_id && avg_cat) *avg_cat += output[index + stride*n]; if (n == class_id && avg_cat) *avg_cat += output[index + stride*n];
} }
} }
@ -359,7 +359,7 @@ void forward_yolo_layer(const layer l, network_state state)
int class_id = state.truth[best_t*(4 + 1) + b*l.truths + 4]; int class_id = state.truth[best_t*(4 + 1) + b*l.truths + 4];
if (l.map) class_id = l.map[class_id]; if (l.map) class_id = l.map[class_id];
int class_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4 + 1); int class_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4 + 1);
delta_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, 0, l.focal_loss); delta_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, 0, l.focal_loss, l.label_smooth_eps);
box truth = float_to_box_stride(state.truth + best_t*(4 + 1) + b*l.truths, 1); box truth = float_to_box_stride(state.truth + best_t*(4 + 1) + b*l.truths, 1);
delta_yolo_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, state.net.w, state.net.h, l.delta, (2 - truth.w*truth.h), l.w*l.h, l.iou_normalizer, l.iou_loss, 1); delta_yolo_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, state.net.w, state.net.h, l.delta, (2 - truth.w*truth.h), l.w*l.h, l.iou_normalizer, l.iou_loss, 1);
} }
@ -421,7 +421,7 @@ void forward_yolo_layer(const layer l, network_state state)
int class_id = state.truth[t*(4 + 1) + b*l.truths + 4]; int class_id = state.truth[t*(4 + 1) + b*l.truths + 4];
if (l.map) class_id = l.map[class_id]; if (l.map) class_id = l.map[class_id];
int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4 + 1); int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4 + 1);
delta_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat, l.focal_loss); delta_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat, l.focal_loss, l.label_smooth_eps);
++count; ++count;
++class_count; ++class_count;
@ -463,7 +463,7 @@ void forward_yolo_layer(const layer l, network_state state)
int class_id = state.truth[t*(4 + 1) + b*l.truths + 4]; int class_id = state.truth[t*(4 + 1) + b*l.truths + 4];
if (l.map) class_id = l.map[class_id]; if (l.map) class_id = l.map[class_id];
int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4 + 1); int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4 + 1);
delta_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat, l.focal_loss); delta_yolo_class(l.output, l.delta, class_index, class_id, l.classes, l.w*l.h, &avg_cat, l.focal_loss, l.label_smooth_eps);
++count; ++count;
++class_count; ++class_count;

Loading…
Cancel
Save