将Keras转换为OpenCV:readnetfromtensorflow不工作

发布于 2025-02-11 06:03:12 字数 2817 浏览 3 评论 0原文

我想将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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文