使用来自 pjreddie 的 YOLOv3 时出现分段错误(核心已转储)
Segmentation fault (core dumped) when using YOLOv3 from pjreddie
我想用YOLOv3算法进行检测。我正在使用安装了 Linux 的英特尔 DE10 Nano FPGA 开发板。当我构建 YOLOv3(来自原始来源)并 运行 它时,我收到错误“Segmentation fault (core dumped)”。我做了很多研究,但 none 帮助解决了这个问题。
我使用了预建的权重和配置文件,即我运行下面的命令
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
但出现了 above.But 所述的错误,同样的事情在我的计算机和其他几台计算机上运行时没有任何问题,但在我的开发板上却没有。
然后我开始调试(使用大量printf语句)“python”目录中“darknet.py”的代码,发现错误在于
"yolo_layer.c" file
line.no.336-> "dets[count].prob[j] = (prob > thresh) ? prob : 0;"
in "get_yolo_detections" function.
我该如何解决这个问题?我已经按照函数到函数和文件到文件来查看错误的来源。
int get_yolo_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, int relative, detection *dets)
{
int i,j,n;
float *predictions = l.output;
if (l.batch == 2) avg_flipped_yolo(l);
int count = 0;
for (i = 0; i < l.w*l.h; ++i){
int row = i / l.w;
int col = i % l.w;
for(n = 0; n < l.n; ++n){
int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4);
float objectness = predictions[obj_index];
if(objectness <= thresh) continue;
int box_index = entry_index(l, 0, n*l.w*l.h + i, 0);
dets[count].bbox = get_yolo_box(predictions, l.biases, l.mask[n], box_index, col, row, l.w, l.h, netw, neth, l.w*l.h);
dets[count].objectness = objectness;
dets[count].classes = l.classes;
for(j = 0; j < l.classes; ++j){
int class_index = entry_index(l, 0, n*l.w*l.h + i, 4 + 1 + j);
float prob = objectness*predictions[class_index];
//|||||||error in below line||||||||
dets[count].prob[j] = (prob > thresh) ? prob : 0;
//^^--error in the above line(got from debugging)
}
++count;
}
}
correct_yolo_boxes(dets, count, w, h, netw, neth, relative);
return count;
}
终于找到问题和解决方法了。
加载权重时,问题出在 "src/parser.c" 文件中。从“.weights”文件加载权重的函数依赖于底层机器架构(32 位或 64 位)。训练时创建的 .weights 文件以 64 位大小编写,因为训练是在 64 位机器上完成的,因为像 jetson、raspberry pi、de10 Nano 等设备具有 32 位架构,它们从权重文件加载 32 位格式的权重。
因此存在兼容性问题(THE WEIGHTS ARE NOT CROSS PLATFORM)。
要解决此问题,请更改
fwrite(net->seen, sizeof(size_t), 1, fp);// in save_weights_upto() function
至(第 1024 行 - )
fwrite(net->seen, 8, 1, fp);
和---------------------------------------- ----------------------
fread(net->seen, sizeof(size_t), 1, fp);//in load_weights_upto() function
至(第 1237 行)
fread(net->seen, 8, 1, fp);
我想用YOLOv3算法进行检测。我正在使用安装了 Linux 的英特尔 DE10 Nano FPGA 开发板。当我构建 YOLOv3(来自原始来源)并 运行 它时,我收到错误“Segmentation fault (core dumped)”。我做了很多研究,但 none 帮助解决了这个问题。
我使用了预建的权重和配置文件,即我运行下面的命令
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
但出现了 above.But 所述的错误,同样的事情在我的计算机和其他几台计算机上运行时没有任何问题,但在我的开发板上却没有。 然后我开始调试(使用大量printf语句)“python”目录中“darknet.py”的代码,发现错误在于
"yolo_layer.c" file
line.no.336-> "dets[count].prob[j] = (prob > thresh) ? prob : 0;"
in "get_yolo_detections" function.
我该如何解决这个问题?我已经按照函数到函数和文件到文件来查看错误的来源。
int get_yolo_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, int relative, detection *dets)
{
int i,j,n;
float *predictions = l.output;
if (l.batch == 2) avg_flipped_yolo(l);
int count = 0;
for (i = 0; i < l.w*l.h; ++i){
int row = i / l.w;
int col = i % l.w;
for(n = 0; n < l.n; ++n){
int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4);
float objectness = predictions[obj_index];
if(objectness <= thresh) continue;
int box_index = entry_index(l, 0, n*l.w*l.h + i, 0);
dets[count].bbox = get_yolo_box(predictions, l.biases, l.mask[n], box_index, col, row, l.w, l.h, netw, neth, l.w*l.h);
dets[count].objectness = objectness;
dets[count].classes = l.classes;
for(j = 0; j < l.classes; ++j){
int class_index = entry_index(l, 0, n*l.w*l.h + i, 4 + 1 + j);
float prob = objectness*predictions[class_index];
//|||||||error in below line||||||||
dets[count].prob[j] = (prob > thresh) ? prob : 0;
//^^--error in the above line(got from debugging)
}
++count;
}
}
correct_yolo_boxes(dets, count, w, h, netw, neth, relative);
return count;
}
终于找到问题和解决方法了。 加载权重时,问题出在 "src/parser.c" 文件中。从“.weights”文件加载权重的函数依赖于底层机器架构(32 位或 64 位)。训练时创建的 .weights 文件以 64 位大小编写,因为训练是在 64 位机器上完成的,因为像 jetson、raspberry pi、de10 Nano 等设备具有 32 位架构,它们从权重文件加载 32 位格式的权重。
因此存在兼容性问题(THE WEIGHTS ARE NOT CROSS PLATFORM)。
要解决此问题,请更改
fwrite(net->seen, sizeof(size_t), 1, fp);// in save_weights_upto() function
至(第 1024 行 - )
fwrite(net->seen, 8, 1, fp);
和---------------------------------------- ----------------------
fread(net->seen, sizeof(size_t), 1, fp);//in load_weights_upto() function
至(第 1237 行)
fread(net->seen, 8, 1, fp);