facebook/detr-resnet-101

facebook
Detección de objetos

Modelo DETR (DEtection TRansformer) entrenado de extremo a extremo en detección de objetos COCO 2017 (118k imágenes anotadas). Se presentó en el artículo 'Detección de objetos de extremo a extremo con transformadores' por Carion et al. y fue liberado por primera vez en este repositorio. El modelo DETR es un transformador codificador-decodificador con una red convolucional. Se agregan dos capas en la parte superior de las salidas del decodificador para realizar la detección de objetos: una capa lineal para las etiquetas de clase y una MLP (perceptrón multicapa) para las cajas delimitadoras. El modelo utiliza consultas de objetos para detectar objetos en una imagen. Cada consulta de objeto busca un objeto particular en la imagen. Para COCO, el número de consultas de objetos se establece en 100. El modelo se entrena utilizando una 'pérdida de emparejamiento bipartito': se comparan las clases predichas y las cajas delimitadoras de cada una de las N = 100 consultas de objetos con las anotaciones de verdad base, rellenas hasta la misma longitud N. Después, se usa el algoritmo de emparejamiento húngaro para crear un mapeo óptimo uno-a-uno entre cada una de las N consultas y cada una de las N anotaciones. Luego, se usan la entropía cruzada estándar (para las clases) y una combinación lineal de la pérdida L1 y IoU generalizada (para las cajas delimitadoras) para optimizar los parámetros del modelo.

Como usar

from transformers import DetrImageProcessor, DetrForObjectDetection
import torch
from PIL import Image
import requests

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

# puedes especificar la etiqueta de revisión si no deseas la dependencia de timm
processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-101", revision="no_timm")
model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-101", revision="no_timm")

inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)

# convertir las salidas (cajas delimitadoras y puntuaciones de clase) a API COCO
# sólo mantener las detecciones con puntuación > 0.9
target_sizes = torch.tensor([image.size[::-1]])
results = processor.post_process_object_detection(outputs, target_sizes=target_sizes, threshold=0.9)[0]

for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Detectado {model.config.id2label[label.item()]} con confianza "
        f"{round(score.item(), 3)} en la ubicación {box}")

Debería imprimir (algo similar a):

Detectado gato con confianza 0.998 en la ubicación [344.06, 24.85, 640.34, 373.74]
Detectado control remoto con confianza 0.997 en la ubicación [328.13, 75.93, 372.81, 187.66]
Detectado control remoto con confianza 0.997 en la ubicación [39.34, 70.13, 175.56, 118.78]
Detectado gato con confianza 0.998 en la ubicación [15.36, 51.75, 316.89, 471.16]
Detectado sofá con confianza 0.995 en la ubicación [-0.19, 0.71, 639.73, 474.17]

Funcionalidades

Modelo basado en transformadores
Detección de objetos con consultas de objetos
Entrenado en COCO 2017
Algoritmo de emparejamiento húngaro
Entropía cruzada para las clases
Pérdida L1 y IoU generalizada para las cajas delimitadoras
Soporte para PyTorch

Casos de uso

Detección de objetos en imágenes