[PYTHON] Chargez le fichier de modèle TensorFlow .pb avec readNetFromTensorflow ().

Cet article consiste à essayer d'utiliser readNetFromTensorflow () d'OpenCV pour traiter des modèles de ** détection d'objet ** entraînés sur votre propre ensemble de données à grande vitesse.

Je vais résumer les contre-mesures.

Environnement d'exploitation

Python: 3.7.6 Tensorflow: 1.14.0 OpenCV: 4.2.0

À propos de readNetFromTensorflow ()

Vous trouverez ci-dessous le code pour exécuter le modèle entraîné avec opencv.

# How to load a Tensorflow model using OpenCV
# Jean Vitor de Paulo Blog - https://jeanvitor.com/tensorflow-object-detecion-opencv/
 
import cv2
 
# Load a model imported from Tensorflow
tensorflowNet = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')
 
# Input image
img = cv2.imread('img.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 outputs
for detection in networkOutput[0,0]:
    
    score = float(detection[2])
    if score > 0.2:
    	
        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()

Pour plus de détails, reportez-vous à Comment charger des modèles Tensorflow avec OpenCV.

Fichiers nécessaires pour appeler le modèle

tensorflowNet = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')

--frozen_inference_graph.pb --graph.pbtxt (structure du modèle)

Les deux fichiers ci-dessus sont nécessaires pour charger le modèle tensorflow avec opencv.

Créer un fichier

Étape 1 Exécution de l'apprentissage

J'ai utilisé train.py pour la formation.

$ python train.py \
      --logtostderr \
      --train_dir=log \
      --pipeline_config_path=ssd_mobilenet_v1_coco.config

Ici, un dossier appelé journal est créé, et dans celui-ci

sera créé. Nous utiliserons ces deux fichiers à l'étape suivante.

Étape 2 Créez Frozen_inference_graph.pb

Utilisez ceci export_inference_graph.py.

$ python export_inference_graph.py \
    --input_type image_tensor \
    --pipeline_config_path log/pipeline.config \
    --trained_checkpoint_prefix log/model.ckpt-3000 \ #3000 est le nombre d'étapes
    --output_directory model_data

Une fois exécuté, il sera dans le dossier model_data

Peut être trouvé. Nous les utiliserons ensuite.

Étape 3 Créer graph.pbtxt (structure du modèle)

Utilisez ceci tf_text_graph_ssd.py.

$ python tf_text_graph_ssd.py \
    --input model_data/frozen_inference_graph.pb \
    --output graph_data/graph.pbtxt \
    --config model_data/pipeline.config

Une fois exécuté, graph.pbtxt est créé dans le dossier graph_data.

Le graphique figé et la structure du modèle sont maintenant terminés.

Modèle de charge

#Modèle de charge
model = cv2.dnn.readNetFromTensorflow('graph_data/frozen_inference_graph.pb', 
                                      'graph_data/graph.pbtxt')
print('Chargement terminé')

Alors ...

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-44-afa605a67bd6> in <module>
      1 #Modèle de charge
      2 model = cv2.dnn.readNetFromTensorflow('graph_data/frozen_inference_graph.pb', 
----> 3                                       'graph_data/graph.pbtxt')
      4 print('Chargement terminé')

error: OpenCV(4.2.0) /Users/travis/build/skvark/opencv-python/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:544: error: (-2:Unspecified error) Input layer not found: FeatureExtractor/MobilenetV1/Conv2d_0/weights/read/_166__cf__169 in function 'connect'

Input layer not found: /// in function 'connect' Je ne trouve pas la couche d'entrée! En raison de la lutte contre cette erreur, je me suis installé de la manière suivante.

Mesures à prendre lorsque la couche d'entrée introuvable apparaît.

node {
  name: "image_tensor"
  op: "Placeholder"
  attr {
    key: "dtype"
    value {
      type: DT_UINT8
    }
  }
  attr {
    key: "shape"
    value {
      shape {
        dim {
          size: -1
        }
        dim {
          size: 300
        }
        dim {
          size: 300
        }
        dim {
          size: 3
        }
      }
    }
  }
}
node {
  name: "FeatureExtractor/MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/mul_1"
  op: "Conv2D"
  input: "FeatureExtractor/MobilenetV1/Conv2d_0/weights/read/_166__cf__169"
  attr {
    key: "data_format"
    value {
      s: "NHWC"
    }
  }

Si vous regardez le début de graph.pbtxt, vous pouvez voir que la couche d'entrée n'existe pas. Ensuite, vous pouvez créer une couche d'entrée,

node {
  name: "image_tensor"
  op: "Placeholder"
  attr {
    key: "dtype"
    value {
      type: DT_UINT8
    }
  }
  attr {
    key: "shape"
    value {
      shape {
        dim {
          size: -1
        }
        dim {
          size: 300
        }
        dim {
          size: 300
        }
        dim {
          size: 3
        }
      }
    }
  }
}
node {                           #D'ici
  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"
}                                #Ajouter ici
node {
  name: "FeatureExtractor/MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/mul_1"
  op: "Conv2D"
  input: "Preprocessor/sub"      #ajouter à
  input: "FeatureExtractor/MobilenetV1/Conv2d_0/weights/read/_166__cf__169"
  attr {
    key: "data_format"
    value {
      s: "NHWC"
    }
  }

J'ai apporté une modification directe à graph.pbtxt comme ceci. Et Screenshot from Gyazo J'ai pu le lire en toute sécurité.

Nous n'avons pas été en mesure d'étudier la raison pour laquelle la couche d'entrée n'a pas été définie en premier lieu. Si quelqu'un le sait, je vous serais reconnaissant de bien vouloir commenter.

Recommended Posts

Chargez le fichier de modèle TensorFlow .pb avec readNetFromTensorflow ().
Calibrer le modèle avec PyCaret
Extraire le fichier xz avec python
Personnaliser le modèle / la couche / la métrique avec TensorFlow
Suivez la hiérarchie des fichiers avec fts
Téléchargez le fichier déployé avec appcfg.py
Validez le modèle d'entraînement avec Pylearn2
Ouvrir le fichier avec l'application par défaut
Affinons les hyper paramètres du modèle avec scikit-learn!
Vérifier l'existence du fichier avec python
Attention Seq2 Exécutez le modèle de dialogue avec Seq
Lisons le fichier RINEX avec Python ①
Essayez de réécrire le fichier avec la commande less
Vérifiez la taille du fichier avec du -sh *
Téléchargez le fichier avec PHP [En construction]
Essayez TensorFlow RNN avec un modèle de base
Chargez le modèle caffe avec Chainer et classez les images
Présentation du modèle DCGAN pour Cifar 10 avec keras
Ajustez les autorisations des fichiers avec la commande Linux chmod
Résolution du modèle Lorenz 96 avec Julia et Python
Enregistrer l'objet dans un fichier avec pickle
Convertir le code de caractère du fichier avec Python3
Calculer l'angle entre les vecteurs à n dimensions avec TensorFlow
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
Zundokokiyoshi avec TensorFlow
Casser des blocs avec Tensorflow
J'ai essayé de toucher un fichier CSV avec Python
Surveiller le modèle d'entraînement avec TensorBord sur Jupyter Notebook
Chargez le module du même nom dans un autre emplacement
Découvrez Wasserstein GAN avec le modèle Keras et l'optimisation TensorFlow