我一直在尝试使用longcw's YOLOv2 version.来实现自己的CNN模型(基于Tiny Yolo),但是20个VOC数据集类别中的每一个的最终AP值要么为0,-1,要么很小。我认为这是由于以下事实:自从我更改CNN模型以来就无法使用预训练模型,或者是/datasets/voc_eval.py文件中的代码部分,其中以下代码为:
def voc_eval(detpath,
annopath,
imagesetfile,
classname,
cachedir,
ovthresh=0.5,
use_07_metric=False):
...
...
# read dets
detfile = detpath.format(classname)
with open(detfile, 'r') as f:
lines = f.readlines()
if any(lines) == 1:
...
else:
*sets recall, precision, and ap to -1*
调用函数来自数据集目录中的pascal_voc.py:
rec, prec, ap = voc_eval(
filename, annopath, imagesetfile, cls, cachedir, ovthresh=0.5,
use_07_metric=use_07_metric)
我对if any(line) == 1
语句如何与输入的参数一起使用以及为什么将其传递到else语句感到困惑,这给分类提供了负面的AP值。我相信我想避免使用else语句,但是我不确定if语句接受什么。
我尝试在没有预先训练的权重文件的情况下训练原始的yolov2程序,并且在大约158个历元之后,使用test.py文件测试对象检测结果得出了20个类的AP值的预期结果更高,范围约为0.15-0.5 。我认为更多地训练程序是减少AP负面结果数量的一种方法,但是我认为这不会解决整个yel语句与原始yolo代码相比要经过多少次的问题。
此外,我注意到的一件奇怪的事是,与使用单个GPU相比,使用并行处理时训练时的损失下降得更快。这可能是为什么我的AP结果如此之低和消极的原因吗?