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.
Python: 3.7.6 Tensorflow: 1.14.0 OpenCV: 4.2.0
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.
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.
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.
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.
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
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.
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 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