[PYTHON] Laden Sie die TensorFlow-Modelldatei .pb mit readNetFromTensorflow ().

In diesem Artikel wird versucht, OpenCVs readNetFromTensorflow () zu verwenden, um ** Objekterkennungsmodelle ** zu verarbeiten, die in Ihrem eigenen Datensatz mit hoher Geschwindigkeit trainiert wurden.

Ich werde die Gegenmaßnahmen zusammenfassen.

Betriebsumgebung

Python: 3.7.6 Tensorflow: 1.14.0 OpenCV: 4.2.0

Über readNetFromTensorflow ()

Unten finden Sie den Code zum Ausführen des trainierten Modells mit 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()

Weitere Informationen finden Sie unter Laden von Tensorflow-Modellen mit OpenCV.

Dateien, die zum Aufrufen des Modells erforderlich sind

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

--frozen_inference_graph.pb --graph.pbtxt (Modellstruktur)

Die beiden oben genannten Dateien sind erforderlich, um das Tensorflow-Modell mit opencv zu laden.

Eine Datei erstellen

Schritt 1 Ausführung des Lernens

Ich habe train.py für das Training verwendet.

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

Hier wird ein Ordner namens log erstellt und darin

wird erstellt. Wir werden diese beiden Dateien im nächsten Schritt verwenden.

Schritt 2 Erstellen Sie Frozen_Inference_graph.pb

Verwenden Sie diese 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 ist die Anzahl der Schritte
    --output_directory model_data

Bei der Ausführung befindet es sich im Ordner model_data

Kann gefunden werden. Wir werden diese als nächstes verwenden.

Schritt 3 Erstellen Sie graph.pbtxt (Modellstruktur)

Verwenden Sie diesen 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

Bei der Ausführung wird graph.pbtxt im Ordner graph_data erstellt.

Das Einfrierdiagramm und die Modellstruktur sind jetzt vollständig.

Modell laden

#Modell laden
model = cv2.dnn.readNetFromTensorflow('graph_data/frozen_inference_graph.pb', 
                                      'graph_data/graph.pbtxt')
print('Laden abgeschlossen')

Dann ...

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-44-afa605a67bd6> in <module>
      1 #Modell laden
      2 model = cv2.dnn.readNetFromTensorflow('graph_data/frozen_inference_graph.pb', 
----> 3                                       'graph_data/graph.pbtxt')
      4 print('Laden abgeschlossen')

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' Ich kann die Eingabeebene nicht finden! Als Ergebnis des Kampfes mit diesem Fehler habe ich mich auf folgende Weise niedergelassen.

Maßnahmen, die ergriffen werden müssen, wenn die Eingabeebene nicht gefunden wird.

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"
    }
  }

Wenn Sie sich den Anfang von graph.pbtxt ansehen, sehen Sie, dass die Eingabeebene nicht vorhanden ist. Dann können Sie eine Eingabeebene erstellen,

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 {                           #Von hier
  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"
}                                #Addiere hier
node {
  name: "FeatureExtractor/MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/mul_1"
  op: "Conv2D"
  input: "Preprocessor/sub"      #hinzufügen
  input: "FeatureExtractor/MobilenetV1/Conv2d_0/weights/read/_166__cf__169"
  attr {
    key: "data_format"
    value {
      s: "NHWC"
    }
  }

Ich habe eine direkte Änderung an graph.pbtxt wie folgt vorgenommen. Und Screenshot from Gyazo Ich konnte es sicher lesen.

Wir konnten nicht untersuchen, warum die Eingabeebene überhaupt nicht definiert wurde. Wenn jemand es weiß, würde ich es begrüßen, wenn Sie einen Kommentar abgeben könnten.

Recommended Posts

Laden Sie die TensorFlow-Modelldatei .pb mit readNetFromTensorflow ().
Kalibrieren Sie das Modell mit PyCaret
Extrahieren Sie die xz-Datei mit Python
Passen Sie Modell / Ebene / Metrik mit TensorFlow an
Folgen Sie der Dateihierarchie mit fts
Laden Sie die mit appcfg.py bereitgestellte Datei herunter
Validieren Sie das Trainingsmodell mit Pylearn2
Datei mit Standard-App öffnen
Lassen Sie uns die Hyperparameter des Modells mit scikit-learn abstimmen!
Überprüfen Sie die Existenz der Datei mit Python
Achtung Seq2 Führen Sie das Dialogmodell mit Seq aus
Lesen wir die RINEX-Datei mit Python ①
Versuchen Sie, die Datei mit dem Befehl less neu zu schreiben
Überprüfen Sie die Dateigröße mit du -sh *
Laden Sie die Datei mit PHP herunter [Im Aufbau]
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Laden Sie das Kaffeemodell mit Chainer und klassifizieren Sie die Bilder
Belichtung des DCGAN-Modells für Cifar 10 mit Keras
Passen Sie die Dateiberechtigungen mit dem Linux-Befehl chmod an
Lösen des Lorenz 96-Modells mit Julia und Python
Speichern Sie das Objekt in einer Datei mit pickle
Konvertieren Sie den Zeichencode der Datei mit Python3
Berechnen Sie den Winkel zwischen n-dimensionalen Vektoren mit TensorFlow
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Zundokokiyoshi mit TensorFlow
Brechen Sie Blöcke mit Tensorflow
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Überwachen Sie das Trainingsmodell mit TensorBord auf Jupyter Notebook
Laden Sie das gleichnamige Modul an einer anderen Stelle
Lernen Sie Wasserstein GAN mit Keras-Modell und TensorFlow-Optimierung