如何在cv2中运行TensorFlow目标检测API的ssd_resnet_50_fpn_coco网络
报错根因
自行导出的frozen_inference_graph.pb计算图的首个节点不是Placeholder,因为TensorFlow 1.x目标检测API的默认导出逻辑会在计算图前端插入图像解码、归一化等预处理节点,和Model Zoo预发布的pb结构不同,触发tf_text_graph_ssd.py的固定节点位置断言。
解决方案
方法一:调整导出脚本参数(优先使用)
运行export_inference_graph.py导出冻结图时,添加参数指定输入为固定shape的image tensor,跳过预处理节点插入:
python export_inference_graph.py \ --input_type image_tensor \ --pipeline_config_path 你的配置文件路径.config \ --trained_checkpoint_prefix 你的检查点前缀.ckpt \ --output_directory 导出目录路径 \ --input_shape "[1,640,640,3]"
用该命令导出的pb再运行tf_text_graph_ssd.py即可正常生成pbtxt文件。
方法二:修改断言逻辑(适配特殊导出场景)
如果调整导出参数后仍报错,直接修改tf_text_graph_ssd.py的断言规则,不强制要求Placeholder节点在首个位置:
找到第235行的assert(graph_def.node[0].op == 'Placeholder')代码,替换为以下内容:
# 遍历计算图查找Placeholder输入节点 input_node = None for node in graph_def.node: if node.op == 'Placeholder': input_node = node break assert input_node is not None, "未找到有效输入节点,请检查导出的pb文件是否正确" # 后续代码中所有引用graph_def.node[0]的位置,统一替换为input_node
验证注意事项
- 导出pb和生成pbtxt时使用的.config文件必须和训练时的配置完全一致,不得修改输入尺寸、anchor规则、类别数量等参数
- 运行
tf_text_graph_ssd.py时传入的输入路径必须是方法一导出的frozen pb文件路径
内容的提问来源于stack exchange,提问作者Kim-Erik Tang Andersen
相关产品推荐
相关产品推荐

