我将训练有素的SSD300模型(检查点,元数据)转换为冻结的.pb格式时遇到了麻烦,这需要通过opencv来运行,而无需安装tensorflow。
我使用this SSD实施,效果很好。我在自己的数据集上训练了一个模型(检查点),并且可以像演示脚本simple_ssd_demo.py一样轻松地还原检查点。
我要做的第一件事是使用脚本freeze_graph.py冻结图形。也许问题已经存在了,因为我不确定通过确定仅保留推理所需的图部分所需的输出节点名称。但是,由于未找到代表输出变量labels_,scores_和bboxes_的3个节点,所以选择了total_loss节点作为输出节点。
labels_, scores_, bboxes_ = sess.run([all_labels, all_scores, all_bboxes], feed_dict = {image_input : np_image, shape_input : np_image.shape[:-1]})
然后我尝试使用导入冻结的图
net = cv2.dnn.readNetFromTensorflow(tfmodel_path+'frozen_graph.pb')
我收到一条错误消息:
Traceback (most recent call last):
File "Testapp_Tensorflow.py", line 32, in <module>
net = cv2.dnn.readNetFromTensorflow(tfmodel_path+'frozen_graph.pb')
cv2.error: OpenCV(3.4.4) C:\projects\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp:497:
error: (-2:Unspecified error) Input layer not found: ssd300/conv4_3_scale/weights in function 'cv::dnn::experimental_dnn_34_v10::`anonymous-namespace'::TFImporter::connect'
[ WARN:0] terminating async callback
我不明白为什么找不到一些权重,因为计算权重也需要权重。
如何使模型对cv2.dnn可读?