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