La détection d’objet est un processus par lequel le programme informatique peut identifier l’emplacement et la classification de l’objet. La détection d’objets est très utile en robotique, en particulier dans les véhicules autonomes. Il existe de nombreuses bibliothèques et frameworks pour la détection d’objets en python. Dans ce didacticiel, nous allons utiliser la détection d’objets sur les photos et les vidéos à l’aide de la bibliothèque OpenCV, qui est l’un des détecteurs d’objets les plus populaires et les plus rapides du moment.

Conditions préalables:

Anaconda:

La distribution Anaconda est une collection de packages composée de Python, R et de plus de 120 des packages open source les plus populaires pour la science et le traitement des données. Cela signifie que cette distribution peut être installée sur une seule machine, ce qui rend extrêmement pratique l’analyse de données à grande échelle ! Vous pouvez télécharger et installer le conda en allant sur le lien suivant.

https://www.anaconda.com/products/individual

Après cela, vous aurez accès au terminal que vous utiliserez pour installer toutes vos bibliothèques.

Bloc-notes Jupyter :

Le bloc-notes Jupyter est une application Web gratuite et open source. Il est couramment utilisé par les scientifiques des données et d’autres utilisateurs techniques qui cherchent à partager leur travail, mais n’importe qui peut utiliser cette plate-forme pour le partage des connaissances. Vous pouvez installer le notebook Jupyter à l’aide de la commande suivante dans votre terminal conda.

pip install jupyter notebook

Pour accéder au bloc-notes, vous pouvez utiliser cette commande.

jupyter notebook

Opencv:

openCV fournit un outil spécialisé dans l’analyse d’images, permettant aux développeurs de résoudre de nombreux problèmes courants lorsqu’il s’agit de créer des applications de vision par ordinateur. Des outils open source comme openCV permettent aux développeurs de travailler gratuitement sur de tels projets et peuvent s’avérer très utiles pour obtenir rapidement une optimisation maximale de leurs projets.

La bibliothèque peut être installée à l’aide de la commande suivante dans votre invite/terminal :

pip3 install opencv-python

Matplotlib:

Matplotlib est une bibliothèque essentielle en Python. Cette bibliothèque Python a été conçue sur la base de MATLAB, un programme graphique créé par des mathématiciens et des ingénieurs principalement dédié aux domaines des arts et de l’ingénierie.

La bibliothèque peut être installée à l’aide de la commande suivante dans votre invite/terminal :

pip3 install matplotlib

Modèle déjà formé :

Dans cet article de blog, nous n’allons pas créer et former notre propre modèle car il s’agit d’un didacticiel juste un guide de base, c’est pourquoi nous avons besoin d’un modèle pré-formé qui est déjà disponible sur la page opencv GitHub. Allez sur le lien suivant pour télécharger le modèle. Ensuite, extrayez le fichier .tar et copiez-collez le fichier frozen_inference_graph.pb dans le même dossier où votre notebook jupyter est en cours d’exécution.

https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API

Nous avons également besoin d’un fichier supplémentaire, alors téléchargez-le à partir du lien suivant. Ensuite, extrayez le fichier .zip et copiez-collez le fichier ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt dans le même dossier où votre notebook jupyter est en cours d’exécution.

https://gist.github.com/dkurt/54a8e8b51beb3bd3f770b79e56927bd7

Étiquettes coco :

Pour détecter les objets à partir de photos ou de vidéos, nous avons également besoin du nom / des étiquettes de l’objet et actuellement, cela prend en charge un total de 80 objets, vous pouvez le lien suivant et le copier-coller dans un fichier .txt vierge et enregistrer ce fichier où vous avoir votre cahier jupyter en cours d’exécution.

https://github.com/pjreddie/darknet/blob/master/data/coco.names

Accédez à ce lien, copiez-collez les 80 noms dans le fichier texte et enregistrez le fichier dans lequel votre bloc-notes jupyter est en cours d’exécution.

Code:

Détection d’objets dans l’image :

# import the dependencies
import cv2
import matplotlib.pyplot as plt

# load the files
config_file = 'ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
frozen_model = 'frozen_inference_graph.pb'

#  load the model
model = cv2.dnn_DetectionModel(frozen_model, config_file)

# empty list of python
classLabels = []
# loading the labels
file_name = 'Labels.txt'
with open(file_name, 'rt') as fpt:
    classLabels = fpt.read().rstrip('\n').split('\n')
    #classlables.append(fpt.read())

# checking if the labels are loaded correctly or not
print(classLabels)
print(len(classLabels))

Maintenant, nous vérifions que tous les paramètres de nos étiquettes sont corrects en exécutant le code.

Sortir:

# we have to defend the input size 320/320 because our model only supports this format
model.setInputSize(320,320)
model.setInputScale(1.0/127.5)
model.setInputMean((127.5,127.5,127.5))
model.setInputSwapRB(True)

# load the image
img = cv2.imread('men.jpg')

# show the image
# its in bgr format
plt.imshow(img)

# converting the image into RGB format
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

# setting the threshold or accuracy you want we are just fixed for 50% confidence
ClassIndex, confidence, bbox = model.detect(img,confThreshold=0.6)

print(ClassIndex)

Ici, nous avons atteint ce point où nous pouvons détecter l’objet dans l’image. Mais si vous exécutez le code, vous obtiendrez une sortie comme celle-ci

Il nous donne juste un numéro qui indique la position de l’objet présent dans le fichier d’étiquettes. Vous pouvez vérifier dans le fichier d’étiquettes et vous verrez que le numéro 3 est une voiture, ce qui signifie que le code fonctionne parfaitement et avec précision. Visualisons en ajoutant une boîte autour de l’image et en montrant son étiquette.

font_scale = 2
font = cv2.FONT_HERSHEY_PLAIN
for ClassInd, conf, boxes in zip(ClassIndex. flatten(), confidence.flatten(), bbox):
    # adding the box around the image and defining the color and width of the box
    cv2.rectangle(img, boxes, (255, 0, 0), 1)
    # adding the label in the box and defining the color,style and width of the font
    cv2.putText(img, classLabels[ClassInd-1], (boxes[0]+10, boxes [1]+40), font, fontScale=font_scale, color=(255, 255, 0), thickness=2 )

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

Remarque : S’il y a plusieurs objets sur la photo, nous les détecterons également et placerons une zone de délimitation autour d’eux.

Sortir:

Détection d’objets en vidéo :

# import the dependencies
import cv2
import matplotlib.pyplot as plt

# load the files
config_file = 'ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
frozen_model = 'frozen_inference_graph.pb'

#  load the model
model = cv2.dnn_DetectionModel(frozen_model, config_file)

# empty list of python
classLabels = []
# loading the labels
file_name = 'Labels.txt'
with open(file_name, 'rt') as fpt:
    classLabels = fpt.read().rstrip('\n').split('\n')
    #classlables.append(fpt.read())
# we have to define the input size 320/320 because our model only supports this format
model.setInputSize(320,320)
model.setInputScale(1.0/127.5)
model.setInputMean((127.5,127.5,127.5))
model.setInputSwapRB(True)
cap = cv2.VideoCapture("sample.mp4") # you can leave this blank if you want to use your webcam for object detection.
# Check if the video is playing correctly or not
if not cap. isOpened():
    cap = cv2. VideoCapture (0)
if not cap. isOpened():
    raise IOError("Cannot open video")

font_scale = 3
font = cv2. FONT_HERSHEY_PLAIN

while True:
    ret, frame = cap.read()
    ClassIndex, confidence, bbox = model.detect(frame, confThreshold=0.55)

    print(ClassIndex)
    if (len(ClassIndex)!=0):
        for ClassInd, conf, boxes in zip(ClassIndex. flatten(), confidence.flatten(), bbox):
            if (ClassInd<=80):
                cv2.rectangle(frame,boxes, (255, 0, 0), 2)
                cv2. putText(frame, classLabels[ClassInd-1], (boxes[0]+10, boxes [1]+40), font, fontScale=font_scale, color=(0, 255, 0), thickness=3 )
    cv2.imshow('object Detection Tutorial', frame)
    if cv2.waitKey(2) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Sortir:

Conclusion:

Dans ce blog, nous avons présenté le concept de détection d’objet et comment l’implémenter en Python. Notre objectif était d’apprendre aux développeurs novices à échantillonner du code sur la détection d’objets spécifiques dans des photographies ou des vidéos, ainsi que sur la visualisation de cette même fonctionnalité en temps réel via une webcam. Dans l’ensemble, nous espérons que vous avez apprécié cet article et n’hésitez pas à nous contacter si vous avez des questions à ce sujet !