腾讯开源ncnn:自己的模型运行结果与caffe的结果不一样

来源:互联网 发布:分水岭算法的原理 编辑:程序博客网 时间:2024/05/22 00:13

本博记录为卤煮使用时的记录,如有疏漏,请指正。

卤煮:非文艺小燕儿

本博地址: 腾讯开源ncnn:自己的模型运行结果与caffe的结果不一样

感谢开源共享的各位大牛们,让我们能够站在巨人的肩膀上前行。


自己之前用caffe和tinyDNN框架跑得模型,这次用腾讯开源的ncnn的跑了一下,最后一层的输出结果却很不一样,大概是0.x和几十的差距。

纠结半天发现是输出图像归一化的问题。


ncnn给的示例,图像做了去均值,所用的均值是

const float mean_vals[3] = { 104.f, 117.f, 123.f };

用下面这句实现了去均值操作

in.substract_mean_normalize(mean_vals, 0);


以下操作要根据你自己模型的图像预处理策略进行对应,下面的处理方法只是对应了我自己的。数据预处理到-1到1之间。

而对于我的模型来说,应该使用的均值文件为:

const float mean_vals[3] = { 127.5f, 127.5f, 127.5f };

同时还要把数据归一化到-1~1之间。


目前还没有详细看ncnn的代码,可能也支持归一化到-1到1之间。

目前先自己在他的in.substract_mean_normalize(mean_vals, 0);中先针对缩放修改了一点儿。

减完均值后,追加了一句

*ptr = (*ptr)* 0.0078125;

效果如下:

for (; remain>0; remain--){     *ptr -= mean;     *ptr = (*ptr)* 0.0078125;     ptr++;            }


这样运行出来的结果就对了。


总而言之,还是因为没有去好好看ncnn的代码,不明所以的去仿照示例引起的问题。

接下来好好看看,不再重蹈覆辙。


追加:

经过nihui大神指点,正途应该是这么改

const float mean_vals[3] = { 127.5f, 127.5f, 127.5f };
const float norm_vals[3] = { 0.0078125f, 0.0078125f, 0.0078125f };
in.substract_mean_normalize(mean_vals, norm_vals);


参考:

https://github.com/Tencent/ncnn/issues/50


阅读全文
1 0