RTMDet
RTMDet es un detector de una etapa que predice a partir de un único prior basado en puntos por posición de la rejilla, sin anchors, a través de una cabeza cuyas convoluciones se comparten entre niveles de características. LibreYOLO lo admite para detección y para segmentación de instancias con RTMDet-Ins.
- Tareas
- detection, instance segmentation
- Tamaños
- t, s, m, l, x at 640 px
- Instalación
pip install libreyolo- Nivel de compatibilidad
- Compatible, desde v. Modelos entrenables de apoyo: se mantienen operativos en CI y reciben funciones cuando surge la oportunidad.
- Licencias
- Código Apache-2.0, pesos Apache-2.0. Uso comercial
Instalación
RTMDet no necesita ningún extra más allá del paquete base.
pip install libreyoloPredicción
Los pesos se descargan de Hugging Face en el primer uso y se guardan en la caché local.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreRTMDets.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreRTMDets.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # El sufijo -seg en el nombre del archivo selecciona la cabeza de# máscaras de RTMDet-Ins, así que aquí no hace falta argumento task.model = LibreYOLO("LibreRTMDets-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)El objeto Results devuelto es el mismo que devuelven todas las familias, así
que cambiar a otro detector es un cambio de una línea. Un nombre de archivo con
-seg se resuelve por sí solo a la tarea RTMDet-Ins, y entonces result.masks
lleva las máscaras de instancia junto a los boxes. conf fija el umbral de
confianza e iou el umbral de NMS. Consulta predicción para
fuentes, streaming y manejo de resultados.
Variantes
Cinco tamaños, de t a x, comparten una misma arquitectura con una resolución
de entrada común. Esta familia no trae aquí ninguna tabla de benchmarks: compara
los tamaños por el tamaño de archivo de cada checkpoint en la tabla de abajo.
Entrenamiento
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.train( data="my-dataset.yaml", epochs=300, imgsz=640, batch=16, lr0=0.004,)libreyolo train model=LibreRTMDets.pt data=my-dataset.yaml imgsz=640 epochs=300 batch=16 lr0=0.004La detección se entrena con train(). Los componentes QualityFocalLoss, GIoU y
DynamicSoftLabelAssigner están portados del mmdetection original, y el forward
pass y la exportación a ONNX son bit a bit equivalentes a él, con un
postprocesado que coincide con la salida de mmdet dentro de 0,001 mAP en
subconjuntos de val2017.
Lo que no se ha comprobado, según el propio docstring de train(): la
convergencia del fine-tuning en datasets pequeños, la paridad con el paper
entrenando desde cero, el comportamiento multi-GPU, el rendimiento de Mosaic y
MixUp con caché, el cambio estricto al pipeline de dos etapas del original, y
los overrides de weight decay por parámetro que ponen a cero el decay en los
parámetros de norm y bias.
RTMDet-Ins no tiene ruta de entrenamiento. Llamar a train() sobre un
checkpoint -seg, o con task="segment", lanza NotImplementedError; la
segmentación de instancias solo admite inferencia y validación.
train() también acepta un argumento pretrained, pero el valor nunca se lee
dentro del método: el entrenamiento siempre continúa desde los pesos con los que
se construyó el modelo, así que pretrained=False no reinicializa la red.
Si no se toca nada más, el entrenador ejecuta 300 épocas con AdamW a
lr0=0.004 y weight_decay=0.05, un warmup de 1 época sobre un schedule
coseno, y Mosaic y MixUp desactivados durante las últimas 20 épocas.
Consulta entrenamiento para datasets, aumento de datos, multi-GPU y loggers.
Validación
val() devuelve un diccionario de claves metrics/ que cubren precisión,
recall, mAP 50 y mAP 50-95, medidas contra cualquier dataset en el formato con
el que entrenaste.
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreRTMDets.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # máscarasprint(metrics["metrics/mAP50-95(B)"]) # boxesSobre un checkpoint -seg, la clave metrics/mAP50-95 a secas contiene la
puntuación de las máscaras, y la misma ejecución informa además de los boxes
bajo (B) y de las máscaras bajo (M), de modo que ambos están disponibles en
una sola pasada.
Exportación
| Tarea | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: compatible | Detection to TorchScript: compatible | Detection to ExecuTorch: compatible | Detection to TensorRT: compatible | Detection to OpenVINO: compatible | Detection to Paddle: no compatible | Detection to MNN: no compatible | Detection to RKNN: no compatible | Detection to ncnn: no compatible | Detection to TFLite: no compatible | Detection to CoreML: no compatible | Detection to Core AI: compatible |
| Instance segmentation | Instance segmentation to ONNX: no compatible | Instance segmentation to TorchScript: no compatible | Instance segmentation to ExecuTorch: no compatible | Instance segmentation to TensorRT: no compatible | Instance segmentation to OpenVINO: no compatible | Instance segmentation to Paddle: no compatible | Instance segmentation to MNN: no compatible | Instance segmentation to RKNN: no compatible | Instance segmentation to ncnn: no compatible | Instance segmentation to TFLite: no compatible | Instance segmentation to CoreML: no compatible | Instance segmentation to Core AI: no compatible |
La detección exporta a la mayoría de formatos; la segmentación de instancias no
exporta ahora mismo a ninguno de ellos; la matriz de arriba refleja esa
división. Un artefacto de detección exportado se vuelve a cargar con
LibreYOLO() según la extensión del archivo, así que un archivo .onnx o
.engine se comporta como un checkpoint y devuelve el mismo Results. También
se admite ejecutar el grafo en un runtime pelado, sin LibreYOLO instalado, pero
entonces el preprocesado y el postprocesado corren de tu cuenta.
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreRTMDets.pt format=onnx imgsz=640libreyolo export model=LibreRTMDets.pt format=tensorrt imgsz=640 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # La factoría enruta según la extensión del archivo, así que un artefacto# exportado se carga como cualquier checkpoint y devuelve el mismo# objeto Results.model = LibreYOLO("LibreRTMDets.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Todos los archivos de pesos publicados de esta familia.
| Archivo | Entrada (px) | Licencia de los pesos |
|---|---|---|
| Detection | ||
| LibreRTMDett.pt | 640 | apache-2.0 |
| LibreRTMDets.pt | 640 | apache-2.0 |
| LibreRTMDetm.pt | 640 | apache-2.0 |
| LibreRTMDetl.pt | 640 | apache-2.0 |
| LibreRTMDetx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreRTMDett-seg.pt | 640 | apache-2.0 |
| LibreRTMDets-seg.pt | 640 | apache-2.0 |
| LibreRTMDetm-seg.pt | 640 | apache-2.0 |
| LibreRTMDetl-seg.pt | 640 | apache-2.0 |
| LibreRTMDetx-seg.pt | 640 | apache-2.0 |
Todos los archivos anteriores existen hoy en la organización de LibreYOLO y se descargan la primera vez que se usan.
Licencia
Comprueba la licencia en el repositorio de Hugging Face de los pesos concretos que descargues. Cada checkpoint de la organización de LibreYOLO incluye una, y no siempre es la misma en toda una familia. Ese repositorio es la fuente autorizada; el resumen siguiente describe qué se aplicaba cuando se verificó esta página por última vez.
Esta es una descripción de las licencias implicadas, no asesoramiento legal. Si la respuesta es importante a nivel comercial, lee las licencias y busca tu propio asesoramiento.
- Trabajo original
- RTMDet, OpenMMLab
- Licencia del proyecto original
- Apache-2.0
- Fuente del proyecto original
- github.com/open-mmlab/mmdetection
- Código de LibreYOLO
- MIT
- Pesos
- Apache-2.0, republicados en huggingface.co/LibreYOLO
- Interpretación
- Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code, and weights you train yourself on your own data are yours. The published RTMDet and RTMDet-Ins checkpoints are converted from mmdetection's own COCO weights, trained by OpenMMLab under the same license.
Cita
@misc{lyu2022rtmdet,
title={RTMDet: An Empirical Study of Designing Real-Time Object Detectors},
author={Chengqi Lyu and Wenwei Zhang and Haian Huang and Yue Zhou and Yudong Wang and Yanyi Liu and Shilong Zhang and Kai Chen},
year={2022},
eprint={2212.07784},
archivePrefix={arXiv},
primaryClass={cs.CV}
}Copiado del bloque de cita de los autores en github.com/open-mmlab/mmdetection/tree/main/configs/rtmdet#citation.