即使条件仍然为真,while 循环仍停留在底部

时间:2021-01-30 06:19:59

标签: c while-loop segmentation-fault stack-overflow

我正在使用 YOLO 进行对象检测,并想编辑代码文件以对文件夹中的所有图像运行检测,我发现此功能 Github link to the function

我编辑了 here 中的“test_detector”函数,如下所示:

while (1) {
    folder = opendir("./result_img/");
    char str1[100] = "./result_img/";
    while( (entry=readdir(folder)) != NULL)
    
    {
    if((strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0 || (entry->d_name) == '.' ) || (strcmp(entry->d_name,"Server_v1.py")==0))
    {
     printf(".");
     sleep(0.5);
     continue;
    }
    if (filename) {
        
        strcat(str1, entry->d_name);
        strncpy(input, str1, 256);
        closedir(folder);
        if (strlen(input) > 0)
            if (input[strlen(input) - 1] == 0x0d) input[strlen(input) - 1] = 0;
    }
    else {
        printf("Enter Image Path: ");
        fflush(stdout);
        input = fgets(input, 256, stdin);
        if (!input) break;
        strtok(input, "\n");
    
    }
    //image im;
    //image sized = load_image_resize(input, net.w, net.h, net.c, &im);
    image im = load_image(input, 0, 0, net.c);
    image sized;
    if(letter_box) sized = letterbox_image(im, net.w, net.h);
    else sized = resize_image(im, net.w, net.h);

    layer l = net.layers[net.n - 1];
    int k;
    for (k = 0; k < net.n; ++k) {
        layer lk = net.layers[k];
        if (lk.type == YOLO || lk.type == GAUSSIAN_YOLO || lk.type == REGION) {
            l = lk;
            printf(" Detection layer: %d - type = %d \n", k, l.type);
        }
    }

    //box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
    //float **probs = calloc(l.w*l.h*l.n, sizeof(float*));
    //for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float*)xcalloc(l.classes, sizeof(float));

    float *X = sized.data;

    //time= what_time_is_it_now();
    double time = get_time_point();
    network_predict(net, X);
    //network_predict_image(&net, im); letterbox = 1;
    printf("%s: Predicted in %lf milli-seconds.\n", input, ((double)get_time_point() - time) / 1000);
    //printf("%s: Predicted in %f seconds.\n", input, (what_time_is_it_now()-time));

    int nboxes = 0;
    detection *dets = get_network_boxes(&net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes, letter_box);
    if (nms) {
        if (l.nms_kind == DEFAULT_NMS) do_nms_sort(dets, nboxes, l.classes, nms);
        else diounms_sort(dets, nboxes, l.classes, nms, l.nms_kind, l.beta_nms);
    }
    draw_detections_v3(im, dets, nboxes, thresh, names, alphabet, l.classes, ext_output, input);
    save_image(im, "predictions");
    if (!dont_show) {
        show_image(im, "predictions");
    }

    if (json_file) {
        if (json_buf) {
            char *tmp = ", \n";
            fwrite(tmp, sizeof(char), strlen(tmp), json_file);
        }
        ++json_image_id;
        json_buf = detection_to_json(dets, nboxes, l.classes, names, json_image_id, input);

        fwrite(json_buf, sizeof(char), strlen(json_buf), json_file);
        free(json_buf);
    }

    // pseudo labeling concept - fast.ai
    if (save_labels)
    {
        char labelpath[4096];
        replace_image_to_label(input, labelpath);

        FILE* fw = fopen(labelpath, "wb");
        int i;
        for (i = 0; i < nboxes; ++i) {
            char buff[1024];
            int class_id = -1;
            float prob = 0;
            for (j = 0; j < l.classes; ++j) {
                if (dets[i].prob[j] > thresh && dets[i].prob[j] > prob) {
                    prob = dets[i].prob[j];
                    class_id = j;
                }
            }
            if (class_id >= 0) {
                sprintf(buff, "%d %2.4f %2.4f %2.4f %2.4f\n", class_id, dets[i].bbox.x, dets[i].bbox.y, dets[i].bbox.w, dets[i].bbox.h);
                fwrite(buff, sizeof(char), strlen(buff), fw);
            }
        }
        fclose(fw);
    }
    

    free_detections(dets, nboxes);
    free_image(im);
    free_image(sized);

    if (dont_show) {
        wait_until_press_key_cv();
        destroy_all_windows_cv();
    }

    if (filename) break;

    
    }
    sleep(1);
    printf("outside the loop");
    char newname[100];
   removeSubstrr(str1, "./result_img/");
    sprintf(newname, "./pfiles/%s",str1);
    //remove(input);
    printf("newname %s\n",newname);
    rename (input, newname);
    //sleep(1);
      
}

if (json_file) {
    char *tmp = "\n]";
    fwrite(tmp, sizeof(char), strlen(tmp), json_file);
    fclose(json_file);
}

// free memory
free_ptrs((void**)names, net.layers[net.n - 1].classes);
free_list_contents_kvp(options);
free_list(options);

int i;
const int nsize = 8;
for (j = 0; j < nsize; ++j) {
    for (i = 32; i < 127; ++i) {
        free_image(alphabet[j][i]);
    }
    free(alphabet[j]);
}
free(alphabet);

free_network(net);

}

当我运行以下代码时,如果文件夹不为空,它运行良好。一旦文件夹在一段时间后为空,我就会收到分段错误(核心转储)错误。如果我将“sleep(1)”放在第一个循环的末尾,代码运行良好,但每次检测需要 1 秒,这对应用程序来说很慢。

我发现如果我删除“if(filename)break;”这一行即使文件夹不为空,代码也会在循环结束时停止。

filename 始终为真,因为它通过命令行传递

0 个答案:

没有答案