diff --git a/src/data.c b/src/data.c index 2a0a7e9f..46f86c11 100644 --- a/src/data.c +++ b/src/data.c @@ -320,6 +320,7 @@ void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, if (count > num_boxes) count = num_boxes; float x, y, w, h; int id; + int sub = 0; for (i = 0; i < count; ++i) { x = boxes[i].x; @@ -337,23 +338,27 @@ void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, sprintf(buff, "echo %s \"Wrong annotation: class_id = %d. But class_id should be [from 0 to %d]\" >> bad_label.list", labelpath, id, classes); system(buff); getchar(); + ++sub; continue; } if ((w < lowest_w || h < lowest_h)) { //sprintf(buff, "echo %s \"Very small object: w < lowest_w OR h < lowest_h\" >> bad_label.list", labelpath); //system(buff); + ++sub; continue; } if (x == 999999 || y == 999999) { printf("\n Wrong annotation: x = 0, y = 0 \n"); sprintf(buff, "echo %s \"Wrong annotation: x = 0 or y = 0\" >> bad_label.list", labelpath); system(buff); + ++sub; continue; } if (x <= 0 || x > 1 || y <= 0 || y > 1) { printf("\n Wrong annotation: x = %f, y = %f \n", x, y); sprintf(buff, "echo %s \"Wrong annotation: x = %f, y = %f\" >> bad_label.list", labelpath, x, y); system(buff); + ++sub; continue; } if (w > 1) { @@ -371,11 +376,11 @@ void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, if (x == 0) x += lowest_w; if (y == 0) y += lowest_h; - truth[i*5+0] = x; - truth[i*5+1] = y; - truth[i*5+2] = w; - truth[i*5+3] = h; - truth[i*5+4] = id; + truth[(i-sub)*5+0] = x; + truth[(i-sub)*5+1] = y; + truth[(i-sub)*5+2] = w; + truth[(i-sub)*5+3] = h; + truth[(i-sub)*5+4] = id; } free(boxes); } @@ -784,7 +789,7 @@ data load_data_detection(int n, char **paths, int m, int w, int h, int c, int bo image ai = image_data_augmentation(src, w, h, pleft, ptop, swidth, sheight, flip, jitter, dhue, dsat, dexp); d.X.vals[i] = ai.data; - + //show_image(ai, "aug"); //cvWaitKey(0); diff --git a/src/region_layer.c b/src/region_layer.c index 5167fb81..ada5f8e0 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -127,17 +127,17 @@ void delta_region_class(float *output, float *delta, int index, int class_id, in class_id = hier->parent[class_id]; } *avg_cat += pred; - } else { + } else { // Focal loss if (focal_loss) { // Focal Loss float alpha = 0.5; // 0.25 or 0.5 - //float gamma = 2; // hardcoded in many places of the grad-formula + //float gamma = 2; // hardcoded in many places of the grad-formula int ti = index + class_id; float pt = output[ti] + 0.000000000000001F; // http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiItKDEteCkqKDIqeCpsb2coeCkreC0xKSIsImNvbG9yIjoiIzAwMDAwMCJ9LHsidHlwZSI6MTAwMH1d - float grad = -(1 - pt) * (2 * pt*logf(pt) + pt - 1); // http://blog.csdn.net/linmingan/article/details/77885832 + float grad = -(1 - pt) * (2 * pt*logf(pt) + pt - 1); // http://blog.csdn.net/linmingan/article/details/77885832 //float grad = (1 - pt) * (2 * pt*logf(pt) + pt - 1); // https://github.com/unsky/focal-loss for (n = 0; n < classes; ++n) { @@ -224,7 +224,7 @@ void forward_region_layer(const region_layer l, network_state state) int onlyclass_id = 0; for(t = 0; t < l.max_boxes; ++t){ box truth = float_to_box(state.truth + t*5 + b*l.truths); - if(!truth.x) break; + if(!truth.x) break; // continue; int class_id = state.truth[t*5 + b*l.truths + 4]; float maxp = 0; int maxi = 0; @@ -258,7 +258,7 @@ void forward_region_layer(const region_layer l, network_state state) box truth = float_to_box(state.truth + t*5 + b*l.truths); int class_id = state.truth[t * 5 + b*l.truths + 4]; if (class_id >= l.classes) continue; // if label contains class_id more than number of classes in the cfg-file - if(!truth.x) break; + if(!truth.x) break; // continue; float iou = box_iou(pred, truth); if (iou > best_iou) { best_class_id = state.truth[t*5 + b*l.truths + 4]; @@ -302,7 +302,7 @@ void forward_region_layer(const region_layer l, network_state state) continue; // if label contains class_id more than number of classes in the cfg-file } - if(!truth.x) break; + if(!truth.x) break; // continue; float best_iou = 0; int best_index = 0; int best_n = 0; diff --git a/src/yolo_layer.c b/src/yolo_layer.c index f0bc0731..de006429 100644 --- a/src/yolo_layer.c +++ b/src/yolo_layer.c @@ -121,12 +121,12 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int if (focal_loss) { // Focal Loss float alpha = 0.5; // 0.25 or 0.5 - //float gamma = 2; // hardcoded in many places of the grad-formula + //float gamma = 2; // hardcoded in many places of the grad-formula int ti = index + stride*class_id; float pt = output[ti] + 0.000000000000001F; // http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiItKDEteCkqKDIqeCpsb2coeCkreC0xKSIsImNvbG9yIjoiIzAwMDAwMCJ9LHsidHlwZSI6MTAwMH1d - float grad = -(1 - pt) * (2 * pt*logf(pt) + pt - 1); // http://blog.csdn.net/linmingan/article/details/77885832 + float grad = -(1 - pt) * (2 * pt*logf(pt) + pt - 1); // http://blog.csdn.net/linmingan/article/details/77885832 //float grad = (1 - pt) * (2 * pt*logf(pt) + pt - 1); // https://github.com/unsky/focal-loss for (n = 0; n < classes; ++n) { @@ -206,7 +206,7 @@ void forward_yolo_layer(const layer l, network_state state) getchar(); continue; // if label contains class_id more than number of classes in the cfg-file } - if(!truth.x) break; + if(!truth.x) break; // continue; float iou = box_iou(pred, truth); if (iou > best_iou) { best_iou = iou; @@ -237,7 +237,7 @@ void forward_yolo_layer(const layer l, network_state state) int class_id = state.truth[t*(4 + 1) + b*l.truths + 4]; if (class_id >= l.classes) continue; // if label contains class_id more than number of classes in the cfg-file - if(!truth.x) break; + if(!truth.x) break; // continue; float best_iou = 0; int best_n = 0; i = (truth.x * l.w); @@ -307,8 +307,8 @@ void correct_yolo_boxes(detection *dets, int n, int w, int h, int netw, int neth } for (i = 0; i < n; ++i){ box b = dets[i].bbox; - b.x = (b.x - (netw - new_w)/2./netw) / ((float)new_w/netw); - b.y = (b.y - (neth - new_h)/2./neth) / ((float)new_h/neth); + b.x = (b.x - (netw - new_w)/2./netw) / ((float)new_w/netw); + b.y = (b.y - (neth - new_h)/2./neth) / ((float)new_h/neth); b.w *= (float)netw/new_w; b.h *= (float)neth/new_h; if(!relative){