Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

测试MTCNN结果完全不一样 #52

Closed
ElegantGod opened this issue Jul 27, 2017 · 31 comments
Closed

测试MTCNN结果完全不一样 #52

ElegantGod opened this issue Jul 27, 2017 · 31 comments

Comments

@ElegantGod
Copy link

跑了下MTCNN的PNet和RNet结果与标准结果相差很大,拿一张人脸给RNet的得分也很低

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

int hs = ceil(img_hscales[i]);
int ws = ceil(img_w
scales[i]);
ncnn::Mat pnet_img = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, img_w, img_h, ws, hs);
pnet_img.substract_mean_normalize(mean_vals,norm_vals);
ncnn::Extractor Pnet_ex = Pnet.create_extractor();
Pnet_ex.set_light_mode(true);
Pnet_ex.input("data", pnet_img);
ncnn::Mat score, loc;
Pnet_ex.extract("prob1", score);
Pnet_ex.extract("conv4-2", loc);

if(*(score_data+i)>=thresh)。。。

@ElegantGod
Copy link
Author

score_data = score.data+score.cstep

@nihui
Copy link
Member

nihui commented Jul 27, 2017

col-major 的模型?
#50

@wasd96040501
Copy link

我也遇到了类似的问题。
我比较了普通的caffe每层的输出和ncnn每层的输出。
结果发现他们的结果差距越来越大。
在第一层差距还不是很明显,但是到了最后一层,数值差距可能在e-2以上。
请问这个问题怎么解决?

@ElegantGod
Copy link
Author

确实是col-major 的模型
@nihui ,如果有ncnn::Mat 取roi的函数就好了,简化版的opencv不好用啊,读入图片格式也很受限

@nihui
Copy link
Member

nihui commented Jul 27, 2017

copy_cut_border ?

@nihui
Copy link
Member

nihui commented Jul 27, 2017

ncnn 的转换器是读 row-major 的模型,col-major 需要把 weights transpose 下才行,转换器工具还不支持,暂时得手工转...
简化版opencv是实在要缩减安装包才会用,而且功能也不完整,所以默认禁用的

@ElegantGod
Copy link
Author

@nihui 多谢倪神!
@wasd96040501 我暂时还还没遇到你这问题,感觉像是压缩模型导致的精度问题?e-2

@ElegantGod
Copy link
Author

手工改了下MTCNN caffemodel转row-major,
https://github.com/ElegantGod/ncnn/blob/master/tools/caffe2ncnn_mtcnn.cpp

@kismde
Copy link

kismde commented Aug 10, 2017

@ElegantGod ,大神有没有实现MTCNNv2?我试了你的MTCNNv1的代码,效果不错,给你点赞!但是,我在你的代码基础上,加上LNet后,预测的5个特征点的位置更不准确了。向大神求助。
ps:之前版本的ncnn在转换slice层时存在问题,作者已修改,修改代码

@ElegantGod
Copy link
Author

@wangkgege 我没试过v2版本,不过应该还是没有转成row-major模型的问题吧

@kismde
Copy link

kismde commented Aug 10, 2017

@ElegantGod ,应该是这个问题。但是不知该如何转成row-major模型?无从下手,能否指导一下?

@ElegantGod
Copy link
Author

@wangkgege 在caffe2ncnn.cpp里,要把caffemodel读出来并保持到bin文件中,对卷积核和全连接权重转置,如3x3卷积核[[1,2,3],[4,5,6],[7,8,9]],保存成[[1,4,7],[2,5,8],[3,6,9]],我用的比较笨的手工方法0.0,周末改一下

@kismde
Copy link

kismde commented Aug 10, 2017

@ElegantGod ,我对比了你写的caffe2ncnn_mtcnn.cpp跟caffe2ncnn.cpp,的确是这两处的权重修改了。学习了。给你大大的赞!!

@guozhongluo
Copy link

mtcnn caffe 版本与 ncnn 版本运行结果有一些差别。输入保证一致的情况下,输出有轻微差别。是caffe模型转换成ncnn 模型有差异,还是前馈网络计算有差异。你们感觉到没?

@ElegantGod
Copy link
Author

@guozhongluo 有差异,有可能是resize和opencv的resize不一样导致的

@jasminezz
Copy link

@ElegantGod 我使用的是你转换后的网络模型,用的是opencv的resize,但感觉和caffe的输出差异很大,而且模型每次的输出也会有些许差别,最后出现人脸框抖动,预测不准的问题,请问这有可能是什么原因呢?

@ElegantGod
Copy link
Author

@jasminezz 我猜不到是什么原因,你可以用我的mtcnn.cpp,和caffe输出一致

@jasminezz
Copy link

@ElegantGod 我修改了threshold和nms的阈值,稳定了许多。模型的输出和resize的scale关系很大,将数值类型从double替换为float就好了

@VivienFu
Copy link

@ElegantGod 你在arm上跑了没?我再PC上跑结果正常,拿到arm上,输出就不对了,改了改ceil和round相关的部分,arm上Pnet的输出结果对了,Rnet的输入也是正常,只是Rnet的输出prob都是0.5。。。

@zhenglaizhang
Copy link

@ElegantGod 请教下大神一个问题,我下载了你的ncnn repo,mtcnn.cpp对着opencv3.3 最后编译通过,运行发现ex.extract("prob1", score_);报错core dump,是另外还有步骤要做么?谢谢你!!
!!

@ElegantGod
Copy link
Author

@zhenglaizhang 跟opencv应该没关系,在mtcnn目录下../build/mtcnn/mtcnn 1.jpg,你可能是没有加载模型

@zhenglaizhang
Copy link

@ElegantGod 谢谢回复,模型我应该加载成功了, 应该是在预测的时候出错了:

➜  mtcnn git:(master) ✗ ../build/mtcnn/mtcnn ../result0.jpg
[1]    4451 segmentation fault (core dumped)  ../build/mtcnn/mtcnn ../result0.jpg
➜  mtcnn git:(master) ✗ echo $?
139

另外,请教你,你的repo里面代码拉下来就可以直接build么?我遇到一个错误:

/home/zhenglai/repo/ncnn/mtcnn/mtcnn.cpp:228:25: error: ‘tempIm’ was not declared in this scope
         resize_bilinear(tempIm, in, ws, hs);

我在上方加了一个声明ncnn::Mat tempIm;

编译步骤:

mkdir build && cd build
cmake .. && make -j

@zhenglaizhang
Copy link

zhenglaizhang commented Sep 5, 2017

@ElegantGod 啊呀,我知道原因了,现在有时间看了下代码,应该这样改,谢谢你哈,可以pc上面跑起来了:

-        resize_bilinear(tempIm, in, ws, hs);
+        resize_bilinear(img, in, ws, hs);

@zhenglaizhang
Copy link

@ElegantGod 大神,还有个问题请教下,似乎检测出来的bbox人脸矩形宽度比人脸宽一些,会带上一些背景?

@ElegantGod
Copy link
Author

@zhenglaizhang 我不是大神哦,菜鸟一个,这个输出的是正方形框,和官方有点不一样

@zhenglaizhang
Copy link

zhenglaizhang commented Sep 6, 2017

@ElegantGod 第三次box regression的时候可以去掉square,这样看起来更准确了?试了下,另外mtcnn ncnn在安卓上面跑效果很不错,感谢!!

@jjjjohnson
Copy link

@zhenglaizhang 大神 请教一下mtcnn ncnn在安卓上面跑的代码可以分享一下吗? 或者具体开发步骤 万分感激!

@jjjjohnson
Copy link

谢谢大家 我已经用JNI 把MTCNN编译出来了 效果还不不错 4线程下780x1040的图片手机上大约耗时150 ms

@linsonwang
Copy link

我发现这个版本的检测结果和标准CAFFE的不一样,我有一张图片,这个版本的就检测不出来出来,标准的CAFFE就可以,最小图片都是24,参数也基本是一致的

@creatist
Copy link

我也遇到了类似的问题。
我比较了普通的caffe每层的输出和ncnn每层的输出。
结果发现他们的结果差距越来越大。
在第一层差距还不是很明显,但是到了最后一层,数值差距可能在e-2以上。
请问这个问题怎么解决?

我也遇到类似的问题,请问这个问题你解决了吗?

@wasd96040501
Copy link

wasd96040501 commented Dec 18, 2018

我也遇到了类似的问题。
我比较了普通的caffe每层的输出和ncnn每层的输出。
结果发现他们的结果差距越来越大。
在第一层差距还不是很明显,但是到了最后一层,数值差距可能在e-2以上。
请问这个问题怎么解决?

我也遇到类似的问题,请问这个问题你解决了吗?

@creatist 这个问题在当时已经解决了。当时是因为ncnn的膨胀卷积有一点小bug,但已经修复了#75。如果现在你遇到了这个问题,大概率是其他原因导致的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests