RT-DETR

PekingU
Detección de objetos

La serie YOLO se ha convertido en el marco más popular para la detección de objetos en tiempo real debido a su equilibrio razonable entre velocidad y precisión. Sin embargo, observamos que la velocidad y precisión de los YOLO se ven negativamente afectados por el NMS. Recientemente, los detectores basados en transformadores de extremo a extremo (DETR) han proporcionado una alternativa para eliminar el NMS. No obstante, el alto costo computacional limita su practicidad. En este trabajo, proponemos el RT-DETR (Real-Time DEtection TRansformer), el primer detector de objetos en tiempo real de extremo a extremo que aborda este dilema. Construimos el RT-DETR en dos pasos: primero nos enfocamos en mantener la precisión mejorando la velocidad, seguido de mantener la velocidad mejorando la precisión. Diseñamos un codificador híbrido eficiente para procesar rápidamente características de múltiples escalas al desacoplar la interacción intraescala y la fusión cruzada de escala para mejorar la velocidad. Luego, proponemos la selección de consultas con mínima incertidumbre para proporcionar consultas iniciales de alta calidad al decodificador, mejorando así la precisión. Además, el RT-DETR soporta ajustes flexibles de velocidad mediante el ajuste del número de capas del decodificador para adaptarse a varios escenarios sin necesidad de reentrenamiento. Nuestro RT-DETR-R50 / R101 logra un 53.1% / 54.3% AP en COCO y 108 / 74 FPS en GPU T4, superando a los YOLO avanzados en velocidad y precisión.

Como usar

Usa el siguiente código para comenzar a usar el modelo:

import torch
import requests

from PIL import Image
from transformers import RTDetrForObjectDetection, RTDetrImageProcessor

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

image_processor = RTDetrImageProcessor.from_pretrained('PekingU/rtdetr_r101vd')
model = RTDetrForObjectDetection.from_pretrained('PekingU/rtdetr_r101vd')

inputs = image_processor(images=image, return_tensors='pt')

with torch.no_grad():
   outputs = model(**inputs)

results = image_processor.post_process_object_detection(outputs, target_sizes=torch.tensor([image.size[::-1]]), threshold=0.3)

for result in results:
    for score, label_id, box in zip(result['scores'], result['labels'], result['boxes']):
        score, label = score.item(), label_id.item()
        box = [round(i, 2) for i in box.tolist()]
        print(f'{model.config.id2label[label]}: {score:.2f} {box}')

Esto debería obtener la salida:

sofa: 0.97 [0.14, 0.38, 640.13, 476.21]
gato: 0.96 [343.38, 24.28, 640.14, 371.5]
gato: 0.96 [13.23, 54.18, 318.98, 472.22]
control remoto: 0.95 [40.11, 73.44, 175.96, 118.48]
control remoto: 0.92 [333.73, 76.58, 369.97, 186.99]

Funcionalidades

Codificador híbrido eficiente
Selección de consultas con mínima incertidumbre
Ajustes flexibles de velocidad
Supera a YOLO en velocidad y precisión

Casos de uso

Detección de objetos en tiempo real
Aplicaciones donde la velocidad y precisión son esenciales
Escenarios donde la flexibilidad y adaptabilidad del modelo son importantes