[PYTHON] [Zusammenfassung] Objekterkennungsmodell "End-to-End-Objekterkennung mit Transformatoren" mit Transformer

Einführung

Ich war neugierig auf "End-to-End-Objekterkennung mit Transformatoren" (DETR), also las ich die Zeitung und überprüfte die Funktionsweise ein wenig. Führen Sie eine kurze Aufzeichnung. [Paper, Github ]]

Was ist DETR (Zusammenfassung)

・ Modell veröffentlicht von Facebook AI Research im Mai dieses Jahres

・ Erste Verwendung von Transformer, das auf dem Gebiet der Verarbeitung natürlicher Sprache bekannt ist, zur Objekterkennung

-Einfache Netzwerkkonfiguration von CNN + Transformer wie in der folgenden Abbildung gezeigt

・ Bestehen Sie auf den Effekten von "Bipartite Matching Loss" und "Parallel Decoding" als Punkte, um das oben genannte zu erreichen.

・ Gilt nicht nur für die Objekterkennung, sondern auch für Segmentierungsaufgaben

detr_flow.png

Beispiel für einen Inferenzcode

Ich werde den Code aus dem Papier zitieren. Wie unten gezeigt, können Sie einfach in etwa 40 Zeilen von der Modelldefinition bis zur Inferenzverarbeitung schreiben.

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)

Funktionsprüfung

Ich habe den Betrieb tatsächlich mit dem trainierten Modell überprüft. Die Umgebung ist wie folgt. ・ Betriebssystem: Ubuntu 18.04.4 LTS ・ GPU: GeForce RTX 2060 SUPER (8 GB) x1 ・ PyTorch 1.5.1 / Torchvision 0.6.0

Für die Implementierung des Erkennungsprozesses haben wir auf die ursprüngliche Datei detr_demo.ipynb verwiesen und das mit OpenCV von der Webkamera aufgenommene Bild erkannt. Das verwendete Modell ist ein ResNet-50-basiertes DETR.

Das Folgende ist das tatsächliche Erkennungsergebnis. Es wurde bestätigt, dass die Erkennung normal ausgeführt wurde. (Obwohl Dinge, die nicht in der COCO-Klasse enthalten sind, auch zum Schießen bestimmt sind) frame_290.jpg

In meiner Umgebung schien die Inferenzverarbeitung selbst in ungefähr 45 ms (ungefähr 22 FPS) zu laufen.

Ende

Ich habe DETR studiert und seine Funktionsweise überprüft. Da es sich um eine neue Art von Methode handelt, denke ich, dass sie sich in Bezug auf Genauigkeit und Geschwindigkeit weiterentwickeln wird. Transformer hatte das Image, sich der Verarbeitung natürlicher Sprache zu widmen, wurde jedoch kürzlich in Modelle eingeführt, die mit Bildern umgehen. Ich würde gerne in Zukunft mehr studieren. (Ich möchte auch Image GPT ausführen.)

Referenz

・ Objekterkennungsdebüt des Transformators "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 ・ Erläuterung der End-to-End-Objekterkennung mit Transformatoren (DETR) https://qiita.com/sasgawy/items/61fb64d848df9f6b53d1 -Adopt Transformer zur Objekterkennung! Detaillierte Erläuterung zum Thema DETR! https://deepsquare.jp/2020/07/detr/

Recommended Posts

[Zusammenfassung] Objekterkennungsmodell "End-to-End-Objekterkennung mit Transformatoren" mit Transformer
Logoerkennung mit der TensorFlow-Objekterkennungs-API
[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
Katzenerkennung mit OpenCV (Modellverteilung)
So erstellen Sie mit YOLO in 3 Stunden ein Modell für die Objekterkennung
Objekterkennung mit Jetson Nano (YOLOv3) - (1) Jetson Nano-Einstellungen-
Versuchen Sie die Objekterkennung mit Raspberry Pi 4 + Coral
Verwenden von MLflow mit Databricks ③ - Modelllebenszyklusmanagement -
Kochobjekterkennung durch Yolo + Bildklassifizierung
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Versuchen wir die Echtzeit-Objekterkennung mit Faster R-CNN