Utilisez darknet pour détecter des objets dans des images avec YOLOv3
La détection et l'identification d'objets dans des images est l'une des applications principales du machine learning. C'est très facile à faire darknet , comme on va le voir.
Je vais décrire ce que j'ai du faire sur mon PC Ubuntu 16.04, mais ce tuto marche sans doute aussi avec une version plus récente d'Ubuntu.
Tout d'abord, veuillez vérifier que votre PC dispose bien d'une carte NVidia compatible CUDA .
En suivant ce tuto vous allez apprendre à :
Ici, nous nous contenterons de détecter des objets dans des photos, mais je prépare un article sur la détection en temps réel dans une vidéo.
CUDA est une architecture de calcul parallèle développée par NVidia, qui permet d'utiliser les ressources du processeur graphique (GPU). CUDA est utilisé dans un grand nombre d'applications : machine learning, calcul scientifique, jeux vidéo, etc.
Pour pouvoir utiliser le GPU dans darknet, il est nécessaire d'installer CUDA, et c'est ce que nous allons faire maintenant.
À nouveau, ces instructions sont pour Ubuntu 16.04, mais n'hésitez pas à tenter le coup avec une version plus récente d'Ubuntu, et à nous dire si ça marche ou pas dans les commentaires.
Téléchargez CUDA . Sélectionnez votre système d'exploitation, votre architecture, votre distribution, et le type d'installeur. Voici ce que j'ai choisi :
Téléchargez le Base installer . Pour cela, cliquez sur le lien Download , ou copiez ce lien pour l'utiliser avec wget comme ceci ( attention à bien utiliser le lien correspondant à vos choix ci-dessus! )
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_10.1.105-1_amd64.deb
Ensuite, exécutez les commandes fournies dans les instructions d'installation:
sudo dpkg -i cuda-repo-ubuntu1604_10.1.105-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
Ça va prendre pas mal de temps. À un moment donné, les drivers nvidia pour votre carte graphique seront installés. Il se pourrait que l'installeur vous dise que l'UEFI secure boot est activé, et que vous devez fournir un mot de passe. D'après ce que j'ai vu, ce mot de passe n'est pas vraiment requis pour rebooter la machine, et tout marche bien. Donc donnez un mot de passe, et ne vous souciez pas de ce qui se passera ensuite.
Après l'installation, redémarrez votre PC.
Maintenant, voyons la liste des packages que nous avons installés:
sudo apt list --installed cuda*
Et listons les fichiers installés pour l'un des packages, par exemple:
dpkg-query -L cuda-samples-10-1
Dans mon cas, CUDA est installé dans /usr/local/cuda-10.1, et un lien symbolique est ajouté automatiquement vers /usr/local/cuda. À partir de maintenant, nous utiliserons ce lien.
Pour vérifier que CUDA fonctionne bien, allez dans le répertoire contenant la suite de démo:
cd /usr/local/cuda/extras/demo_suite/
Vérifiez que CUDA peut bien trouver votre GPU (ou vos GPUs si vous en avez plusieurs):
./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 2 CUDA Capable device(s)
Device 0: "GeForce GTX 1080 Ti"
CUDA Driver Version / Runtime Version 10.1 / 10.1
CUDA Capability Major/Minor version number: 6.1
Total amount of global memory: 11178 MBytes (11721506816 bytes)
(28) Multiprocessors, (128) CUDA Cores/MP: 3584 CUDA Cores
GPU Max Clock rate: 1582 MHz (1.58 GHz)
Memory Clock rate: 5505 Mhz
Memory Bus Width: 352-bit
L2 Cache Size: 2883584 bytes
...
Maintenant, lançons la simulation d'un système contenant de nombreuses particules sur le GPU:
./nbody -benchmark
...
> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
GPU Device 0: "GeForce GTX 1080 Ti" with compute capability 6.1
> Compute 6.1 CUDA device: [GeForce GTX 1080 Ti]
28672 bodies, total time for 10 iterations: 27.356 ms
= 300.511 billion interactions per second
= 6010.227 single-precision GFLOP/s at 20 flops per interaction
Si vous voyez des messages similaires, vous avez installé CUDA avec succès !
Cependant, CUDA fournit quelques commandes dont nous aurons besoin plus tard. Ces commandes sont dans /usr/local/cuda/bin. Nous devons donc ajouter ce répertoire à notre PATH pour que le système puisse les trouver lorsque vous les tapez sur la ligne de commande. Pour cela, faites la chose suivante (je suppose que vous utilisez bash; sinon, vous devez savoir ce que vous faites :-) ):
export CUDA=/usr/local/cuda
export PATH=$CUDA/bin:$PATH
💡 Vous pouvez rajouter ces lignes dans votre .bashrc
OpenCV est la librairie open source pour la vision par ordinateur, et c'est un outil puissant. Ici, nous allons seulement l'utiliser à travers darknet pour que celui-ci puisse afficher des images. Mais ça vaut vraiment le coup d'apprendre à se servir de cet outil, qui peut vous servir pour:
Vous pourriez démarrer avec le tuto d'OpenCV , et aussi jeter un oeil au blog d'Adrian Rosebrock , qui est vraiment bien. Et c'est en fait là que j'ai fait mes premiers pas avec cet outil!
L'installation se fait très facilement :
sudo apt-get install libopencv-dev
Vérifiez qu'OpenCV est correctement installé en tapant :
pkg-config --libs opencv
/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so -lopencv_calib3d /usr/lib/x86_64-linux-gnu/libopencv_contrib.so -lopencv_contrib /usr/lib/x86_64-linux-gnu/libopencv_core.so -lopencv_core /usr/lib/x86_64-linux-gnu/libopencv_features2d.so -lopencv_features2d /usr/lib/x86_64-linux-gnu/libopencv_flann.so -lopencv_flann /usr/lib/x86_64-linux-gnu/libopencv_gpu.so -lopencv_gpu /usr/lib/x86_64-linux-gnu/libopencv_highgui.so -lopencv_highgui /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so -lopencv_imgproc /usr/lib/x86_64-linux-gnu/libopencv_legacy.so -lopencv_legacy /usr/lib/x86_64-linux-gnu/libopencv_ml.so -lopencv_ml /usr/lib/x86_64-linux-gnu/libopencv_objdetect.so -lopencv_objdetect /usr/lib/x86_64-linux-gnu/libopencv_ocl.so -lopencv_ocl /usr/lib/x86_64-linux-gnu/libopencv_photo.so -lopencv_photo /usr/lib/x86_64-linux-gnu/libopencv_stitching.so -lopencv_stitching /usr/lib/x86_64-linux-gnu/libopencv_superres.so -lopencv_superres /usr/lib/x86_64-linux-gnu/libopencv_ts.so -lopencv_ts /usr/lib/x86_64-linux-gnu/libopencv_video.so -lopencv_video /usr/lib/x86_64-linux-gnu/libopencv_videostab.so -lopencv_videostab
Cette commande vous donne la liste des librairies nécessaires pour compiler du code avec OpenCV, par exemple darknet.
Les instructions d'installation de darknet sont très bien écrites.
Suivez la première section, qui va vous montrer comment :
Si tout est ok, on peut activer le support de CUDA et d'OpenCV.
D'abord, on nettoie les résultats de la compilation précédente :
make clean
Ensuite, ouvrez le Makefile dans votre éditeur favori. Au début du fichier, mettez à 1 les flags GPU et OPENCV, comme ceci :
GPU=1
CUDNN=0
OPENCV=1
OPENMP=0
DEBUG=0
Plus loin dans le Makefile, vous pouvez voir que darknet s'attend à trouver CUDA dans /usr/local/cuda. C'est exactement là que nous l'avons installé, donc ça devrait être bon.
Darknet s'attend à ce qu'OpenCV soit installé grâce à un package manager, comme nous l'avons fait. La liste des paramètres de compilation et de lien avec OpenCV est engendrée avec pkg-config ici :
ifeq ($(OPENCV), 1)
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv` -lstdc++
COMMON+= `pkg-config --cflags opencv`
endif
Nous avons exécuté pkg-config plus haut, donc à nouveau, tout devrait être bon.
Maintenant, compilez darknet (ici j'utilise 4 coeurs de mon processeur pour compiler en parallèle) :
make -j 4
Il ne doit pas y avoir d'erreurs dans le log de la compilation. J'ai un warning, mais il ne pose pas de problème :
In file included from /usr/local/cuda/include/cuda_runtime.h:96:0,
from include/darknet.h:11,
from ./src/utils.h:5,
from ./src/gemm.c:2:
/usr/local/cuda/include/cuda_runtime_api.h:955:57: note: declared here
extern __CUDA_DEPRECATED __host__ cudaError_t CUDARTAPI cudaThreadSynchronize(void);
Vous pouvez maintenant essayer de détecter des objets dans une image. Encore une fois, les instructions sont très claires .
Nous allons utiliser un modèle YOLOv3 pré-entraîné. D'abord (et seulement une fois), téléchargez les paramètres de ce modèle :
wget https://pjreddie.com/media/files/yolov3.weights
Ensuite, vous pouvez lancer la détection sur une image :
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
La plupart du temps est passée à charger en mémoire les paramètres du modèle. La détection, quand à elle, n'a pris que 200 ms.
Mais cela semble quand même trop long. Si nous devions faire de la détection d'objets en temps réel à 24 images par seconde, nous devrions être beaucoup plus rapides.
Je suis en train d'essayer de voir si c'est normal, et j'éditerai cet article lorsque j'aurai trouvé. Peut-être que mes deux GeForce GTX 1080 Ti ne sont pas suffisantes, ou que darknet n'utilise que l'une des deux cartes.
Sur le CPU, la même détection prend 37s, donc je suis sûr que l'un des GPU au moins est utilisé.
Il y'a d'autres images dans le répertoire data/ de darknet. Vous pouvez les essayer.
Et bien sûr, vous pouvez essayer également avec vos propres images !
Dans cet article, vous avez appris à :
Très bientôt, nous verrons comment détecter des objets en temps réel dans une vidéo!
Je prépare aussi une petite série de tutos sur OpenCV. C'est un outil plus basique que darknet pour la vision par ordinateur, mais il a l'avantage de pouvoir être utilisé sur un raspberry pi.
N'hésitez pas à me donner votre avis dans les commentaires ! Je répondrai à toutes les questions.
Et si vous avez aimé cet article, vous pouvez souscrire à ma newsletter pour être prévenu lorsque j'en sortirai un nouveau. Pas plus d'un mail par semaine, promis!
Rejoignez ma mailing list pour plus de posts et du contenu exclusif: