2017-05-24 105 views
0

我得到Segmentation fault (core dumped)错误,当我使用下列参数调用draw_detections功能:暗网YOLO:分段故障(核心倾倒)时调用draw_detections功能

draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 20); 

这是我第一次使用Yolo,并作为其实我不知道哪个包含了libs定义了draw_detections这个函数。以下是完整的东西:

#include "network.h" 
#include "detection_layer.h" 
#include "cost_layer.h" 
#include "utils.h" 
#include "parser.h" 
#include "box.h" 
#include "demo.h" 

#ifdef OPENCV 
#include "opencv2/highgui/highgui_c.h" 
#endif 

char *voc_names[] = {"face"}; 

void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) 
{ 
    printf("looking for faces"); 
    image **alphabet = load_alphabet(); 
    network net = parse_network_cfg(cfgfile); 
    if(weightfile){ 
     load_weights(&net, weightfile); 
    } 
    detection_layer l = net.layers[net.n-1]; 
    set_batch_network(&net, 1); 
    srand(2222222); 
    clock_t time; 
    char buff[256]; 
    char *input = buff; 
    int j; 
    float nms=.4; 
    box *boxes = calloc(l.side*l.side*l.n, sizeof(box)); 
    float **probs = calloc(l.side*l.side*l.n, sizeof(float *)); 
    for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = calloc(l.classes, sizeof(float *)); 
    while(1){ 
     if(filename){ 
      strncpy(input, filename, 256); 
     } else { 
      printf("Enter Image Path: "); 
      fflush(stdout); 
      input = fgets(input, 256, stdin); 
      if(!input) return; 
      strtok(input, "\n"); 
     } 
     image im = load_image_color(input,0,0); 
     image sized = resize_image(im, net.w, net.h); 
     float *X = sized.data; 
     time=clock(); 
     network_predict(net, X); 
     printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); 
     get_detection_boxes(l, 1, 1, thresh, probs, boxes, 0); 
     if (nms) 
      do_nms_sort(boxes, probs, l.side*l.side*l.n, l.classes, nms); 
     printf("check1\n"); //this statement is reached fine 
     draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 20); 
     printf("check2\n"); //this statement is never reached 
     save_image(im, "predictions"); 
     printf("just saved the img"); 
     show_image(im, "predictions"); 

     free_image(im); 
     free_image(sized); 
#ifdef OPENCV 
     cvWaitKey(0); 
     cvDestroyAllWindows(); 
#endif 
     if (filename) break; 
    } 
} 

void run_yolo(int argc, char **argv) 
{ 
    printf("\n/nrunning Yolo...."); 
    char *prefix = find_char_arg(argc, argv, "-prefix", 0); 
    float thresh = find_float_arg(argc, argv, "-thresh", .2); 
    int cam_index = find_int_arg(argc, argv, "-c", 0); 
    int frame_skip = find_int_arg(argc, argv, "-s", 0); 
    if(argc < 4){ 
     fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]); 
     return; 
    } 

    char *cfg = argv[3]; 
    char *weights = (argc > 4) ? argv[4] : 0; 
    char *filename = (argc > 5) ? argv[5]: 0; 
    if(0==strcmp(argv[2], "test")) test_yolo(cfg, weights, filename, thresh); 

} 

,我使用下面的命令运行以下命令:

./darknet yolo test cfg/yolo-face.cfg yolo-face_final.weights data/faces.jpg 

它加载的权重,并进行预测,但是当它到达draw_predictions()崩溃。任何想法为什么?

编辑: 这里是跟踪时,我调试使用Valgrind

valgrind --leak-check=yes ./darknet yolo test cfg/yolo-face.cfg yolo-face_final.weights data/faces.jpg 
==8582== Memcheck, a memory error detector 
==8582== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==8582== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==8582== Command: ./darknet yolo test cfg/yolo-face.cfg yolo-face_final.weights data/faces.jpg 
==8582== 
running Yolo.... 
layer  filters size    input    output 
    0 Crop Layer: 448 x 448 -> 448 x 448 x 3 image 
shift: Using default '0.000000' 
    1 conv  16 3 x 3/1 448 x 448 x 3 -> 448 x 448 x 16 
    2 max   2 x 2/2 448 x 448 x 16 -> 224 x 224 x 16 
    3 conv  32 3 x 3/1 224 x 224 x 16 -> 224 x 224 x 32 
    4 max   2 x 2/2 224 x 224 x 32 -> 112 x 112 x 32 
    5 conv  64 3 x 3/1 112 x 112 x 32 -> 112 x 112 x 64 
    6 max   2 x 2/2 112 x 112 x 64 -> 56 x 56 x 64 
    7 conv 128 3 x 3/1 56 x 56 x 64 -> 56 x 56 x 128 
    8 max   2 x 2/2 56 x 56 x 128 -> 28 x 28 x 128 
    9 conv 256 3 x 3/1 28 x 28 x 128 -> 28 x 28 x 256 
    10 max   2 x 2/2 28 x 28 x 256 -> 14 x 14 x 256 
    11 conv 512 3 x 3/1 14 x 14 x 256 -> 14 x 14 x 512 
    12 max   2 x 2/2 14 x 14 x 512 ->  7 x 7 x 512 
    13 conv 1024 3 x 3/1  7 x 7 x 512 ->  7 x 7 x1024 
    14 conv 1024 3 x 3/1  7 x 7 x1024 ->  7 x 7 x1024 
    15 conv 1024 3 x 3/1  7 x 7 x1024 ->  7 x 7 x1024 
    16 connected       50176 -> 256 
    17 connected        256 -> 4096 
    18 dropout  p = 0.50    4096 -> 4096 
    19 connected       4096 -> 1331 
    20 Detection Layer 
forced: Using default '0' 
Loading weights from yolo-face_final.weights...looking for facesDone! 
data/faces.jpg: Predicted in 28.192593 seconds. 
pre check 
==8582== Invalid read of size 4 
==8582== at 0x407DA0: max_index (in /home/.../darknet/darknet) 
==8582== by 0x429492: draw_detections (in /home/.../darknet/darknet) 
==8582== by 0x456487: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== Address 0x7328f78 is 0 bytes after a block of size 8 alloc'd 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x456300: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== Invalid read of size 4 
==8582== at 0x42949B: draw_detections (in /home/.../darknet/darknet) 
==8582== by 0x456487: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== Address 0x7328fa0 is 32 bytes before a block of size 32 in arena "client" 
==8582== 
face: 6% 
face: 15% 
face: 18% 
face: 12% 
face: 5% 
face: 10% 
face: 8% 
face: 6% 
face: 21% 
face: 21% 
face: 37% 
face: 37% 
face: 23% 
face: 7% 
face: 33% 
face: 31% 
face: 20% 
face: 15% 
face: 37% 
face: 9% 
face: 36% 
face: 50% 
face: 49% 
face: 37% 
face: 5% 
face: 9% 
face: 6% 
face: 9% 
face: 19% 
face: 14% 
face: 25% 
face: 11% 
face: 6% 
face: 36% 
face: 13% 
face: 17% 
face: 8% 
face: 8% 
face: 6% 
After check 
Not compiled with OpenCV, saving to predictions.png instead 
just saved the img==8582== 
==8582== HEAP SUMMARY: 
==8582==  in use at exit: 550,317,244 bytes in 1,116 blocks 
==8582== total heap usage: 98,171 allocs, 97,055 frees, 579,801,694 bytes allocated 
==8582== 
==8582== 4 bytes in 1 blocks are definitely lost in loss record 2 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x43E34D: make_network (in /home/.../darknet/darknet) 
==8582== by 0x444ABE: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 4 bytes in 1 blocks are definitely lost in loss record 3 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x43E35F: make_network (in /home/.../darknet/darknet) 
==8582== by 0x444ABE: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 24 bytes in 1 blocks are definitely lost in loss record 4 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x4447C3: parse_net_options (in /home/.../darknet/darknet) 
==8582== by 0x444B12: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 24 bytes in 1 blocks are definitely lost in loss record 5 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x4447D5: parse_net_options (in /home/.../darknet/darknet) 
==8582== by 0x444B12: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 3,872 bytes in 1 blocks are definitely lost in loss record 7 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x4562C1: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 3,872 (1,936 direct, 1,936 indirect) bytes in 1 blocks are definitely lost in loss record 8 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x4562D1: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 5,808 bytes in 1 blocks are definitely lost in loss record 9 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x445416: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 32,856 bytes in 1 blocks are possibly lost in loss record 18 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x42DC33: load_image_stb (in /home/.../darknet/darknet) 
==8582== by 0x42DE1A: load_alphabet (in /home/.../darknet/darknet) 
==8582== by 0x456209: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 3,211,264 bytes in 1 blocks are possibly lost in loss record 21 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x434D98: make_maxpool_layer (in /home/.../darknet/darknet) 
==8582== by 0x4462BC: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 4,816,896 bytes in 1 blocks are definitely lost in loss record 23 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x445401: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 13,917,024 (192 direct, 13,916,832 indirect) bytes in 1 blocks are definitely lost in loss record 28 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x42DDB5: load_alphabet (in /home/.../darknet/darknet) 
==8582== by 0x456209: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 25,690,112 bytes in 1 blocks are possibly lost in loss record 29 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x40AB15: make_convolutional_layer (in /home/.../darknet/darknet) 
==8582== by 0x442203: parse_convolutional (in /home/.../darknet/darknet) 
==8582== by 0x4456A6: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 28,901,376 bytes in 1 blocks are definitely lost in loss record 31 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x445435: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== 473,734,108 (18,144 direct, 473,715,964 indirect) bytes in 1 blocks are definitely lost in loss record 37 of 37 
==8582== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8582== by 0x43E33B: make_network (in /home/.../darknet/darknet) 
==8582== by 0x444ABE: parse_network_cfg (in /home/.../darknet/darknet) 
==8582== by 0x456224: test_yolo (in /home/.../darknet/darknet) 
==8582== by 0x401F41: main (in /home/.../darknet/darknet) 
==8582== 
==8582== LEAK SUMMARY: 
==8582== definitely lost: 33,748,280 bytes in 11 blocks 
==8582== indirectly lost: 487,634,732 bytes in 1,102 blocks 
==8582==  possibly lost: 28,934,232 bytes in 3 blocks 
==8582== still reachable: 0 bytes in 0 blocks 
==8582==   suppressed: 0 bytes in 0 blocks 
==8582== 
==8582== For counts of detected and suppressed errors, rerun with: -v 
==8582== ERROR SUMMARY: 4573 errors from 16 contexts (suppressed: 0 from 0) 

噢,我明白,这让我有错箱边界太多预测。什么是缺少的参数,以减少相邻的盒子数量(以便我只得到适当的盒子)? enter image description here

+0

您是否尝试过使用'gdb'和'valgrind'调试它? –

+0

老实说不行,我现在试试valgrind –

+0

你是否已经启用了opencv编译yolo?你有opencv吗?它链接正确吗?哪个版本? – Miki

回答

0

也调整nms值。 nms值是non-maximum-supp的阈值

+0

我认为这应该是一个评论,而不是一个答案,因为主要问题是关于分段错误,最后一部分只是一个小的补充。 –

+0

draw_detections func是在image.h中声明的,你可以看看进一步的调试。 –