Ошибка загрузки замороженного графа вывода Tensorflow в OpenCV DNN

Я обучил модель обнаружения объектов с помощью Tensorflow API, следуя примеру, основанному на этой записной книжке Google Colaboratory от Roboflow. https://colab.research.google.com/drive/1wTMIrJhYsQdq_u7ROOkf0Lu_fsX5Mu8a

Пока все хорошо, и я успешно извлек свою обученную модель в виде графа вывода, снова следуя той же записной книжке:

import re
import numpy as np

output_directory = './fine_tuned_model'

lst = os.listdir(model_dir)
lst = [l for l in lst if 'model.ckpt-' in l and '.meta' in l]
steps=np.array([int(re.findall('\d+', l)[0]) for l in lst])
last_model = lst[steps.argmax()].replace('.meta', '')

last_model_path = os.path.join(model_dir, last_model)
print(last_model_path)
!python /content/models/research/object_detection/export_inference_graph.py \
    --input_type=image_tensor \
    --pipeline_config_path={pipeline_fname} \
    --output_directory={output_directory} \
    --trained_checkpoint_prefix={last_model_path}

Это дает мне frozen_inference_graph.pbфайл, который я могу использовать для создания моей программы обнаружения объектов в OpenCV DNN. Также следуя этому примеру /questions/50409277/ne-udalos-preobrazovat-zamorozhennyij-graf-tenzornogo-potoka-v-fajl-pbtxt/50409287#50409287, я подготовил файл.pbtxt модели и конфигурации конвейера в качестве второго аргумента дляcv2.dnn.readNetFromTensorflowфункция. Вот кода, которого достаточно, чтобы воспроизвести мою ошибку:

model = cv2.dnn.readNetFromTensorflow('models/trained/frozen_inference_graph.pb', 
                                      'models/trained/output.pbtxt')

Этот код успешно работает, когда я использовал предварительно обученную модель SSD MobileNet V2 COCO, ssd_mobilenet_v2_coco_2018_03_29.pbtxt

однако, используя мой обученный файл.pbtxt, он выдаст эту ошибку:

C:\Users\Satria\Desktop\ExploreOpencvDnn-master>python trainedmodel_video.py -i test1.mp4 -o test1result.mp4
Traceback (most recent call last):                                                                                                                            
File "trainedmodel_video.py", line 48, in <module> 'models/trained/output.pbtxt') cv2.error:
OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp:544:error:
(-2:Unspecified error) Input layer not found: FeatureExtractor/MobilenetV2/Conv/weights in function
'cv::dnn::dnn4_v20190621::`anonymous-namespace'::TFImporter::connect' 

Он говорит, что входной слой не найден. Почему так происходит? Также обратите внимание, что сообщение об ошибке указывает на каталог:

C:\projects\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp

что невероятно странно, потому что у меня вообще нет этого каталога на моем компьютере. Я попытался выполнить различную проверку файлов pbtxt и config моей и образца модели мобильной сети SSD, и я не могу найти ни одного экземпляра этого конкретного каталога, используемого в любом месте, и даже у них нет пути к каталогу внутри.

Это вызвано тренировкой с использованием Google Colab? Есть ли какой-нибудь правильный способ использовать модели Tensorflow, обученные Colab, в OpenCV DNN?

Заранее спасибо!

1 ответ

Решение

Решено после добавления дополнительного входного узла в мой собственный сгенерированный файл pbtxt

Кто-то предположил, что OpenCV версии 4.11, которую я использовал, устарела. Я обновился до 4.30, но все еще не работает, но теперь он позволяет мне использовать FusedBatchNormV3, что очень важно в будущем.

Теперь, внимательно посмотрев на diffcheck в образце и сгенерированный pbtxt,

В примере файла.pbtxt ssd_mobilenet_v2_coco_2018_03_29.pbtxt, строка 30 и далее

node {  
  name: "Preprocessor/mul"  
  op: "Mul" 
  input: "image_tensor" 
  input: "Preprocessor/mul/x"   
}   
node {  
  name: "Preprocessor/sub"  
  op: "Sub" 
  input: "Preprocessor/mul" 
  input: "Preprocessor/sub/y"   
}   
node {  
  name: "FeatureExtractor/MobilenetV2/Conv/Conv2D"  
  op: "Conv2D"  
  input: "Preprocessor/sub" 
  input: "FeatureExtractor/MobilenetV2/Conv/weights"    

Он имеет дополнительные узлы ввода, которые используют Preprocessor, не только FeatureExtractor/MobilenetV2/Conv/Conv2D

тем временем на сгенерированном pbtxt есть только это

node {
  name: "FeatureExtractor/MobilenetV2/Conv/Conv2D"
  op: "Conv2D"
  input: "FeatureExtractor/MobilenetV2/Conv/weights"

Я скопировал входные узлы образца.pbtxt и в свой собственный сгенерированный.pbtxt, и это сработало!!!

Другие вопросы по тегам