diff --git a/build/darknet/x64/partial.cmd b/build/darknet/x64/partial.cmd index f6225156..26a701a9 100644 --- a/build/darknet/x64/partial.cmd +++ b/build/darknet/x64/partial.cmd @@ -5,6 +5,7 @@ rem Download Yolo9000: http://pjreddie.com/media/files/yolo9000.weights rem darknet.exe partial cfg/tiny-yolo-voc.cfg tiny-yolo-voc.weights tiny-yolo-voc.conv.13 13 +darknet.exe partial cfg/yolov4-tiny.cfg yolov4-tiny.weights yolov4-tiny.conv.29 29 darknet.exe partial cfg/yolov4-sam-mish.cfg cfg/yolov4-sam-mish.weights cfg/yolov4-sam-mish.conv.137 137 diff --git a/src/parser.c b/src/parser.c index 23c28383..58a6ee3f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -386,7 +386,7 @@ int *parse_yolo_mask(char *a, int *num) return mask; } -float *get_classes_multipliers(char *cpc, const int classes) +float *get_classes_multipliers(char *cpc, const int classes, const float max_delta) { float *classes_multipliers = NULL; if (cpc) { @@ -398,9 +398,15 @@ float *get_classes_multipliers(char *cpc, const int classes) } float max_counter = 0; int i; - for (i = 0; i < classes_counters; ++i) if (max_counter < counters_per_class[i]) max_counter = counters_per_class[i]; + for (i = 0; i < classes_counters; ++i) { + if (counters_per_class[i] < 1) counters_per_class[i] = 1; + if (max_counter < counters_per_class[i]) max_counter = counters_per_class[i]; + } classes_multipliers = (float *)calloc(classes_counters, sizeof(float)); - for (i = 0; i < classes_counters; ++i) classes_multipliers[i] = max_counter / counters_per_class[i]; + for (i = 0; i < classes_counters; ++i) { + classes_multipliers[i] = max_counter / counters_per_class[i]; + if(classes_multipliers[i] > max_delta) classes_multipliers[i] = max_delta; + } free(counters_per_class); printf(" classes_multipliers: "); for (i = 0; i < classes_counters; ++i) printf("%.1f, ", classes_multipliers[i]); @@ -425,13 +431,13 @@ layer parse_yolo(list *options, size_params params) } //assert(l.outputs == params.inputs); + l.max_delta = option_find_float_quiet(options, "max_delta", FLT_MAX); // set 10 char *cpc = option_find_str(options, "counters_per_class", 0); - l.classes_multipliers = get_classes_multipliers(cpc, classes); + l.classes_multipliers = get_classes_multipliers(cpc, classes, l.max_delta); 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.objectness_smooth = option_find_int_quiet(options, "objectness_smooth", 0); - l.max_delta = option_find_float_quiet(options, "max_delta", FLT_MAX); // set 10 l.iou_normalizer = option_find_float_quiet(options, "iou_normalizer", 0.75); l.cls_normalizer = option_find_float_quiet(options, "cls_normalizer", 1); char *iou_loss = option_find_str_quiet(options, "iou_loss", "mse"); // "iou"); @@ -534,14 +540,13 @@ layer parse_gaussian_yolo(list *options, size_params params) // Gaussian_YOLOv3 exit(EXIT_FAILURE); } //assert(l.outputs == params.inputs); - + l.max_delta = option_find_float_quiet(options, "max_delta", FLT_MAX); // set 10 char *cpc = option_find_str(options, "counters_per_class", 0); - l.classes_multipliers = get_classes_multipliers(cpc, classes); + l.classes_multipliers = get_classes_multipliers(cpc, classes, l.max_delta); 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.objectness_smooth = option_find_int_quiet(options, "objectness_smooth", 0); - l.max_delta = option_find_float_quiet(options, "max_delta", FLT_MAX); // set 10 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.cls_normalizer = option_find_float_quiet(options, "cls_normalizer", 1.0); diff --git a/src/yolo_layer.c b/src/yolo_layer.c index be56972c..1f609f7a 100644 --- a/src/yolo_layer.c +++ b/src/yolo_layer.c @@ -416,7 +416,9 @@ void forward_yolo_layer(const layer l, network_state state) int class_id = state.truth[best_match_t*(4 + 1) + b*l.truths + 4]; if (l.map) class_id = l.map[class_id]; - 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); + if (class_id < l.classes && class_id >= 0) { + 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); + } } else l.delta[obj_index] = 0; }