工作中收到一个需求,需要把caffe的prototxt文件和模型文件编译进动态库,以后链接了这个动态库的工程,不需要依赖其他资源文件,只需要执行相关函数就可以直接进行人脸跟踪。以前提供的库是库,模型是模型,一旦不同版本的模型和库文件配对出了错误,整个跟踪结果就会出现一些乱七八糟的错误,现在打包成一个即可彻底避免这种情况。
首先需要明确,资源文件只不过是一堆存储在磁盘上的二进制串,按照一定规则读入内存后,便会起到我们期望的作用。那如果事先把资源文件作为全局变量直接编入可执行文件或者动态库中,在程序执行过程中,再按照一定规则解读这段内存,当然也可以达到同样的效果。
这便需要用到objcopy和nm命令来实现。objcopy和nm都是Linux系统提供的命令,简单来说,objcopy可以把资源文件转换成.o文件,这样才能编译到可执行文件或者库文件中,而nm命令则用来解读.o文件的符号表,定位具体的数据地址。具体操作如下:
模型文件为A.caffemodel。首先完成准备工作:先利用caffe提供的接口ReadNetParamsFromTextFileOrDie将A.caffemodel读取到内存中的,以caffe::NetParameter的结构存在,再通过WriteProtoToBinaryFile函数将其写入磁盘,成为B.binarymodel文件,得到了B.binarymodel文件,则准备工作完成,只要反序列化B文件,就能在内存中重建caffe::NetParameter结构。
接下来解决如何把B.binarymodel文件编入可执行文件的问题。首先用如下命令得到.o文件,-I为输入文件格式,-O为为输出文件格式&#x