Skip to content Skip to sidebar Skip to footer

Failed To Convert Tensorflow Frozen Graph To Pbtxt File

I want to extract pbtxt file given an input of tensorflow frozen inference graph. In order to do this I am using the below script : import tensorflow as tf #from google.protobuf i

Solution 1:

Heres what worked for me

  • git clone https://github.com/opencv/opencv.git
  • Navigate to opencv/samples/dnn/
  • Copy frozen_inference_graph.pb, and *.config file corresponding to your pb file
  • Paste the copied files in opencv/samples/dnn directory
  • Make a new folder in the den directory and name it "exported_pbtxt"

And run this script:

python3 tf_text_graph_ssd.py--input frozen_inference_graph.pb--output exported_pbtxt/output.pbtxt--config pipeline.config

enter image description here

That’s all you need, now copy the frozen inference graph and newely generated pbtxt file. And, use the following script to run your model using OpenCV:

import cv2

# Load a model imported from Tensorflow
tensorflowNet = cv2.dnn.readNetFromTensorflow('card_graph/frozen_inference_graph.pb', 'exported_pbtxt/output.pbtxt')

# Input image
img = cv2.imread('image.jpg')
rows, cols, channels = img.shape

# Use the given image as input, which needs to be blob(s).
tensorflowNet.setInput(cv2.dnn.blobFromImage(img, size=(300, 300), swapRB=True, crop=False))

# Runs a forward pass to compute the net output
networkOutput = tensorflowNet.forward()

# Loop on the outputsfor detection in networkOutput[0,0]:

    score = float(detection[2])
    if score > 0.9:

        left = detection[3] * cols
        top = detection[4] * rows
        right = detection[5] * cols
        bottom = detection[6] * rows

        #draw a red rectangle around detected objects
        cv2.rectangle(img, (int(left), int(top)), (int(right), int(bottom)), (0, 0, 255), thickness=2)

# Show the image with a rectagle surrounding the detected objects 
cv2.imshow('Image', img)
cv2.waitKey()
cv2.destroyAllWindows()

Solution 2:

Please follow this guide: https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API. There is no sense to create a .pbtxt without modifying it. The script from guide creates an extra text graph which is used for import to OpenCV.

Solution 3:

Might help someone. Met the same problem with mars-small128.pb for OpenCV 4.3.0 pulled from master

import argparse
import tensorflow as tf
from tensorflow.python.saved_model import signature_constants

defsave(graph_pb, export_dir):
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)

with tf.gfile.GFile(graph_pb, "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())

sigs = {}

with tf.Session(graph=tf.Graph()) as sess:
    # INFO: name="" is important to ensure we don't get spurious prefixing
    tf.import_graph_def(graph_def, name='')
    g = tf.get_default_graph()

    # INFO: if name is added the input/output should be prefixed like:#       name=net => net/images:0 & net/features:0
    inp = tf.get_default_graph().get_tensor_by_name("images:0")
    out = tf.get_default_graph().get_tensor_by_name("features:0")

    sigs[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY] = \
        tf.saved_model.signature_def_utils.predict_signature_def(
            {"in": inp}, {"out": out})

    builder.add_meta_graph_and_variables(sess,
                                         [tag_constants.SERVING],
                                         signature_def_map=sigs)

builder.save(as_text=True)


if __name__ == '__main__':
    # export_dir = './saved'# graph_pb = '../models/deep_sort/mars-small128.pb'

    parser = argparse.ArgumentParser()
    parser.add_argument('--input', help="path to frozen pb file")
    parser.add_argument('--output', help="Folder to save")
    args = parser.parse_args()
    if args.inputisnotNoneand args.output:
        save(args.input, args.output)
    else:
        print(f"Usage adapt_opencv.py.py --input 'path_to_bp' --output './saved'")

Solution 4:

Convert pb to pbtxt for TF 2.xxx:

import tensorflow as tf
from google.protobuf import text_format
from tensorflow.python.platform import gfile

defgraphdef_to_pbtxt(filename): 
    withopen(filename,'rb') as f:
        graph_def = tf.compat.v1.GraphDef()
        graph_def.ParseFromString(f.read())
    withopen('protobuf.txt', 'w') as fp:
        fp.write(str(graph_def))
    
graphdef_to_pbtxt('saved_model.pb')

Post a Comment for "Failed To Convert Tensorflow Frozen Graph To Pbtxt File"