本篇做一个没有实用价值的mnist rpc服务,重点记录我在调试整合tensorflow和opencv时遇到的问题;
准备模型mnist的基础模型结构就使用tensorflow tutorial给的例子,卷积-池化-卷积-池化-全连接-dropout-softmax,然后走常规的优化训练,得到一个错误率2.0%的结果;
然后准备一个单张图片的输入,一个(1, 28, 28, 1)的tensor,输入到模型里,得到一个单条的输出,给它们定好名字;
将模型保存下来:
加载模型
用c++写一个thrift rpc server,在handler的实例化阶段加载模型,加载过程与上一篇一致:
bool MNISTRecognizeServletHandler::Init() { // init session Status status = NewSession(SessionOptions(), &session_); if (!status.ok()) { LOG(ERROR) << status.ToString(); return false; } else { session_inited_ = true; } // load graph graph_def_ = new GraphDef(); std::string model_path = FLAGS_model_path; status = ReadBinaryProto(Env::Default(), model_path, graph_def_); if (!status.ok()) { LOG(ERROR) << status.ToString(); return false; } else { graph_loaded_ = true; } // prepare session status = session_->Create(*graph_def_); if (!status.ok()) { LOG(ERROR) << status.ToString(); return false; } else { session_prepared_ = true; } }