为什么?
举个例子,我们在使用C/C++进行深度学习模型的测试,由于测试过程中可能有许多参数要传给model,比如在进行目标检测时,要传入nms阈值等。我们要最优化测试结果,这类参数需要不断的调整,如果我们把这类参数的值写在C/C++代码中,每次修改都要重新进行make,这样十分麻烦。
我们可以将这些参数写在一个json文件中,在C/C++代码中解析json文件,读取出参数。这样,我们每次修改参数的值,不需要重新进行make,省时省力。
怎么做?
- 安装jsoncpp
sudo apt-get install libjsoncpp-dev
安装后,头文件在“/usr/include/jsoncpp/json"下,动态库文件在"/usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.7.2"
- 修改CMakeLists
在CMakeLists中要加入jsoncpp的头文件路径和动态库路径。具体如下:
SET(JSONCPP_INCLUDE /usr/include/)
SET(JSONCPP_LIBS /usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.7.2)
SET(INCLUDES_DIRS ${JSONCPP_INCLUDE})
SET(LIBS ${JSONCPP_LIBS})
INCLUDE_DIRECTORIES(${INCLUDES_DIRS}
LINK_LIBRARIES(${LIBS})
假设我们的json文件长这样:
{
"model1": {
"model_path": "../path1/path2/xxx.model",
"batch_size": 1,
"nms_threshold": 0.8
}
}
我们可以使用如下代码读出这三个参数的值:
#include <fstream>
#include <sstream>
#include <iostream>
#include <jsoncpp/json/json.h>
void parse_json()
{
std::string path = "../params.json";
std::ifstream fin;
fin.open(path, std::ios::binary);
Json::Reader reader;
Json::Value root;
if(reader.parse(fin, root, false))
{
std::string model_path = root["model1"]["model_path"].asString();
int batch_size = root["model1"]["batch_size"].asInt();
float nms_threshold = root["model1"]["nms_threshold"].asFloat();
}
}