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

mxnet model 问题 #663

Closed
ancheel opened this issue Nov 21, 2018 · 12 comments
Closed

mxnet model 问题 #663

ancheel opened this issue Nov 21, 2018 · 12 comments

Comments

@ancheel
Copy link

ancheel commented Nov 21, 2018

使用此 mxnet 的实现 https://github.com/deepinsight/insightface/blob/master/gender-age/face_model.py

mxnet 的代码


def get_input(self, face_img):
    ret = self.detector.detect_face(face_img, det_type = self.args.det)
    if ret is None:
      return None
    bbox, points = ret
    if bbox.shape[0]==0:
      return None
    bbox = bbox[0,0:4]
    points = points[0,:].reshape((2,5)).T
    #print(bbox)
    #print(points)
    nimg = face_preprocess.preprocess(face_img, bbox, points, image_size='112,112')
    nimg = cv2.cvtColor(nimg, cv2.COLOR_BGR2RGB)
    aligned = np.transpose(nimg, (2,0,1))
    input_blob = np.expand_dims(aligned, axis=0)
    data = mx.nd.array(input_blob)
    db = mx.io.DataBatch(data=(data,))
    return db


  def get_ga(self, data):
    self.model.forward(data, is_train=False)
    ret = self.model.get_outputs()[0].asnumpy()
    g = ret[:,0:2].flatten()
    gender = np.argmax(g)
    a = ret[:,2:202].reshape( (100,2) )
    a = np.argmax(a, axis=1)
    age = int(sum(a))

    return gender, age

model = face_model.FaceModel(args)
img = cv2.imread(args.image)
img = model.get_input(img)
gender, age = model.get_ga(img)

ncnn 的代码

// face 已经参考 python 的  face_preprocess.preprocess 做了align处理
ncnn::Mat in = resize(face, 112, 112);
in = bgr2rgb(in);

ncnn::Extractor ex = net.create_extractor();
ex.set_light_mode(true);
ex.input("data", in);
ncnn::Mat out;
ex.extract("fc1", out);

但是无论输入任何图片,得到的结果(out)都是一样的。

转换成ncnn模型后的网络结构

7767517
90 90
Input            data                             0 1 data
BinaryOp         _minusscalar0                    1 1 data _minusscalar0 0=1 1=1 2=127.500000
BinaryOp         _mulscalar0                      1 1 _minusscalar0 _mulscalar0 0=2 1=1 2=0.007812
Convolution      conv_1_conv2d                    1 1 _mulscalar0 conv_1_conv2d 0=8 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=216
BatchNorm        conv_1_batchnorm                 1 1 conv_1_conv2d conv_1_batchnorm 0=8
ReLU             conv_1_relu                      1 1 conv_1_batchnorm conv_1_relu
ConvolutionDepthWise conv_2_dw_conv2d                 1 1 conv_1_relu conv_2_dw_conv2d 0=8 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=72 7=8
BatchNorm        conv_2_dw_batchnorm              1 1 conv_2_dw_conv2d conv_2_dw_batchnorm 0=8
ReLU             conv_2_dw_relu                   1 1 conv_2_dw_batchnorm conv_2_dw_relu
Convolution      conv_2_conv2d                    1 1 conv_2_dw_relu conv_2_conv2d 0=16 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=128
BatchNorm        conv_2_batchnorm                 1 1 conv_2_conv2d conv_2_batchnorm 0=16
ReLU             conv_2_relu                      1 1 conv_2_batchnorm conv_2_relu
ConvolutionDepthWise conv_3_dw_conv2d                 1 1 conv_2_relu conv_3_dw_conv2d 0=16 1=3 11=3 3=2 13=2 4=1 14=1 5=0 6=144 7=16
BatchNorm        conv_3_dw_batchnorm              1 1 conv_3_dw_conv2d conv_3_dw_batchnorm 0=16
ReLU             conv_3_dw_relu                   1 1 conv_3_dw_batchnorm conv_3_dw_relu
Convolution      conv_3_conv2d                    1 1 conv_3_dw_relu conv_3_conv2d 0=32 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=512
BatchNorm        conv_3_batchnorm                 1 1 conv_3_conv2d conv_3_batchnorm 0=32
ReLU             conv_3_relu                      1 1 conv_3_batchnorm conv_3_relu
ConvolutionDepthWise conv_4_dw_conv2d                 1 1 conv_3_relu conv_4_dw_conv2d 0=32 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=288 7=32
BatchNorm        conv_4_dw_batchnorm              1 1 conv_4_dw_conv2d conv_4_dw_batchnorm 0=32
ReLU             conv_4_dw_relu                   1 1 conv_4_dw_batchnorm conv_4_dw_relu
Convolution      conv_4_conv2d                    1 1 conv_4_dw_relu conv_4_conv2d 0=32 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=1024
BatchNorm        conv_4_batchnorm                 1 1 conv_4_conv2d conv_4_batchnorm 0=32
ReLU             conv_4_relu                      1 1 conv_4_batchnorm conv_4_relu
ConvolutionDepthWise conv_5_dw_conv2d                 1 1 conv_4_relu conv_5_dw_conv2d 0=32 1=3 11=3 3=2 13=2 4=1 14=1 5=0 6=288 7=32
BatchNorm        conv_5_dw_batchnorm              1 1 conv_5_dw_conv2d conv_5_dw_batchnorm 0=32
ReLU             conv_5_dw_relu                   1 1 conv_5_dw_batchnorm conv_5_dw_relu
Convolution      conv_5_conv2d                    1 1 conv_5_dw_relu conv_5_conv2d 0=64 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=2048
BatchNorm        conv_5_batchnorm                 1 1 conv_5_conv2d conv_5_batchnorm 0=64
ReLU             conv_5_relu                      1 1 conv_5_batchnorm conv_5_relu
ConvolutionDepthWise conv_6_dw_conv2d                 1 1 conv_5_relu conv_6_dw_conv2d 0=64 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=576 7=64
BatchNorm        conv_6_dw_batchnorm              1 1 conv_6_dw_conv2d conv_6_dw_batchnorm 0=64
ReLU             conv_6_dw_relu                   1 1 conv_6_dw_batchnorm conv_6_dw_relu
Convolution      conv_6_conv2d                    1 1 conv_6_dw_relu conv_6_conv2d 0=64 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=4096
BatchNorm        conv_6_batchnorm                 1 1 conv_6_conv2d conv_6_batchnorm 0=64
ReLU             conv_6_relu                      1 1 conv_6_batchnorm conv_6_relu
ConvolutionDepthWise conv_7_dw_conv2d                 1 1 conv_6_relu conv_7_dw_conv2d 0=64 1=3 11=3 3=2 13=2 4=1 14=1 5=0 6=576 7=64
BatchNorm        conv_7_dw_batchnorm              1 1 conv_7_dw_conv2d conv_7_dw_batchnorm 0=64
ReLU             conv_7_dw_relu                   1 1 conv_7_dw_batchnorm conv_7_dw_relu
Convolution      conv_7_conv2d                    1 1 conv_7_dw_relu conv_7_conv2d 0=128 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=8192
BatchNorm        conv_7_batchnorm                 1 1 conv_7_conv2d conv_7_batchnorm 0=128
ReLU             conv_7_relu                      1 1 conv_7_batchnorm conv_7_relu
ConvolutionDepthWise conv_8_dw_conv2d                 1 1 conv_7_relu conv_8_dw_conv2d 0=128 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=1152 7=128
BatchNorm        conv_8_dw_batchnorm              1 1 conv_8_dw_conv2d conv_8_dw_batchnorm 0=128
ReLU             conv_8_dw_relu                   1 1 conv_8_dw_batchnorm conv_8_dw_relu
Convolution      conv_8_conv2d                    1 1 conv_8_dw_relu conv_8_conv2d 0=128 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=16384
BatchNorm        conv_8_batchnorm                 1 1 conv_8_conv2d conv_8_batchnorm 0=128
ReLU             conv_8_relu                      1 1 conv_8_batchnorm conv_8_relu
ConvolutionDepthWise conv_9_dw_conv2d                 1 1 conv_8_relu conv_9_dw_conv2d 0=128 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=1152 7=128
BatchNorm        conv_9_dw_batchnorm              1 1 conv_9_dw_conv2d conv_9_dw_batchnorm 0=128
ReLU             conv_9_dw_relu                   1 1 conv_9_dw_batchnorm conv_9_dw_relu
Convolution      conv_9_conv2d                    1 1 conv_9_dw_relu conv_9_conv2d 0=128 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=16384
BatchNorm        conv_9_batchnorm                 1 1 conv_9_conv2d conv_9_batchnorm 0=128
ReLU             conv_9_relu                      1 1 conv_9_batchnorm conv_9_relu
ConvolutionDepthWise conv_10_dw_conv2d                1 1 conv_9_relu conv_10_dw_conv2d 0=128 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=1152 7=128
BatchNorm        conv_10_dw_batchnorm             1 1 conv_10_dw_conv2d conv_10_dw_batchnorm 0=128
ReLU             conv_10_dw_relu                  1 1 conv_10_dw_batchnorm conv_10_dw_relu
Convolution      conv_10_conv2d                   1 1 conv_10_dw_relu conv_10_conv2d 0=128 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=16384
BatchNorm        conv_10_batchnorm                1 1 conv_10_conv2d conv_10_batchnorm 0=128
ReLU             conv_10_relu                     1 1 conv_10_batchnorm conv_10_relu
ConvolutionDepthWise conv_11_dw_conv2d                1 1 conv_10_relu conv_11_dw_conv2d 0=128 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=1152 7=128
BatchNorm        conv_11_dw_batchnorm             1 1 conv_11_dw_conv2d conv_11_dw_batchnorm 0=128
ReLU             conv_11_dw_relu                  1 1 conv_11_dw_batchnorm conv_11_dw_relu
Convolution      conv_11_conv2d                   1 1 conv_11_dw_relu conv_11_conv2d 0=128 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=16384
BatchNorm        conv_11_batchnorm                1 1 conv_11_conv2d conv_11_batchnorm 0=128
ReLU             conv_11_relu                     1 1 conv_11_batchnorm conv_11_relu
ConvolutionDepthWise conv_12_dw_conv2d                1 1 conv_11_relu conv_12_dw_conv2d 0=128 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=1152 7=128
BatchNorm        conv_12_dw_batchnorm             1 1 conv_12_dw_conv2d conv_12_dw_batchnorm 0=128
ReLU             conv_12_dw_relu                  1 1 conv_12_dw_batchnorm conv_12_dw_relu
Convolution      conv_12_conv2d                   1 1 conv_12_dw_relu conv_12_conv2d 0=128 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=16384
BatchNorm        conv_12_batchnorm                1 1 conv_12_conv2d conv_12_batchnorm 0=128
ReLU             conv_12_relu                     1 1 conv_12_batchnorm conv_12_relu
ConvolutionDepthWise conv_13_dw_conv2d                1 1 conv_12_relu conv_13_dw_conv2d 0=128 1=3 11=3 3=2 13=2 4=1 14=1 5=0 6=1152 7=128
BatchNorm        conv_13_dw_batchnorm             1 1 conv_13_dw_conv2d conv_13_dw_batchnorm 0=128
ReLU             conv_13_dw_relu                  1 1 conv_13_dw_batchnorm conv_13_dw_relu
Convolution      conv_13_conv2d                   1 1 conv_13_dw_relu conv_13_conv2d 0=256 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=32768
BatchNorm        conv_13_batchnorm                1 1 conv_13_conv2d conv_13_batchnorm 0=256
ReLU             conv_13_relu                     1 1 conv_13_batchnorm conv_13_relu
ConvolutionDepthWise conv_14_dw_conv2d                1 1 conv_13_relu conv_14_dw_conv2d 0=256 1=3 11=3 3=1 13=1 4=1 14=1 5=0 6=2304 7=256
BatchNorm        conv_14_dw_batchnorm             1 1 conv_14_dw_conv2d conv_14_dw_batchnorm 0=256
ReLU             conv_14_dw_relu                  1 1 conv_14_dw_batchnorm conv_14_dw_relu
Convolution      conv_14_conv2d                   1 1 conv_14_dw_relu conv_14_conv2d 0=256 1=1 11=1 3=1 13=1 4=0 14=0 5=0 6=65536
BatchNorm        conv_14_batchnorm                1 1 conv_14_conv2d conv_14_batchnorm 0=256
ReLU             conv_14_relu                     1 1 conv_14_batchnorm conv_14_relu
BatchNorm        bn1                              1 1 conv_14_relu bn1 0=256
PReLU            relu1                            1 1 bn1 relu1 0=256
Pooling          pool1                            1 1 relu1 pool1 0=1 1=7 4=1 5=1
Flatten          flatten0                         1 1 pool1 flatten0
InnerProduct     pre_fc1                          1 1 flatten0 pre_fc1 0=202 1=1 2=51712
BatchNorm        fc1                              1 1 pre_fc1 fc1 0=202
@wwmoo7
Copy link

wwmoo7 commented Nov 21, 2018

我也是一样的问题,求解答,另外输入不同的图片输出的数据还是稍微有点区别的并不是完全一样,
http://vsooda.github.io/2017/12/17/mxnet-to-ncnn/
,可以参考一下这篇文章,我也还在研究,是不是和aligned = np.transpose(nimg, (2,0,1))
input_blob = np.expand_dims(aligned, axis=0)
data = mx.nd.array(input_blob)
db = mx.io.DataBatch(data=(data,))这段有关系

@ancheel
Copy link
Author

ancheel commented Nov 21, 2018

我也是一样的问题,求解答,另外输入不同的图片输出的数据还是稍微有点区别的并不是完全一样,
http://vsooda.github.io/2017/12/17/mxnet-to-ncnn/
,可以参考一下这篇文章,我也还在研究,是不是和aligned = np.transpose(nimg, (2,0,1))
input_blob = np.expand_dims(aligned, axis=0)
data = mx.nd.array(input_blob)
db = mx.io.DataBatch(data=(data,))这段有关系

通过查看各层输出,发现是从pooling层开始出现问题的:从pooling层开始,输入不同图片,结果差异就很小了。

晚些时候,我逐层对比下mxnet和ncnn的输出


时间紧,暂时放弃了,换ssr-net。

@sunjunlishi
Copy link

我也遇到同样的问题,怎么调用啊。转换模型的时候没有任何错误

@sunjunlishi
Copy link

sunjunlishi commented Dec 12, 2018

@ancheel 怎么解决啊。这个貌似也是性别年龄的模型啊。咱们两个一模一样的问题

@sunjunlishi
Copy link

mxnet.zip
年龄性别,输入 112,112 RGB

@nihui
Copy link
Member

nihui commented Dec 12, 2018

mxnet batchnorm gamma 参数转换有问题,git master 已经修复
ed2a24c

@nihui nihui closed this as completed Dec 12, 2018
@sunjunlishi
Copy link

是的已经完美解决

@ancheel
Copy link
Author

ancheel commented Dec 13, 2018

Thanks!

@Linxincode
Copy link

@sunjunlishi 你好,想问下你是怎么解决的?我这边转过之后,输出和mxnet的输出还是不一样

@sunjunlishi
Copy link

@Linxincode 你把mxnet align后的 图片(可以保存为bmp格式)让 ncnn处理,保证输入一样;
输出就一样

@wwmoo7
Copy link

wwmoo7 commented Dec 20, 2018

电脑端和手机端的数据还是米有完全一样,但是基本一样,应该不影响判断

@zys1994
Copy link

zys1994 commented May 23, 2019

@sunjunlishi @ancheel 可以分享一下你的ncnn预处理的code给我吗?我的邮箱是[email protected]
或者帮忙分析看看我出的问题,我的性别和年龄都不太对。
我处理的代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "platform.h"
#include "net.h"
#include "mat.h"


int main() {
    ncnn::Net net;
    net.load_param("../model/genderAge.param");
    net.load_model("../model/genderAge.bin");


    cv::Mat img = cv::imread("../test_img/Aiysha_Smith_0001.jpg");


    cv::cvtColor(img, img, CV_BGR2RGB);  //mxnet支持的也是rgb
    unsigned char *rgbdata = img.data;
    ncnn::Mat in = ncnn::Mat::from_pixels(rgbdata, ncnn::Mat::PIXEL_RGB, 112, 112);

    
    ncnn::Mat out;

    ncnn::Extractor ex = net.create_extractor();
    ex.set_light_mode(true);
    ex.input("data", in);


    double t_start = cv::getTickCount();
    ex.extract("fc1", out);
    double t_end = cv::getTickCount();
    float costTime = (t_end - t_start) / cv::getTickFrequency();
    std::cout << "cost Time :" << costTime << std::endl;

    std::cout << "Hello, World!" << std::endl;
    std::vector<float> scores;
    scores.resize(out.w);
    for (int j=0; j<out.w; j++)
    {
        scores[j] = out[j];
        std::cout<<out[j]<<std::endl;
    }
    bool male_ =out[0]>out[1]? true:false;
    int age=0;
    for (int j=1; j<101; j++)
    {
        age+=(out[2*j]>out[2*j+2]? 0:1);
    }
    return 0;
}


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

6 participants