将Keras转换为OpenCV:readnetfromtensorflow不工作
我想将KERAS模型转换为OpenCV。我的步骤如下:
#######Model######
model = Sequential()
model.add(Conv2D(input_shape=(200, 200, 3), filters=96, kernel_size=(7, 7), strides=4, padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(LayerNormalization())
model.add(Conv2D(filters=256, kernel_size=(5, 5), strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(LayerNormalization())
model.add(Conv2D(filters=256, kernel_size=(3, 3), strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(LayerNormalization())
model.add(Flatten())
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(rate=0.25))
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(rate=0.25))
model.add(Dense(units=17, activation='softmax'))
model.summary()
callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3) # Callback for earlystopping
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
然后,我将模型转换为.pb文件,
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(
tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()
layers = [op.name for op in frozen_func.graph.get_operations()]
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
logdir="./models",
name="model.pb",
as_text=True)
但是当我尝试将.pb文件加载到OPENCV中时:
net = cv2.dnn.readNetFromTensorflow('models/model.pb')
我
error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp:2799: error: (-2:Unspecified error) Input layer not found: sequential/layer_normalization_2/Shape in function 'cv::dnn::dnn4_v20220524::`anonymous-namespace'::TFImporter::connect'
[ERROR:[email protected]] global D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp (3159) cv::dnn::dnn4_v20220524::`anonymous-namespace'::TFImporter::parseNode DNN/TF: Can't parse layer for node='sequential/layer_normalization_2/strided_slice_3' of type='StridedSlice'. Exception: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp:2799: error: (-2:Unspecified error) Input layer not found: sequential/layer_normalization_2/Shape in function 'cv::dnn::dnn4_v20220524::`anonymous-namespace'::TFImporter::connect'
真的希望有人可以帮助我
I want to convert a keras model to opencv. My steps were the following:
#######Model######
model = Sequential()
model.add(Conv2D(input_shape=(200, 200, 3), filters=96, kernel_size=(7, 7), strides=4, padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(LayerNormalization())
model.add(Conv2D(filters=256, kernel_size=(5, 5), strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(LayerNormalization())
model.add(Conv2D(filters=256, kernel_size=(3, 3), strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(LayerNormalization())
model.add(Flatten())
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(rate=0.25))
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(rate=0.25))
model.add(Dense(units=17, activation='softmax'))
model.summary()
callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3) # Callback for earlystopping
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
then I converted the model to an .pb file
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(
tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()
layers = [op.name for op in frozen_func.graph.get_operations()]
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
logdir="./models",
name="model.pb",
as_text=True)
But when I try to load the .pb file into opencv by using:
net = cv2.dnn.readNetFromTensorflow('models/model.pb')
the following error occurs:
error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp:2799: error: (-2:Unspecified error) Input layer not found: sequential/layer_normalization_2/Shape in function 'cv::dnn::dnn4_v20220524::`anonymous-namespace'::TFImporter::connect'
[ERROR:[email protected]] global D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp (3159) cv::dnn::dnn4_v20220524::`anonymous-namespace'::TFImporter::parseNode DNN/TF: Can't parse layer for node='sequential/layer_normalization_2/strided_slice_3' of type='StridedSlice'. Exception: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp:2799: error: (-2:Unspecified error) Input layer not found: sequential/layer_normalization_2/Shape in function 'cv::dnn::dnn4_v20220524::`anonymous-namespace'::TFImporter::connect'
I really hope someone can help me
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论