MXNET框架,faster rcnn 训练正常,正确率很高,但是使用demo测试出现异常,框虚标,出现乱框,vgg16正常,resnet网络异常,PIXEL_MEANS问题

首先,使用的是mxnet框架,检测框架是faster rcnn,使用网络是resnet和vgg,项目地址是github mxnet apache里面的\incubator-mxnet-master\incubator-mxnet-master\example\rcnn\,这个项目已经在7月中旬的时候被官方修改了,这里讨论的情况是旧的项目代码。我首先使用自己的数据集,格式是Pascal Voc格式,将trainvol和图片进行替换,然后使用resnet101网络进行训练,训练的过程正常,正确率和loss都很正常,但是使用修改过的demo文件测试单张图片时出现异常,(demo文件本来是测试vgg网络的,我这里将里面的vgg改成了resnet了),异常如下图所示,

MXNET框架,faster rcnn 训练正常,正确率很高,但是使用demo测试出现异常,框虚标,出现乱框,vgg16正常,resnet网络异常,PIXEL_MEANS问题检测图片的结果是框框出现漂移,不准,只有一个或两个准的,根据训练的loss来看这是不正常的,不可能这么差的效果。

但是使用test代码进行测试时结果正常,正确率在0.8左右,但是demo测试依然不行,后来使用resnet50进行训练,结果同样不正常。但是在使用demo测试vgg16网络的时候,正常,检测准确度和训练时一样。

经过对test代码和demo代码进行一点一点调试分析,最后查到原因,这个是配置文件network.resnet.PIXEL_MEANS = np.array([0, 0, 0])中PIXEL_MEANS设置不同的原因,resnet在测试的时候使用的这个值是3个0,而vgg在测试的时候不是这个值(而是默认值:config.PIXEL_MEANS = np.array([103.939, 116.779, 123.68])),demo文件中使用的是默认PIXEL_MEANS值是针对vgg网络的,如果修改成测试resnet的,也需要将这个值修改一下。(在执行test文件进行测试时,是有个参数的:--network resnet  通过这个参数来决定使用哪个PIXEL_MEANS,从而解释了为什么使用test进行测试结果是正确的。)

总之,修改两处:

(1)、修改demo文件开头的PIXEL_MEANS的值,这里需要先引出network这个变量,如图1第一行所示,然后给PIXEL_MEANS赋值为network.resnet.PIXEL_MEANS

(2)、修改config中的PIXEL_MEANS值,这里不用我们手动去修改config文件,以防使用vgg又麻烦的要改回来,这里使用一个函数,在执行的时候通过加入参数--network resnet来进行调用修改,我们知道,在执行test时参数输入中有这个--network resnet网络的参数,对应的有个函数,如图2中的那三行,将其放到demo文件的参数输入那里即可。测试命令也就是:python demo-resnet.py --prefix model/e2e --epoch 10 --image demo.jpg --gpu 0 --network resnet 

(3)测试用的demo-resnet文件我已上传,大家可以直接下载,修改里面的类别即可使用,

https://download.****.net/download/wang_ys121/10602581,别忘在运行时加上--network resnet这个参数。

MXNET框架,faster rcnn 训练正常,正确率很高,但是使用demo测试出现异常,框虚标,出现乱框,vgg16正常,resnet网络异常,PIXEL_MEANS问题

MXNET框架,faster rcnn 训练正常,正确率很高,但是使用demo测试出现异常,框虚标,出现乱框,vgg16正常,resnet网络异常,PIXEL_MEANS问题