facebook/detr-resnet-101
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