ncnnmem加密模型
在Ubuntu下编译ncnn后,在build/tools/下执行
./ncnnmem crnn.param crnn.bin crnn.id.h crnn.mem.h
生成crnn.id.h crnn.mem.h crnn.param.bin
这时候加载模型有多种方式,为了以后发布方便,准备把模型打包进so文件中,这样子就不用额外提供模型给前端。这样子就会用到crnn.id.h crnn.mem.h ,作为头文件,包含到项目中。具体调用方式如下
#include "net.h" #include#include #include #include "crnn.id.h" #include "crnn.mem.h" std::string dir = "F:/"; const int img_width = 144; const int img_height = 32; const int output_length = 37; void pretty_print(const ncnn::Mat& m) { std::cout << m.c << std::endl; std::cout << m.h << std::endl; std::cout << m.w << std::endl; for (int q = 0; q < m.c; q++) { const float* ptr = m.channel(q); for (int y = 0; y < m.h; y++) { for (int x = 0; x < m.w; x++) { //printf("%f ", ptr[x]); } ptr += m.w; //printf("n"); } //printf("------------------------n"); } } int main(int argc, char** argv) { cv::Mat img = cv::imread("G:/dataset/billinfo/phonenum/ori_set/baidu_rec/done/baidu_error/0009-JT5072471253611-out_warehouse-JTSD-1.jpg"); cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); int w = img.cols; int h = img.rows; ncnn::Mat in = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_GRAY, w, h, img_width, img_height); const float mean_vals[3] = { 0.5f * 255.f, 0.5f * 255.f, 0.5f * 255.f }; const float norm_vals[3] = { 1 / 0.5f / 255.f, 1 / 0.5f / 255.f, 1 / 0.5f / 255.f }; in.substract_mean_normalize(mean_vals, norm_vals); ncnn::Net net; net.load_param(crnn_param_bin); net.load_model(crnn_bin); ncnn::Extractor ex = net.create_extractor(); ex.set_light_mode(true); ex.set_num_threads(4); ncnn::Mat out; ex.input(crnn_param_id::BLOB_data, in); ex.extract(crnn_param_id::BLOB_pred_fc, out); pretty_print(out); }
模型转换成功,但是在调用时发现结果输出有问题,仔细研究发现,Squeeze,Transpose操作不起作用。还是加密模型操作的有问题,尝试通过windows编译的ncnn加密模型,得到对应文件后尝试,发现能够正常输出结果。所以这是Ubuntu下的ncnn编译的有问题??



