Crnn.cpp 6.02 KB
Newer Older
Your Name's avatar
Your Name committed
1
2
3
4
5
6
7
8
9
10
#include <Crnn.h>
#include <migraphx/onnx.hpp>
#include <migraphx/gpu/target.hpp>
#include <Filesystem.h>
#include <SimpleLog.h>


namespace migraphxSamples
{

liucong's avatar
liucong committed
11
Crnn::Crnn()
Your Name's avatar
Your Name committed
12
13
14
15
16
17
18
19
{

}

Crnn::~Crnn()
{

    configurationFile.release();
shizhm's avatar
shizhm committed
20

Your Name's avatar
Your Name committed
21
22
23
24
}

ErrorCode Crnn::Initialize(InitializationParameterOfOcr initializationParameterOfOcr, bool dynamic)
{
liucong's avatar
liucong committed
25
26
27
    // 读取配置文件
    std::string configFilePath=initializationParameterOfOcr.configFilePath;
    if(Exists(configFilePath)==false)
Your Name's avatar
Your Name committed
28
    {
liucong's avatar
liucong committed
29
30
        LOG_ERROR(stdout, "no configuration file!\n");
        return CONFIG_FILE_NOT_EXIST;
Your Name's avatar
Your Name committed
31
    }
liucong's avatar
liucong committed
32
33
34
35
36
37
    if(!configurationFile.open(configFilePath, cv::FileStorage::READ))
    {
       LOG_ERROR(stdout, "fail to open configuration file\n");
       return FAIL_TO_OPEN_CONFIG_FILE;
    }
    LOG_INFO(stdout, "succeed to open configuration file\n");
Your Name's avatar
Your Name committed
38
39

    // 获取配置文件参数
liucong's avatar
liucong committed
40
41
    cv::FileNode netNode = configurationFile["CrnnDynamic"];
    std::string modelPath=(std::string)netNode["ModelPath"];
Your Name's avatar
Your Name committed
42
43
44
45

    // 加载模型
    if(Exists(modelPath)==false)
    {
liucong's avatar
liucong committed
46
        LOG_ERROR(stdout,"%s not exist!\n",modelPath.c_str());
Your Name's avatar
Your Name committed
47
48
49
50
        return MODEL_NOT_EXIST;
    }

    if(dynamic)
shizhm's avatar
shizhm committed
51
    {
Your Name's avatar
Your Name committed
52
53
54
        migraphx::onnx_options onnx_options;
        onnx_options.map_input_dims["input"]={1,1,32,512};

shizhm's avatar
shizhm committed
55
        net = migraphx::parse_onnx(modelPath, onnx_options);
liucong's avatar
liucong committed
56
        LOG_INFO(stdout,"succeed to load model: %s\n",GetFileName(modelPath).c_str());
Your Name's avatar
Your Name committed
57
58

        // 获取模型输入属性
liucong's avatar
liucong committed
59
60
61
62
63
64
65
66
        std::unordered_map<std::string, migraphx::shape> inputMap=net.get_parameter_shapes();
        inputName=inputMap.begin()->first;
        inputShape=inputMap.begin()->second;
        int N=inputShape.lens()[0];
        int C=inputShape.lens()[1];
        int H=inputShape.lens()[2];
        int W=inputShape.lens()[3];
        inputSize=cv::Size(W,H);
Your Name's avatar
Your Name committed
67
68

        // log输出日志信息
liucong's avatar
liucong committed
69
70
        LOG_INFO(stdout,"InputMaxSize:%dx%d\n",inputSize.width,inputSize.height);
        LOG_INFO(stdout,"InputName:%s\n",inputName.c_str());
Your Name's avatar
Your Name committed
71
72
73
74
75
76
    }
    else
    {
        migraphx::onnx_options onnx_options;
        onnx_options.map_input_dims["input"]={1,1,32,100};

shizhm's avatar
shizhm committed
77
        net = migraphx::parse_onnx(modelPath, onnx_options);
liucong's avatar
liucong committed
78
        LOG_INFO(stdout,"succeed to load model: %s\n",GetFileName(modelPath).c_str());
Your Name's avatar
Your Name committed
79
80

        // 获取模型输入属性
liucong's avatar
liucong committed
81
82
83
84
85
86
87
88
        std::unordered_map<std::string, migraphx::shape> inputMap=net.get_parameter_shapes();
        inputName=inputMap.begin()->first;
        inputShape=inputMap.begin()->second;
        int N=inputShape.lens()[0];
        int C=inputShape.lens()[1];
        int H=inputShape.lens()[2];
        int W=inputShape.lens()[3];
        inputSize=cv::Size(W,H);
Your Name's avatar
Your Name committed
89
90

        // log输出日志信息
liucong's avatar
liucong committed
91
92
        LOG_INFO(stdout,"InputSize:%dx%d\n",inputSize.width,inputSize.height);
        LOG_INFO(stdout,"InputName:%s\n",inputName.c_str());
Your Name's avatar
Your Name committed
93
94
95
96
97
98
99
100
    }

    // 设置模型为GPU模式
    migraphx::target gpuTarget = migraphx::gpu::target{};

    // 编译模型
    migraphx::compile_options options;
    options.device_id=0;                          // 设置GPU设备,默认为0号设备
shizhm's avatar
shizhm committed
101
102
    options.offload_copy=true;
    net.compile(gpuTarget,options);
liucong's avatar
liucong committed
103
    LOG_INFO(stdout,"succeed to compile model: %s\n",GetFileName(modelPath).c_str());
Your Name's avatar
Your Name committed
104

liucong's avatar
liucong committed
105
106
107
    // warm up
    std::unordered_map<std::string, migraphx::argument> inputData;
    inputData[inputName]=migraphx::argument{inputShape};
shizhm's avatar
shizhm committed
108
    net.eval(inputData);
Your Name's avatar
Your Name committed
109
110
111
112
113
114
115
116

    return SUCCESS;
}

ErrorCode Crnn::Infer(const cv::Mat &srcImage, std::vector<char> &resultsChar, bool raw, bool dynamic)
{
    if(srcImage.empty() || srcImage.type()!=CV_8UC3)
    {
liucong's avatar
liucong committed
117
        LOG_ERROR(stdout, "image error!\n");
Your Name's avatar
Your Name committed
118
119
120
121
122
        return IMAGE_ERROR;
    }

    cv::Mat inputImage, inputBlob;
    cv::cvtColor(srcImage, inputImage, CV_BGR2GRAY);
shizhm's avatar
shizhm committed
123

Your Name's avatar
Your Name committed
124
125
126
127
128
129
130
131
132
133
134
135
136
    int height, width, widthRaw;
    widthRaw = inputImage.cols;
    if(dynamic)
    {
        cv::resize(inputImage, inputImage, cv::Size(widthRaw, 32));
        height = inputImage.rows, width = inputImage.cols;
    }
    else
    {
        cv::resize(inputImage, inputImage, cv::Size(100, 32));
        height = inputImage.rows, width = inputImage.cols;
    }
    inputBlob = cv::dnn::blobFromImage(inputImage);
shizhm's avatar
shizhm committed
137

Your Name's avatar
Your Name committed
138
139
140
141
    for(int i=0; i<width * height; i++)
    {
        *((float*)inputBlob.data+i) = ((*((float*)inputBlob.data+i))/255.f - 0.5)/0.5;
    }
shizhm's avatar
shizhm committed
142

liucong's avatar
liucong committed
143
144
    // 创建输入数据
    std::unordered_map<std::string, migraphx::argument> inputData;
Your Name's avatar
Your Name committed
145
146
147
148
149
150
151
152
153
    if(dynamic)
    {
        std::vector<std::size_t> dynamicShape = {1, 1, 32, width};
        inputData[inputName]= migraphx::argument{migraphx::shape(inputShape.type(),dynamicShape), (float*)inputBlob.data};
    }
    else
    {
        inputData[inputName]= migraphx::argument{inputShape, (float*)inputBlob.data};
    }
shizhm's avatar
shizhm committed
154

Your Name's avatar
Your Name committed
155
156
    // 推理
    std::vector<migraphx::argument> inferenceResults = net.eval(inputData);
shizhm's avatar
shizhm committed
157

Your Name's avatar
Your Name committed
158
159
    // 获取推理结果
    std::vector<cv::Mat> outs;
shizhm's avatar
shizhm committed
160
    migraphx::argument result = inferenceResults[0];
Your Name's avatar
Your Name committed
161
162
163
164
165
166
167
168

    // 转换为cv::Mat
    migraphx::shape outputShape = result.get_shape();
    int shape[]={outputShape.lens()[0],outputShape.lens()[1],outputShape.lens()[2]};
    cv::Mat out(3,shape,CV_32F);
    memcpy(out.data,result.data(),sizeof(float)*outputShape.elements());
    outs.push_back(out);

shizhm's avatar
shizhm committed
169
    std::vector<int> predChars;
Your Name's avatar
Your Name committed
170
171
172
173
174
    const std::string alphabet = "-0123456789abcdefghijklmnopqrstuvwxyz";

    //获取字符索引序列
    for(uint i = 0; i < outs[0].size[0]; i++)
    {
liucong's avatar
liucong committed
175
        cv::Mat scores = cv::Mat(1,outs[0].size[2],CV_32F,outs[0].ptr<float>(i));
Your Name's avatar
Your Name committed
176
177
178
179
180
181
        cv::Point charIdPoint;
        double maxCharScore;
        cv::minMaxLoc(scores, 0, &maxCharScore, 0, &charIdPoint);
        int maxIdx = charIdPoint.x;
        predChars.push_back(maxIdx);
    }
shizhm's avatar
shizhm committed
182

Your Name's avatar
Your Name committed
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
    //字符转录处理
    for(uint i=0; i<predChars.size(); i++)
    {
        if(raw)
        {
            resultsChar.push_back(alphabet[predChars[i]]);
        }
        else
        {
            if(predChars[i] != 0)
            {
                if(!(i > 0 && predChars[i-1]==predChars[i]))
                {
                    resultsChar.push_back(alphabet[predChars[i]]);
                }
            }
        }
    }

    return SUCCESS;
}
}