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 ]]
・ 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
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)
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)
In meiner Umgebung schien die Inferenzverarbeitung selbst in ungefähr 45 ms (ungefähr 22 FPS) zu laufen.
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.)
・ 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