|
|
|
@ -217,11 +217,12 @@ 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, float label_smooth_eps) |
|
|
|
|
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, float *classes_multipliers) |
|
|
|
|
{ |
|
|
|
|
int n; |
|
|
|
|
if (delta[index + stride*class_id]){ |
|
|
|
|
delta[index + stride*class_id] = (1 - label_smooth_eps) - 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; |
|
|
|
|
} |
|
|
|
@ -249,6 +250,7 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int |
|
|
|
|
// 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 (classes_multipliers) delta[index + stride*class_id] *= classes_multipliers[class_id]; |
|
|
|
|
if (n == class_id && avg_cat) *avg_cat += output[index + stride*n]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -359,7 +361,7 @@ void forward_yolo_layer(const layer l, network_state state) |
|
|
|
|
int class_id = state.truth[best_t*(4 + 1) + b*l.truths + 4]; |
|
|
|
|
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); |
|
|
|
|
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); |
|
|
|
|
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, l.classes_multipliers); |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
@ -421,7 +423,7 @@ void forward_yolo_layer(const layer l, network_state state) |
|
|
|
|
int class_id = state.truth[t*(4 + 1) + b*l.truths + 4]; |
|
|
|
|
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); |
|
|
|
|
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); |
|
|
|
|
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, l.classes_multipliers); |
|
|
|
|
|
|
|
|
|
++count; |
|
|
|
|
++class_count; |
|
|
|
@ -463,7 +465,7 @@ void forward_yolo_layer(const layer l, network_state state) |
|
|
|
|
int class_id = state.truth[t*(4 + 1) + b*l.truths + 4]; |
|
|
|
|
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); |
|
|
|
|
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); |
|
|
|
|
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, l.classes_multipliers); |
|
|
|
|
|
|
|
|
|
++count; |
|
|
|
|
++class_count; |
|
|
|
|