detr-resnet-101-fixed
Modelo DETR (DEtection TRansformer) entrenado de principio a fin en la detección de objetos de COCO 2017 (118k imágenes anotadas). Fue presentado en el artículo End-to-End Object Detection with Transformers por Carion et al. y lanzado por primera vez en este repositorio. El modelo DETR es un transformador encoder-decoder con una base convolucional. Dos cabeceras se añaden sobre las salidas del decodificador para realizar la detección de objetos: una capa lineal para las etiquetas de clase y un MLP (multi-layer perceptron) para los cuadros delimitadores. El modelo utiliza las llamadas 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 bipartita': se comparan las clases y cuadros delimitadores predichos de cada una de las N = 100 consultas de objetos con las anotaciones de referencia, rellenadas hasta la misma longitud N. El algoritmo de emparejamiento húngaro se utiliza 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 la pérdida IoU generalizada para los cuadros delimitadores para optimizar los parámetros del modelo.
Como usar
Aquí está cómo usar este modelo:
from transformers import DetrFeatureExtractor, 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)
feature_extractor = DetrFeatureExtractor.from_pretrained('facebook/detr-resnet-101')
model = DetrForObjectDetection.from_pretrained('facebook/detr-resnet-101')
inputs = feature_extractor(images=image, return_tensors='pt')
outputs = model(**inputs)
# convertir salidas (cuadros delimitadores y logits de clase) a API COCO
target_sizes = torch.tensor([image.size[::-1]])
results = feature_extractor.post_process(outputs, target_sizes=target_sizes)[0]
for score, label, box in zip(results['scores'], results['labels'], results['boxes']):
box = [round(i, 2) for i in box.tolist()]
# solo mantenemos detecciones con puntuación > 0.9
if score > 0.9:
print(f'Detected {model.config.id2label[label.item()]} with confidence {round(score.item(), 3)} at location {box}')
Esto debería mostrar algo como:
Detected cat with confidence 0.998 at location [344.06, 24.85, 640.34, 373.74]
Detected remote with confidence 0.997 at location [328.13, 75.93, 372.81, 187.66]
Detected remote with confidence 0.997 at location [39.34, 70.13, 175.56, 118.78]
Detected cat with confidence 0.998 at location [15.36, 51.75, 316.89, 471.16]
Detected couch with confidence 0.995 at location [-0.19, 0.71, 639.73, 474.17]
Funcionalidades
- Modelo DETR con base ResNet-101
- Transformador encoder-decoder
- Detección de objetos
- Entrenado en COCO 2017
- Capa lineal para etiquetas de clase
- MLP para cuadros delimitadores
- Consultas de objetos
Casos de uso
- Detección de objetos en imágenes.