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 ]
・ 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
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)
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)
Dans mon environnement, le traitement d'inférence lui-même semblait fonctionner en environ 45 msec (environ 22 FPS).
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.)
・ 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