An introduction to deep learning
Jeremy Fix
November 13, 2024
Slides made with slidemakerÉtant donnés :
Exemples d’ImageNet (voir ici)
Boîtes englobantes données, dans les ensembles de données (la paramétrisation du prédicteur peut différer), par : \([x, y, w, h]\), \([x_{min},y_{min},x_{max},y_{max}]\), …
Ensembles de données : Coco, ImageNet, Open Images Dataset
Revue récente : (Zou, Chen, Shi, Guo, & Ye, 2023) , (Terven, Córdova-Esparza, & Romero-González, 2023)
Cette tâche étant définie, les questions à aborder sont :
Les métriques devraient idéalement capturer :
Étant donné les boîtes englobantes “vraies” :
Quantifier la qualité de ces prédictions
Un prédicteur devrait produire des boîtes englobantes étiquetées avec un score de confiance. Ils en produisent beaucoup.
Votre métrique devrait évaluer la fraction de boîtes englobantes que vous détectez correctement (TP) et la fraction de boîtes englobantes que vous détectez incorrectement (FP) ou manquez incorrectement (FN).
Pour chaque classe individuellement, chaque prédiction (qui a une confiance suffisamment élevée assignée par votre prédicteur) de chaque image est considérée comme :
Les boîtes de VT qui ne sont pas prédites sont des Faux Négatifs (FN).
Exemples du dépôt de métriques de détection d’objets.
\[ \mbox{précision} = \frac{TP}{TP+FP} \] Quelle fraction de vos détections sont réellement correctes.
\[ \mbox{rappel} = \frac{TP}{TP+FN} = \frac{TP}{\#\mbox{boîtes englobantes vt}} \] Quelle fraction d’objets étiquetés détectez-vous (ne peut qu’augmenter avec la diminution de la confiance)
Si vous abaissez votre seuil de confiance, votre précision peut soit augmenter soit diminuer, votre rappel peut soit stagner soit augmenter.
AP est la précision moyenne pour différents niveaux de rappel. mAP est la moyenne de AP pour toutes les classes/catégories. Dépend d’un IOU spécifique pour définir TP/FP. Pascal utilise mAP@0.5 tandis que COCO fait la moyenne de map@0.5-0.95.
Exemples du dépôt de métriques de détection d’objets.
Propositions précoces (2016) :
\[\begin{align*} \mathcal{L} &= \lambda_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B} \mathbb{1}_{ij}^{obj} [(t_x-t_x^*)^2+(t_y-t_y^*)^2+(t_w-t_w^*)^2+(t_h-t_h^*)^2] \\ & -\sum_{i=0}^{S^2} \sum_{j=0}^{B} BCE(\mathbb{1}_{ij}^{obj}, \mbox{has_obj}_{ij}) \\ & -\sum_{i=0}^{S^2} \sum_{j=0}^{B} \sum_{k=0}^{K} BCE(\mbox{has_class}_{ijk}, p_{ijk}) \end{align*}\]
Les prédicteurs denses (par exemple Yolo) prédisent beaucoup de boîtes englobantes, beaucoup de négatifs qui submergent les positifs
\[\begin{align*} p\in[0,1], y \in \{0, 1\}, BCE(p, y) &= -y \log(p) -(1-y) \log(1-p)\\ FL(p, y) &= -y (1-p)^\gamma \log(p) - (1-y)p^\gamma \log(1-p) \end{align*}\]
De plus, la métrique des boîtes englobantes est généralement l’IOU mais la perte était L2.
L’augmentation de données aide à régulariser votre réseau : ce sont des transformations que vous appliquez sur les entrées pour lesquelles vous pouvez calculer l’effet sur la cible.
Des bibliothèques telles que albumentations/torchvision aident grandement à l’appliquer (voir aussi cette liste dans albumentations).
Avec albumentations :
import albumentations as A
import albumentations.pytorch
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomRotate90(p=0.5),
A.MaskDropout((1, 1), image_fill_value=255, p=1),
A.Blur(),
A.RandomBrightnessContrast(p=0.2),
A.RandomBrightnessContrast(p=0.2),
A.pytorch.ToTensorV2()
], bbox_params=A.BBoxParams(format='coco'))
transformed = transform(images=images, bboxes=bboxes)
Avec torchvision.transforms.v2 :
from torchvision.transforms import v2
transforms = v2.Compose(
[
v2.ToImage(),
v2.RandomPhotometricDistort(p=1),
v2.RandomZoomOut(fill={tv_tensors.Image: (123, 117, 104), "others": 0}),
v2.RandomIoUCrop(),
v2.RandomHorizontalFlip(p=1),
v2.SanitizeBoundingBoxes(),
v2.ToDtype(torch.float32, scale=True),
]
)
target = {
"boxes": boxes,
"labels": torch.arange(boxes.shape[0]),
"this_is_ignored": ("arbitrary", {"structure": "!"})
}
out_img, out_target = transforms(images, targets)
Mosaic Augmentation, MixUp, ….
Votre prédicteur produira beaucoup de boîtes englobantes. Plusieurs pourraient se chevaucher.
La suppression des non-maximums (NMS) supprime les boîtes avec des scores plus bas qui se chevauchent (IOU) avec d’autres boîtes ayant des scores plus élevés.
Supposons que vous ayez un seul objet à détecter, pouvez-vous le localiser dans l’image ?
Comme examiné dans [Zhou et al, 2023] :
Comment pouvons-nous procéder avec plusieurs objets ? (Ross Girshick, Donahue, Darrell, & Malik, 2014) a proposé de :
Révolution dans la communauté de détection d’objets (vs caractéristiques “traditionnelles” de type HOG).
Inconvénient :
Notes : pré-entraîné sur ImageNet, affiné sur les classes considérées avec des images déformées. Extraction de négatifs difficiles (boosting).
Introduit dans (R. Girshick, 2015). Idée :
Inconvénients :
Dépôt Github. Diapositives CVPR’15
Notes : VGG16 pré-entraîné sur ImageNet. Entraînement rapide avec plusieurs ROI par image pour construire le mini-lot de \(128\) à partir de \(N=2\) images, en utilisant \(64\) propositions : \(25\%\) avec IoU>0.5 et \(75\%\) avec \(IoU \in [0.1, 0.5[\). Augmentation des données : flip horizontal. Taux d’apprentissage par couche, SGD avec momentum, etc.
Perte multi-tâches : \[ L(p, u, t, v) = -\log(p_u) + \lambda \mbox{smooth L1}(t, v) \]
La boîte englobante est paramétrée comme dans (Ross Girshick et al., 2014). L’échelle unique est plus efficace que l’échelle multiple.
Introduit dans (Ren, He, Girshick, & Sun, 2016). Le premier réseau entraînable de bout en bout. Introduction du Réseau de Proposition de Régions (RPN). Un RPN est un réseau Conv(\(3\times3\)) - Conv(\(1\times1\), k + 4k) glissant (voir ici). Il introduit également des boîtes d’ancrage de ratios d’aspect prédéfinis appris par quantification vectorielle.
Vérifiez le papier pour beaucoup de résultats quantitatifs. Les petits objets peuvent ne pas avoir beaucoup de caractéristiques.
Paramétrage de la boîte englobante identique à (Ross Girshick et al., 2014), avec perte L1 lisse. Perte multi-tâches pour le RPN. Momentum (0.9), décroissance des poids (0.0005), taux d’apprentissage (0.001) pour 60k mini-lots, 0.0001 pour 20k.
Entraînement en plusieurs étapes. Le gradient n’est pas trivial en raison de l’alignement des coordonnées des boîtes (voir ROI align pour une version plus continue)
Avec VGG-16, la couche conv5 est \(H/16,W/16\). Pour une image \(1000 \times 600\), il y a \(60 \times 40 = 2400\) centres de boîtes d’ancrage.
En pratique, torchvision fournit des modèles pré-entraînés pour la détection d’objets, par exemple des modèles Faster RCNN.
Les réseaux de pyramides de caractéristiques (FPN) (Lin et al., 2017) ont introduit un chemin descendant pour propager la sémantique jusqu’aux premières couches,
L’agrégation du chemin ascendant ajoute des raccourcis pour propager des frontières d’objets précises aux couches supérieures (Liu, Qi, Qin, Shi, & Jia, 2018)
(Liu et al., 2018) a également introduit le Pooling de Caractéristiques Adaptatif plutôt qu’une attribution arbitraire des propositions à un niveau de la pyramide comme dans (Lin et al., 2017).
Le premier détecteur en une étape. Introduit dans (Redmon, Divvala, Girshick, & Farhadi, 2016). Il produit :
Encodage de la boîte englobante :
Dans YoLo v3, le réseau est de type Réseau de Pyramide de Caractéristiques (FPN) avec un chemin de sous-échantillonnage et de sur-échantillonnage, avec des prédictions à 3 étapes.
La perte est multi-tâches avec :
\[\begin{align*} \mathcal{L} &= \lambda_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B} \mathbb{1}_{ij}^{obj} [(t_x-t_x^*)^2+(t_y-t_y^*)^2+(t_w-t_w^*)^2+(t_h-t_h^*)^2] \\ & -\sum_{i=0}^{S^2} \sum_{j=0}^{B} BCE(\mathbb{1}_{ij}^{obj}, \mbox{has_obj}_{ij}) \\ & -\sum_{i=0}^{S^2} \sum_{j=0}^{B} \sum_{k=0}^{K} BCE(\mbox{has_class}_{ijk}, p_{ijk}) \end{align*}\]
Dans v1 et v2, les pertes de prédiction étaient des pertes L2.
L’étiquetage multiple peut se produire dans coco (par exemple, femmes, personne), d’où le BCE pour les classes
À partir de Yolov4, plusieurs auteurs publient des versions de Yolo…, voir (Terven et al., 2023)
Yolov4 (2020), YoloR (2021), Yolov7 (2022) : CSPResNet (DenseNet économique), sac de freebies (Mosaïque, CutMix, Recuit Cosinus), sac de spécials
YoloX (2021) par Megvii basé sur Yolo v3 : Sans ancre, têtes découplées
Yolov5 (2020), Yolov8 (2023), Yolov11(2024) par Ultralytics
Voir aussi cette page
Exemple avec ultralytics Yolov11, sorti en 09/2024, soit en CLI soit en python/Pytorch :
from ultralytics import YOLO
# Charger un modèle
model = YOLO("yolo11n.pt")
# Entraîner le modèle
train_results = model.train(
data="coco8.yaml", # chemin vers le YAML du dataset
epochs=100, # nombre d'époques d'entraînement
imgsz=640, # taille de l'image d'entraînement
device="cpu", # appareil sur lequel exécuter, c'est-à-dire device=0 ou device=0,1,2,3 ou device=cpu
)
# Évaluer les performances du modèle sur l'ensemble de validation
metrics = model.val()
# Effectuer une détection d'objets sur une image
results = model("chemin/vers/image.jpg")
results[0].show()
# Exporter le modèle au format ONNX
path = model.export(format="onnx") # renvoie le chemin vers le modèle exporté
avec coco.yaml (format coco \(x_{min}, y_{min}, largeur, hauteur\))
Les boîtes englobantes n’ont pas besoin d’être alignées sur les axes et peuvent être des boîtes englobantes orientées (OBB).
Ce modèle prend maintenant en charge également la segmentation, le suivi d’objets, l’estimation de pose.
Tâche : détecter des bactéries, dans un flux, adhérant aux parois (en collaboration avec L. Klopffer, N. Louvet, S. Becker)
Utilisation d’ultralytics et de leurs callbacks wandb 😍 ; SAHI (pour l’inférence en tuiles). 😍
Code sur https://github.com/S1m0nB3ck3r/bacteria_tracker_yoloV8. Publication en cours d’examen.
Tâche : détecter des bactéries, dans un flux, adhérant aux parois (en collaboration avec L. Klopffer, N. Louvet, S. Becker)
Utilisation d’ultralytics et de leurs callbacks wandb 😍 ; SAHI (pour l’inférence en tuiles). 😍
Code sur https://github.com/S1m0nB3ck3r/bacteria_tracker_yoloV8. Publication en cours d’examen.
Étant donné une image,
Segmentation sémantique : prédire la classe de chaque pixel individuel. On parle aussi de prédiction dense/étiquetage dense.
Image d’exemple de MS Coco
Segmentation d’instance : classifier tous les pixels appartenant aux mêmes objets dénombrables
Image d’exemple de MS Coco
Plus récemment, la segmentation panoptique fait référence à la segmentation d’instance pour les objets dénombrables (par exemple, personnes, animaux, outils) et à la segmentation sémantique pour les régions amorphes (herbe, ciel, route).
Métriques : voir Évaluation panoptique Coco
Quelques exemples de réseaux : PSP-Net, U-Net, Dilated Net, ParseNet, DeepLab, Mask RCNN, …
Introduit dans (Ciresan, Giusti, Gambardella, & Schmidhuber, 2012).
Inconvénients :
(sur la calibration des réseaux de neurones profonds, voir aussi (Guo, Pleiss, Sun, & Weinberger, 2017))
Introduit dans (Long, Shelhamer, & Darrell, 2015). Premier réseau convolutif de bout en bout pour l’étiquetage dense avec des réseaux pré-entraînés.
Le sur-échantillonnage peut être :
Les approches traditionnelles impliquent une interpolation bilinéaire, bicubique, etc…
Pour le sur-échantillonnage de manière apprenante, nous pouvons utiliser une convolution à pas fractionnaire. C’est l’un des ingrédients derrière la Super-Résolution (Shi, Caballero, Huszár, et al., 2016).
Vous pouvez initialiser les noyaux de sur-échantillonnage avec un noyau d’interpolation bilinéaire. Pour avoir d’autres équivalences, voir (Shi, Caballero, Theis, et al., 2016). Voir ConvTranspose2d.
Cela peut introduire des artefacts, vérifiez (Odena, Dumoulin, & Olah, 2016). Certains préfèrent un sur-échantillonnage bilinéaire, suivi de convolutions.
Plusieurs modèles suivant les mêmes architectures : SegNet (somme), U-Net (concaténation). Architecture Encodeur-Décodeur introduite dans (Ronneberger, Fischer, & Brox, 2015)
Il y a :
Pour rassembler des informations contextuelles en élargissant les champs réceptifs, DeepLab emploie des convolutions “à trous” (dilatées) plutôt que du max pooling. DeepLabV1 (Chen, 2014), DeepLabV2 (Chen, Papandreou, Kokkinos, Murphy, & Yuille, 2017), DeepLabV3 (Chen, Papandreou, Schroff, & Adam, 2017), DeepLabV3+ (Chen, Zhu, Papandreou, Schroff, & Adam, 2018).
Avec torchvision
Torchvision (v2) et albumentations prennent tous deux en charge l’augmentation sur les masques. Voir albumentations pour un exemple.
Tâche Segmenter les matières non vivantes vs les organismes vivants dans les images ZooScan.
Tâche Segmenter les matières non vivantes vs les organismes vivants dans les images ZooScan.
Inférence sur un nouvel échantillon avec une inférence en tuiles. Nous aurions pu utiliser une inférence moyennée avec des tuiles chevauchantes.
Masque produit avec un seuil@0.5 qui peut être sous-optimal.
Introduit dans (He, Gkioxari, Dollár, & Girshick, 2018) comme une extension de Faster RCNN. Il produit un masque binaire en plus des étiquettes de classe + régressions de boîtes englobantes.
Il traite la segmentation d’instance en prédisant un masque pour des propositions d’objets individualisés.
Propose d’utiliser ROI-Align (avec interpolation bilinéaire) plutôt que ROI-Pool.
Il n’y a pas de compétition entre les classes dans les masques. Différents objets peuvent utiliser différents noyaux pour calculer leurs masques.
Peut être étendu à la détection de points-clés, produisant un masque de profondeur \(K\) pour prédire les \(K\) articulations.
Ultralytics Yolo segment adopte la même stratégie de prédiction d’un masque pour chaque boîte englobante.
from ultralytics import YOLO
# Charger un modèle
model = YOLO("yolo11n-seg.pt")
# Entraîner le modèle
train_results = model.train(data="coco8-seg.yaml", epochs=100, imgsz=640)
results = model("monimage.jpg") # prédire sur une image
Démo en direct avec https://github.com/jeremyfix/deeplearning_demos et https://github.com/jeremyfix/onnx_models.
Introduits dans (Vaswani et al., 2017), du TAL à la Vision par ViT (Dosovitskiy et al., 2021).
Propositions récentes pour :
En pratique, huggingface transformers implémente DETR. Regardez le papier, ce ne sont que quelques lignes de pytorch.