caffe-ssd绘制每个类的pr曲线
1 solver.cpp
进入到caffe-ssd/src/caffe目录下,打开solver.cpp。查看第540行,不同版本可能所在行不同
if (param_.show_per_class_result()) {
LOG(INFO) << "class" << label << ": " << APs[label];
}
以上代码含义是:读取solver.prototxt配置文件中的show_per_class_result参数,若show_per_class_result:true,则在测试的LOG日志中打印每个类别的Average precision。变量APs是一个map,labels->AP。
这里我们把代码作如下修改,我们引入了一个config控制参数——show_pr:
if (param_.show_per_class_result()) {
LOG(INFO) << "class" << label << ": " << APs[label];
if(param_.show_pr())
{
for(int i=0;i<p_r.size();i++)
{
LOG(INFO) << "p-r value: " << p_r[i]; // 打印11个点的precision p_r value(11points)
}
//write this vector to a txt file
//FILE *f = NULL;
//f = fopen("/home/bzhang/scripts/0.txt", "w");
//for(int i=0;i<p_r.size();i++)
//{
// fprintf(f, "%f\n", p_r[i]);
//}
//fclose(f);
}
}
2 caffe.proto
对应在caffe-ssd/src/caffe/proto/caffe.proto目录中需要修改,在message SolverParameter中添加
optional bool show_pr = 45 [default = false];
重新make caffe-ssd
3 solver.prototxt
最后在solver.prototxt中将变量值设置为true,即可以在测试阶段打印11point value的每一个点的precision,如下:
eval_type: "detection"
ap_version: "11point"
show_per_class_result: true
show_pr_value: true
I0803 12:11:09.125557 5295 solver.cpp:332] Iteration 50000, loss = 1.73973
I0803 12:11:09.125603 5295 solver.cpp:433] Iteration 50000, Testing net (#0)
I0803 12:11:09.155922 5295 net.cpp:693] Ignoring source layer mbox_loss
I0803 12:11:09.688741 5295 blocking_queue.cpp:50] Data layer prefetch queue empty
I0803 12:11:33.173079 5295 solver.cpp:541] class1: 0.675248
I0803 12:11:33.173399 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.173429 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.173437 5295 solver.cpp:546] p-r value: 0.300709
I0803 12:11:33.173451 5295 solver.cpp:546] p-r value: 0.635739
I0803 12:11:33.173460 5295 solver.cpp:546] p-r value: 0.757143
I0803 12:11:33.173466 5295 solver.cpp:546] p-r value: 0.863636
I0803 12:11:33.173473 5295 solver.cpp:546] p-r value: 0.931035
I0803 12:11:33.173480 5295 solver.cpp:546] p-r value: 0.979167
I0803 12:11:33.173488 5295 solver.cpp:546] p-r value: 0.979167
I0803 12:11:33.173496 5295 solver.cpp:546] p-r value: 0.981132
I0803 12:11:33.173502 5295 solver.cpp:546] p-r value: 1
I0803 12:11:33.183303 5295 solver.cpp:541] class2: 0.666951
I0803 12:11:33.183322 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.183331 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.183337 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.183344 5295 solver.cpp:546] p-r value: 0.686239
I0803 12:11:33.183351 5295 solver.cpp:546] p-r value: 0.814721
I0803 12:11:33.183359 5295 solver.cpp:546] p-r value: 0.892977
I0803 12:11:33.183367 5295 solver.cpp:546] p-r value: 0.972973
I0803 12:11:33.183373 5295 solver.cpp:546] p-r value: 0.982456
I0803 12:11:33.183380 5295 solver.cpp:546] p-r value: 0.993548
I0803 12:11:33.183388 5295 solver.cpp:546] p-r value: 0.993548
I0803 12:11:33.183396 5295 solver.cpp:546] p-r value: 1
I0803 12:11:33.194922 5295 solver.cpp:541] class3: 0.581691
I0803 12:11:33.194939 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.194947 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.194954 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.194960 5295 solver.cpp:546] p-r value: 0.0258479
I0803 12:11:33.194967 5295 solver.cpp:546] p-r value: 0.677273
I0803 12:11:33.194975 5295 solver.cpp:546] p-r value: 0.854167
I0803 12:11:33.194981 5295 solver.cpp:546] p-r value: 0.910714
I0803 12:11:33.194988 5295 solver.cpp:546] p-r value: 0.948454
I0803 12:11:33.194994 5295 solver.cpp:546] p-r value: 0.982143
I0803 12:11:33.195001 5295 solver.cpp:546] p-r value: 1
I0803 12:11:33.195008 5295 solver.cpp:546] p-r value: 1
I0803 12:11:33.197314 5295 solver.cpp:541] class4: 0.694746
I0803 12:11:33.197352 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.197368 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.197376 5295 solver.cpp:546] p-r value: 0.476548
I0803 12:11:33.197386 5295 solver.cpp:546] p-r value: 0.692547
I0803 12:11:33.197392 5295 solver.cpp:546] p-r value: 0.797521
I0803 12:11:33.197401 5295 solver.cpp:546] p-r value: 0.861702
I0803 12:11:33.197408 5295 solver.cpp:546] p-r value: 0.916084
I0803 12:11:33.197417 5295 solver.cpp:546] p-r value: 0.93578
I0803 12:11:33.197423 5295 solver.cpp:546] p-r value: 0.962025
I0803 12:11:33.197432 5295 solver.cpp:546] p-r value: 1
I0803 12:11:33.197439 5295 solver.cpp:546] p-r value: 1
I0803 12:11:33.197823 5295 solver.cpp:541] class5: 0.727871
I0803 12:11:33.197835 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.197850 5295 solver.cpp:546] p-r value: 0
I0803 12:11:33.197857 5295 solver.cpp:546] p-r value: 0.547264
I0803 12:11:33.197865 5295 solver.cpp:546] p-r value: 0.813559
I0803 12:11:33.197873 5295 solver.cpp:546] p-r value: 0.88
I0803 12:11:33.197881 5295 solver.cpp:546] p-r value: 0.922078
I0803 12:11:33.197888 5295 solver.cpp:546] p-r value: 0.95082
I0803 12:11:33.197896 5295 solver.cpp:546] p-r value: 0.964286
I0803 12:11:33.197904 5295 solver.cpp:546] p-r value: 0.964286
I0803 12:11:33.197911 5295 solver.cpp:546] p-r value: 0.964286
I0803 12:11:33.197919 5295 solver.cpp:546] p-r value: 1
I0803 12:11:33.197928 5295 solver.cpp:563] Test net output #0: detection_eval = 0.669301
利用每一个class的每一个precision来绘制pr曲线
绘制pr曲线
这里推荐自己写一个parsing log日志的脚本,将log日志的p-r value值读出,保存到另一个文件,供绘制pr曲线代码调用。