| | |
| | | #ifdef _DEBUG |
| | | #include <stdlib.h> |
| | | #include <crtdbg.h> |
| | | #endif |
| | | |
| | | #include "network.h" |
| | | #include "region_layer.h" |
| | | #include "cost_layer.h" |
| | |
| | | |
| | | static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90}; |
| | | |
| | | void replace_image_to_label(char *input_path, char *output_path) { |
| | | find_replace(input_path, "images", "labels", output_path); |
| | | find_replace(output_path, "JPEGImages", "labels", output_path); |
| | | find_replace(output_path, ".jpg", ".txt", output_path); |
| | | find_replace(output_path, ".png", ".txt", output_path); |
| | | find_replace(output_path, ".bmp", ".txt", output_path); |
| | | find_replace(output_path, ".JPG", ".txt", output_path); |
| | | find_replace(output_path, ".JPEG", ".txt", output_path); |
| | | find_replace(output_path, ".ppm", ".txt", output_path); |
| | | } |
| | | |
| | | void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show) |
| | | { |
| | | list *options = read_data_cfg(datacfg); |
| | |
| | | srand(time(0)); |
| | | network net = nets[0]; |
| | | |
| | | if ((net.batch * net.subdivisions) == 1) { |
| | | const int actual_batch_size = net.batch * net.subdivisions; |
| | | if (actual_batch_size == 1) { |
| | | printf("\n Error: You set incorrect value batch=1 for Training! You should set batch=64 subdivision=64 \n"); |
| | | getchar(); |
| | | } |
| | | else if (actual_batch_size < 64) { |
| | | printf("\n Warning: You set batch=%d lower than 64! It is recommended to set batch=64 subdivision=64 \n", actual_batch_size); |
| | | } |
| | | |
| | | int imgs = net.batch * net.subdivisions * ngpus; |
| | | printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); |
| | |
| | | load_args args = {0}; |
| | | args.w = net.w; |
| | | args.h = net.h; |
| | | args.paths = paths; |
| | | args.c = net.c; |
| | | args.paths = paths; |
| | | args.n = imgs; |
| | | args.m = plist->size; |
| | | args.classes = classes; |
| | |
| | | args.hue = net.hue; |
| | | |
| | | #ifdef OPENCV |
| | | args.threads = 3; |
| | | args.threads = 3 * ngpus; |
| | | IplImage* img = NULL; |
| | | float max_img_loss = 5; |
| | | int number_of_lines = 100; |
| | |
| | | //int dim = (rand() % 12 + (init_w/32 - 5)) * 32; // +-160 |
| | | //int dim = (rand() % 4 + 16) * 32; |
| | | //if (get_current_batch(net)+100 > net.max_batches) dim = 544; |
| | | int random_val = rand() % 12; |
| | | int dim_w = (random_val + (init_w / 32 - 5)) * 32; // +-160 |
| | | int dim_h = (random_val + (init_h / 32 - 5)) * 32; // +-160 |
| | | |
| | | //int random_val = rand() % 12; |
| | | //int dim_w = (random_val + (init_w / 32 - 5)) * 32; // +-160 |
| | | //int dim_h = (random_val + (init_h / 32 - 5)) * 32; // +-160 |
| | | |
| | | float random_val = rand_scale(1.4); // *x or /x |
| | | int dim_w = roundl(random_val*init_w / 32) * 32; |
| | | int dim_h = roundl(random_val*init_h / 32) * 32; |
| | | |
| | | if (dim_w < 32) dim_w = 32; |
| | | if (dim_h < 32) dim_h = 32; |
| | | |
| | |
| | | avg_loss = avg_loss*.9 + loss*.1; |
| | | |
| | | i = get_current_batch(net); |
| | | printf("\n %d: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), (what_time_is_it_now()-time), i*imgs); |
| | | printf("\n %d: %f, %f avg loss, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), (what_time_is_it_now()-time), i*imgs); |
| | | |
| | | #ifdef OPENCV |
| | | if(!dont_show) |
| | |
| | | sprintf(buff, "%s/%s_final.weights", backup_directory, base); |
| | | save_weights(net, buff); |
| | | |
| | | //cvReleaseImage(&img); |
| | | //cvDestroyAllWindows(); |
| | | #ifdef OPENCV |
| | | cvReleaseImage(&img); |
| | | cvDestroyAllWindows(); |
| | | #endif |
| | | |
| | | // free memory |
| | | pthread_join(load_thread, 0); |
| | | free_data(buffer); |
| | | |
| | | free(base); |
| | | free(paths); |
| | | free_list_contents(plist); |
| | | free_list(plist); |
| | | |
| | | free_list_contents_kvp(options); |
| | | free_list(options); |
| | | |
| | | free(nets); |
| | | free_network(net); |
| | | } |
| | | |
| | | |
| | |
| | | load_args args = { 0 }; |
| | | args.w = net.w; |
| | | args.h = net.h; |
| | | args.c = net.c; |
| | | args.type = IMAGE_DATA; |
| | | //args.type = LETTERBOX_DATA; |
| | | |
| | |
| | | |
| | | for (i = 0; i < m; ++i) { |
| | | char *path = paths[i]; |
| | | image orig = load_image_color(path, 0, 0); |
| | | image orig = load_image(path, 0, 0, net.c); |
| | | image sized = resize_image(orig, net.w, net.h); |
| | | char *id = basecfg(path); |
| | | network_predict(net, sized.data); |
| | |
| | | |
| | | char labelpath[4096]; |
| | | replace_image_to_label(path, labelpath); |
| | | //find_replace(path, "images", "labels", labelpath); |
| | | //find_replace(labelpath, "JPEGImages", "labels", labelpath); |
| | | //find_replace(labelpath, ".jpg", ".txt", labelpath); |
| | | //find_replace(labelpath, ".png", ".txt", labelpath); |
| | | //find_replace(labelpath, ".bmp", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPEG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".ppm", ".txt", labelpath); |
| | | |
| | | int num_labels = 0; |
| | | box_label *truth = read_boxes(labelpath, &num_labels); |
| | |
| | | char *mapf = option_find_str(options, "map", 0); |
| | | int *map = 0; |
| | | if (mapf) map = read_map(mapf); |
| | | FILE* reinforcement_fd = NULL; |
| | | |
| | | network net = parse_network_cfg_custom(cfgfile, 1); // set batch=1 |
| | | if (weightfile) { |
| | |
| | | load_args args = { 0 }; |
| | | args.w = net.w; |
| | | args.h = net.h; |
| | | args.c = net.c; |
| | | args.type = IMAGE_DATA; |
| | | //args.type = LETTERBOX_DATA; |
| | | |
| | |
| | | |
| | | char labelpath[4096]; |
| | | replace_image_to_label(path, labelpath); |
| | | //find_replace(path, "images", "labels", labelpath); |
| | | //find_replace(labelpath, "JPEGImages", "labels", labelpath); |
| | | //find_replace(labelpath, ".jpg", ".txt", labelpath); |
| | | //find_replace(labelpath, ".png", ".txt", labelpath); |
| | | //find_replace(labelpath, ".bmp", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPEG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".ppm", ".txt", labelpath); |
| | | int num_labels = 0; |
| | | box_label *truth = read_boxes(labelpath, &num_labels); |
| | | int i, j; |
| | |
| | | char *path_dif = paths_dif[image_index]; |
| | | |
| | | char labelpath_dif[4096]; |
| | | find_replace(path_dif, "images", "labels", labelpath_dif); |
| | | find_replace(labelpath_dif, "JPEGImages", "labels", labelpath_dif); |
| | | find_replace(labelpath_dif, ".jpg", ".txt", labelpath_dif); |
| | | find_replace(labelpath_dif, ".JPEG", ".txt", labelpath_dif); |
| | | find_replace(labelpath_dif, ".png", ".txt", labelpath_dif); |
| | | replace_image_to_label(path_dif, labelpath_dif); |
| | | |
| | | truth_dif = read_boxes(labelpath_dif, &num_labels_dif); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | unique_truth_count += num_labels; |
| | | |
| | | //static int previous_errors = 0; |
| | | //int total_errors = fp_for_thresh + (unique_truth_count - tp_for_thresh); |
| | | //int errors_in_this_image = total_errors - previous_errors; |
| | | //previous_errors = total_errors; |
| | | //if(reinforcement_fd == NULL) reinforcement_fd = fopen("reinforcement.txt", "wb"); |
| | | //char buff[1000]; |
| | | //sprintf(buff, "%s\n", path); |
| | | //if(errors_in_this_image > 0) fwrite(buff, sizeof(char), strlen(buff), reinforcement_fd); |
| | | |
| | | free_detections(dets, nboxes); |
| | | free(id); |
| | | free_image(val[t]); |
| | |
| | | free(truth_classes_count); |
| | | |
| | | fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start)); |
| | | if (reinforcement_fd != NULL) fclose(reinforcement_fd); |
| | | } |
| | | |
| | | #ifdef OPENCV |
| | |
| | | char *path = paths[i]; |
| | | char labelpath[4096]; |
| | | replace_image_to_label(path, labelpath); |
| | | //find_replace(path, "images", "labels", labelpath); |
| | | //find_replace(labelpath, "JPEGImages", "labels", labelpath); |
| | | //find_replace(labelpath, ".jpg", ".txt", labelpath); |
| | | //find_replace(labelpath, ".png", ".txt", labelpath); |
| | | //find_replace(labelpath, ".bmp", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPEG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".ppm", ".txt", labelpath); |
| | | |
| | | int num_labels = 0; |
| | | box_label *truth = read_boxes(labelpath, &num_labels); |
| | | //printf(" new path: %s \n", labelpath); |
| | | char buff[1024]; |
| | | for (j = 0; j < num_labels; ++j) |
| | | { |
| | | if (truth[j].x > 1 || truth[j].x <= 0 || truth[j].y > 1 || truth[j].y <= 0 || |
| | | truth[j].w > 1 || truth[j].w <= 0 || truth[j].h > 1 || truth[j].h <= 0) |
| | | { |
| | | printf("\n\nWrong label: %s - j = %d, x = %f, y = %f, width = %f, height = %f \n", |
| | | labelpath, j, truth[j].x, truth[j].y, truth[j].w, truth[j].h); |
| | | sprintf(buff, "echo \"Wrong label: %s - j = %d, x = %f, y = %f, width = %f, height = %f\" >> bad_label.list", |
| | | labelpath, j, truth[j].x, truth[j].y, truth[j].w, truth[j].h); |
| | | system(buff); |
| | | } |
| | | number_of_boxes++; |
| | | rel_width_height_array = realloc(rel_width_height_array, 2 * number_of_boxes * sizeof(float)); |
| | | rel_width_height_array[number_of_boxes * 2 - 2] = truth[j].w * width; |
| | |
| | | //for (i = 0; i < number_of_boxes; ++i) |
| | | // printf("%2.2f,%2.2f, ", points->data.fl[i * 2], points->data.fl[i * 2 + 1]); |
| | | |
| | | printf("\n"); |
| | | float avg_iou = 0; |
| | | for (i = 0; i < number_of_boxes; ++i) { |
| | | float box_w = points->data.fl[i * 2]; |
| | |
| | | float box_intersect = min_w*min_h; |
| | | float box_union = box_w*box_h + anchor_w*anchor_h - box_intersect; |
| | | float iou = box_intersect / box_union; |
| | | if (iou > 1 || iou < 0) { |
| | | printf(" i = %d, box_w = %d, box_h = %d, anchor_w = %d, anchor_h = %d, iou = %f \n", |
| | | if (iou > 1 || iou < 0) { // || box_w > width || box_h > height) { |
| | | printf(" Wrong label: i = %d, box_w = %d, box_h = %d, anchor_w = %d, anchor_h = %d, iou = %f \n", |
| | | i, box_w, box_h, anchor_w, anchor_h, iou); |
| | | } |
| | | else avg_iou += iou; |
| | |
| | | { |
| | | list *options = read_data_cfg(datacfg); |
| | | char *name_list = option_find_str(options, "names", "data/names.list"); |
| | | char **names = get_labels(name_list); |
| | | int names_size = 0; |
| | | char **names = get_labels_custom(name_list, &names_size); //get_labels(name_list); |
| | | |
| | | image **alphabet = load_alphabet(); |
| | | network net = parse_network_cfg_custom(cfgfile, 1); // set batch=1 |
| | |
| | | } |
| | | //set_batch_network(&net, 1); |
| | | fuse_conv_batchnorm(net); |
| | | if (net.layers[net.n - 1].classes != names_size) { |
| | | printf(" Error: in the file %s number of names %d that isn't equal to classes=%d in the file %s \n", |
| | | name_list, names_size, net.layers[net.n - 1].classes, datacfg); |
| | | if(net.layers[net.n - 1].classes > names_size) getchar(); |
| | | } |
| | | srand(2222222); |
| | | double time; |
| | | char buff[256]; |
| | |
| | | if(!input) return; |
| | | strtok(input, "\n"); |
| | | } |
| | | image im = load_image_color(input,0,0); |
| | | image im = load_image(input,0,0,net.c); |
| | | int letterbox = 0; |
| | | //image sized = resize_image(im, net.w, net.h); |
| | | image sized = letterbox_image(im, net.w, net.h); letterbox = 1; |
| | | image sized = resize_image(im, net.w, net.h); |
| | | //image sized = letterbox_image(im, net.w, net.h); letterbox = 1; |
| | | layer l = net.layers[net.n-1]; |
| | | |
| | | //box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); |
| | |
| | | { |
| | | char labelpath[4096]; |
| | | replace_image_to_label(input, labelpath); |
| | | //find_replace(input, ".jpg", ".txt", labelpath); |
| | | //find_replace(labelpath, ".png", ".txt", labelpath); |
| | | //find_replace(labelpath, ".bmp", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".JPEG", ".txt", labelpath); |
| | | //find_replace(labelpath, ".ppm", ".txt", labelpath); |
| | | |
| | | FILE* fw = fopen(labelpath, "wb"); |
| | | int i; |
| | |
| | | |
| | | // free memory |
| | | free_ptrs(names, net.layers[net.n - 1].classes); |
| | | free_list_contents_kvp(options); |
| | | free_list(options); |
| | | |
| | | int i; |
| | |
| | | if(strlen(filename) > 0) |
| | | if (filename[strlen(filename) - 1] == 0x0d) filename[strlen(filename) - 1] = 0; |
| | | demo(cfg, weights, thresh, hier_thresh, cam_index, filename, names, classes, frame_skip, prefix, out_filename, |
| | | http_stream_port, dont_show); |
| | | http_stream_port, dont_show, ext_output); |
| | | |
| | | free_list_contents_kvp(options); |
| | | free_list(options); |
| | | } |
| | | else printf(" There isn't such command: %s", argv[2]); |
| | | } |