Ошибка сегментации при запуске классификатора даркнета на Nao

Я пытаюсь запустить классификатор изображений даркнета на Nao, но происходит сбой с segfault.

С конфигурацией YOLO (./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg) даркнет работает, но попытка запустить классификатор (./darknet classifier predict cfg/imagenet1k.data cfg/extraction.cfg extraction.weights data/dog.jpg) приводит только к segfault:

$ ./darknet  classifier predict cfg/imagenet1k.data cfg/extraction.cfg extraction.weights data/dog.jpg
layer     filters    size              input                output
    0 conv     64  7 x 7 / 2   224 x 224 x   3   ->   112 x 112 x  64
    1 max          2 x 2 / 2   112 x 112 x  64   ->    56 x  56 x  64
    2 conv    192  3 x 3 / 1    56 x  56 x  64   ->    56 x  56 x 192
    3 max          2 x 2 / 2    56 x  56 x 192   ->    28 x  28 x 192
    4 conv    128  1 x 1 / 1    28 x  28 x 192   ->    28 x  28 x 128
    5 conv    256  3 x 3 / 1    28 x  28 x 128   ->    28 x  28 x 256
    6 conv    256  1 x 1 / 1    28 x  28 x 256   ->    28 x  28 x 256
    7 conv    512  3 x 3 / 1    28 x  28 x 256   ->    28 x  28 x 512
    8 max          2 x 2 / 2    28 x  28 x 512   ->    14 x  14 x 512
    9 conv    256  1 x 1 / 1    14 x  14 x 512   ->    14 x  14 x 256
   10 conv    512  3 x 3 / 1    14 x  14 x 256   ->    14 x  14 x 512
   11 conv    256  1 x 1 / 1    14 x  14 x 512   ->    14 x  14 x 256
   12 conv    512  3 x 3 / 1    14 x  14 x 256   ->    14 x  14 x 512
   13 conv    256  1 x 1 / 1    14 x  14 x 512   ->    14 x  14 x 256
   14 conv    512  3 x 3 / 1    14 x  14 x 256   ->    14 x  14 x 512
   15 conv    256  1 x 1 / 1    14 x  14 x 512   ->    14 x  14 x 256
   16 Segmentation fault (core dumped)

Дамп ядра недоступен, так как /proc/sys/kernel/core_pattern содержит только |/bin/false

Но запустив его с помощью gdb, я смог получить стек аварийного завершения:

#0  0x0806efac in make_convolutional_layer ()
#1  0x080a4919 in parse_convolutional ()
#2  0x080a6e11 in parse_network_cfg ()
#3  0x0805d7ef in predict_classifier ()
#4  0x0805e85c in run_classifier ()
#5  0x080499c0 in main ()

Я вижу, что make_convolutional_layer выделяет кучу памяти. Может ли сбой быть из-за того, что программа достигла предела памяти? Однако в режиме YOLO он строит большую сеть (с большим размером слоев), поэтому это звучит не слишком логично. Есть идеи ?


person Eino Gourdin    schedule 07.02.2018    source источник


Ответы (1)


На самом деле это вызвано нехваткой памяти, вызовом calloc, который возвращает null. (и это, кажется, всегда происходит на строке l.weights = calloc(c*n*size*size, sizeof(float)); в make_convolutional_layer, которая на 16-м слое пытается выделить 4 718 592 байта)

Таким образом, кажется, что нет решения проблемы, кроме попытки построить меньшую сеть или увеличить доступную память.

Изменить: работает самая маленькая сеть «Darknet Reference», остальные слишком тяжелы для Нао.

person Eino Gourdin    schedule 12.02.2018