利用tengine框架部署模型时,会把.onnx模型转化为.tmfie模型,为方便部署,可以将tmfile模型文件转化为头文件输出。可参考以下代码。
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <iomanip>
using namespace std;
// 将指定文件的内容读取到内存中,并以十六进制格式写入到头文件中
int tmfile2cpp(const char* fname){
struct stat stat;
// 打开指定文件
int fd = open(fname, O_RDONLY);
if (fd < 0)
{
return -1; // 文件打开失败,返回错误
}
// 获取文件状态信息
fstat(fd, &stat);
int file_len = stat.st_size; // 获取文件大小
void* mem_base = (void*)malloc(file_len); // 分配内存空间
// 读取文件内容到内存中
int ret = read(fd, mem_base, file_len);
printf("file_len:%d\n",file_len);
// 打开输出文件流
ofstream ofile("model.h");
ofile<<"#include <stdint.h>"<<endl;
ofile<<"uint8_t mem_base[] = {";
// 将内存中的数据以十六进制格式写入到头文件中
for (int i = 0; i < file_len; i++)
{
ofile << "0x" << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << static_cast<unsigned int>((static_cast<unsigned char*>(mem_base))[i]);
if (i < file_len - 1) {
ofile << ", ";
}
}
ofile<<"};";
// 释放内存空间,关闭文件
free(mem_base);
close(fd);
return 0; // 返回成功
}
int main(){
std::string file_name = "Model.tmfile";
tmfile2cpp(file_name.c_str()); // 调用函数将文件内容转换为头文件内容
return 0;
}