yolov3 图像批量处理程序

yolov3批量测试代码,网上查找了一篇,稍有些问题,这里贴出修改后代码。原理就是在原有的程序上加了批量的内容。
参考博客:https://blog.csdn.net/xczexcel/article/details/80585776

void batch_process(char *datacfg, char *cfgfile, char *weightfile, char *read_file, float thresh, float hier_thresh, char *save_file)

{

    list *options = read_data_cfg(datacfg);

    char *name_list = option_find_str(options, "names", "data/names.list");

    char **names = get_labels(name_list);



    image **alphabet = load_alphabet();

    network net = parse_network_cfg_custom(cfgfile, 1);
    if (weightfile) {
        load_weights(&net, weightfile);
    }
    set_batch_network(&net, 1);

    srand(2222222);

    double time;

    float nms = .45;

    int max_len = 256;

    char buf[256];

    FILE *writer;

    FILE *fp;

    int len;

    if ((writer = fopen(save_file, "w")) == NULL) {

        printf("%s", "conld not open output_file\n");

        exit(1);

    }

    if ((fp = fopen(read_file, "r")) == NULL) {

        printf("%s", "could not open image_list file\n");

        exit(1);

    }
    while (fgets(buf, max_len, fp) != NULL) {

        len = strlen(buf);

        buf[len - 1] = '\0';

        //fprintf(writer, "%s", buf);

        char *image_name = buf;

        image im = load_image_color(image_name, 0, 0);
        int letterbox = 0;
        image sized = resize_image(im, net.w, net.h);

        layer l = net.layers[net.n - 1];
        float *X = sized.data;

        network_predict(net, X);

        printf("Process:%s\n", image_name);

        int nboxes = 0;

        //detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes);
        detection *dets = get_network_boxes(&net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes, letterbox);
        if (nms) do_nms_sort_v3(dets, nboxes, l.classes, nms);

        int i, j;
        fprintf(writer,"\n");
        //printf("%d\n",nboxes);

        //printf("classes:%d\n",l.classes);

        if (nboxes != 0) {

            for (i = 0; i<nboxes; i++) {

                float xmin = (dets[i].bbox.x - dets[i].bbox.w / 2.)*im.w;

                float xmax = (dets[i].bbox.x + dets[i].bbox.w / 2.)*im.w;

                float ymin = (dets[i].bbox.y - dets[i].bbox.h / 2.)*im.h;

                float ymax = (dets[i].bbox.y + dets[i].bbox.h / 2.)*im.h;

                for (j = 0; j<l.classes; j++) {

                    if (dets[i].prob[j]) {

                        fprintf(writer, "%f, %f, %f, %f, %d,", xmin, ymin, xmax, ymax, j);

                    }

                }

            }

        }

        free_detections(dets, nboxes);

        free_image(im);

        free_image(sized);

    }

}

剩余部分相同,修改void run_detector(int argc, char **argv)函数,就是讲batch指令加入

if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);  
    else if(0==strcmp(argv[2],"batch")){  
        if(argv<=7){  
            printf("%s\n","image_list and output_file is required!");  
            exit(0);  
        }  
        char *image_list= argv[6];  
        char *save_file=  argv[7];  
        batch_process(datacfg, cfg, weights, image_list, thresh, hier_thresh, save_file);  
    }   
    else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear);  
    else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile);  
    else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile);  
    else if(0==strcmp(argv[2], "recall")) validate_detector_recall(cfg, weights);  
    else if(0==strcmp(argv[2], "demo")) {  
        list *options = read_data_cfg(datacfg);  
        int classes = option_find_int(options, "classes", 20);  
        char *name_list = option_find_str(options, "names", "data/names.list");  
        char **names = get_labels(name_list);  
        demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, avg, hier_thresh, width, height, fps, fullscreen);  
    }

最后使用
detector.exe detector batch cfg/coco.data cfg/yolov3.cfg yolov3.weights input_image_list.txt output_results.txt

注意:如果要修改格式,请修改fprintf内的格式,printf修改的是控制台。

猜你喜欢

转载自blog.csdn.net/q199502092010/article/details/81383808