[PYTHON] [Résumé] Modèle de détection d'objets utilisant Transformer "Détection d'objets de bout en bout avec des transformateurs"

introduction

J'étais curieux de savoir "Détection d'objets de bout en bout avec des transformateurs" (DETR), alors j'ai lu le papier et vérifié un peu le fonctionnement. Gardez un bref enregistrement. [Papier, Github ]

Qu'est-ce que DETR (résumé)

・ Modèle publié par Facebook AI Research en mai de cette année

・ Première utilisation de Transformer, célèbre dans le domaine du traitement du langage naturel, pour la détection d'objets

-Configuration réseau simple de CNN + Transformer comme indiqué dans la figure ci-dessous

-Achie la détection d'objet "de bout en bout" en éliminant les pièces qui nécessitent un ajustement manuel, telles que les valeurs par défaut de NMS et AnchorBox.

・ Insistez sur les effets de "Bipartite Matching Loss" et "Parallel Decoding" comme points pour réaliser ce qui précède.

・ Applicable non seulement à la détection d'objets mais également aux tâches de segmentation

detr_flow.png

Exemple de code d'inférence

Je vais citer le code du journal. Comme indiqué ci-dessous, le processus de la définition du modèle au traitement de l'inférence peut être écrit simplement en environ 40 lignes.

import torch
from torch import nn
from torchvision.models import resnet50

class DETR(nn.Module):

    def __init__(self, num_classes, hidden_dim, nheads,
                 num_encoder_layers, num_decoder_layers):
        super().__init__()
        # We take only convolutional layers from ResNet-50 model
        self.backbone = nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])
        self.conv = nn.Conv2d(2048, hidden_dim, 1)
        self.transformer = nn.Transformer(hidden_dim, nheads,
                                          num_encoder_layers, num_decoder_layers)
        self.linear_class = nn.Linear(hidden_dim, num_classes + 1)
        self.linear_bbox = nn.Linear(hidden_dim, 4)
        self.query_pos = nn.Parameter(torch.rand(100, hidden_dim))
        self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))
        self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))

    def forward(self, inputs):
        x = self.backbone(inputs)
        h = self.conv(x)
        H, W = h.shape[-2:]
        pos = torch.cat([
            self.col_embed[:W].unsqueeze(0).repeat(H, 1, 1),
            self.row_embed[:H].unsqueeze(1).repeat(1, W, 1),
        ], dim=-1).flatten(0, 1).unsqueeze(1)
        h = self.transformer(pos + h.flatten(2).permute(2, 0, 1),
                             self.query_pos.unsqueeze(1))
        return self.linear_class(h), self.linear_bbox(h).sigmoid()

detr = DETR(num_classes=91, hidden_dim=256, nheads=8,
            num_encoder_layers=6, num_decoder_layers=6)
detr.eval()
inputs = torch.randn(1, 3, 800, 1200)
logits, bboxes = detr(inputs)

Contrôle de fonctionnement

J'ai en fait vérifié l'opération en utilisant le modèle entraîné. L'environnement est le suivant. ・ Système d'exploitation: Ubuntu 18.04.4 LTS ・ GPU: GeForce RTX 2060 SUPER (8 Go) x1 ・ PyTorch 1.5.1 / Torchvision 0.6.0

Pour la mise en œuvre du processus de détection, nous nous sommes référés à l'original detr_demo.ipynb et avons détecté l'image capturée à partir de la webcam avec OpenCV. Le modèle utilisé est un DETR basé sur ResNet-50.

Voici le résultat réel de la détection. Il a été confirmé que la détection était exécutée normalement. (Bien que les choses qui ne sont pas incluses dans la classe COCO soient également ciblées pour la prise de vue) frame_290.jpg

Dans mon environnement, le traitement d'inférence lui-même semblait fonctionner en environ 45 msec (environ 22 FPS).

fin

J'ai étudié DETR et confirmé son fonctionnement. Puisqu'il s'agit d'un nouveau type de méthode, je pense qu'il se développera davantage en termes de précision et de rapidité. Transformer avait l'image d'être dédié au traitement du langage naturel, mais il a récemment été introduit dans des modèles qui traitent des images. J'aimerais étudier davantage à l'avenir. (Je souhaite également exécuter Image GPT.)

référence

・ Début de la détection d'objets du transformateur "DETR" https://medium.com/lsc-psd/detr-transformer%E3%81%AE%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA%E3%83%87%E3%83%93%E3%83%A5%E3%83%BC-dc18e582dec1 ・ Explication de la détection d'objets de bout en bout avec des transformateurs (DETR) https://qiita.com/sasgawy/items/61fb64d848df9f6b53d1 -Adoptez Transformer pour la détection d'objets! Explication détaillée du sujet DETR! https://deepsquare.jp/2020/07/detr/

Recommended Posts

[Résumé] Modèle de détection d'objets utilisant Transformer "Détection d'objets de bout en bout avec des transformateurs"
Détection de logo à l'aide de l'API de détection d'objets TensorFlow
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Détection de chat avec OpenCV (distribution de modèles)
Comment faire un modèle pour la détection d'objets avec YOLO en 3 heures
Détection d'objets à l'aide de Jetson Nano (YOLOv3) - (1) Paramètres Jetson Nano-
Essayez la détection d'objets avec Raspberry Pi 4 + Coral
Utilisation de MLflow avec Databricks ③ --Gestion du cycle de vie des modèles -
Détection d'objets de cuisson par classification d'images Yolo +
J'ai essayé la détection d'objets en utilisant Python et OpenCV
Essayons la détection d'objets en temps réel en utilisant Faster R-CNN