D-FINE
Un transformer de detección que reformula la regresión de cajas como una distribución de probabilidad sobre cada borde de la caja, refinada a lo largo de las capas del decoder. LibreYOLO lo soporta para detección y segmentación de instancias.
- Tareas
- detection, instance segmentation
- Tamaños
- n, s, m, l, x at 640 px
- Instalación
pip install libreyolo- Nivel de compatibilidad
- Núcleo, desde v1.1.0. Detectores entrenables del núcleo: las funciones siguen a los modelos emblemáticos en la misma oleada de versiones.
- Proyecto original
- D-FINE de University of Science and Technology of China, Apache-2.0. Artículo, fuente
- Licencias
- Código Apache-2.0, pesos Apache-2.0. Uso comercial
Instalación
D-FINE no necesita ningún extra opcional. Todos sus imports están cubiertos por la instalación base.
pip install libreyoloEl fine-tuning con adaptadores mediante lora=True es la excepción, y necesita
el extra lora.
pip install "libreyolo[lora]"Predicció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("LibreDFINEn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # El sufijo -seg del nombre de archivo selecciona la cabeza de máscaras,# así que aquí no hace falta el argumento task.model = LibreYOLO("LibreDFINEn-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 resuelve por sí solo a la tarea de segmentación, y entonces
result.masks lleva las máscaras de instancia junto a las cajas. conf y
max_det filtran la selección de queries; iou se acepta por paridad de API
pero no tiene efecto, porque el decoder es un predictor de conjuntos sin paso de
NMS. Consulta predicción para fuentes, streaming y manejo de
resultados.
Variantes
Cinco tamaños. Todos funcionan a la misma resolución de entrada, así que la tabla los separa por número de parámetros y precisión.
| Checkpoint | Entrada (px) | mAP 50-95 | Parámetros (M) |
|---|---|---|---|
| LibreDFINEl | 640 | 60.0 | 31.24 |
| LibreDFINEm | 640 | 57.8 | 19.59 |
| LibreDFINEn | 640 | 45.8 | 3.78 |
| LibreDFINEs | 640 | 53.4 | 10.32 |
| LibreDFINEx | 640 | 61.4 | 62.62 |
COCO val2017, 500 images. Medido con el sistema de benchmarks de LibreYOLO y publicado en Vision Analysis, donde se comparan la latencia entre distintos hardwares y runtimes y se conservan los registros completos de las ejecuciones.
La segmentación reutiliza el backbone, el encoder y el decoder de detección y
añade una cabeza de máscaras, así que un checkpoint -seg acepta los mismos
argumentos que su equivalente de detección. La familia RT-DETRv4 de LibreYOLO
está escrita como una subclase del wrapper de D-FINE: hereda esta línea de
decoder y luego fija su lista de tareas de vuelta a detección, porque no lleva
cabeza de máscaras.
Entrenamiento
El entrenamiento parte de un checkpoint publicado, para ambas tareas.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ epochs=50 imgsz=640 batch=8 lr0=2e-4# Continúa desde pesos de segmentación publicados, cabeza de máscaras incluida.libreyolo train model=LibreDFINEn-seg.pt data=my-dataset.yaml \ task=segment epochs=50 imgsz=640# Los pesos de detección no llevan cabeza de máscaras, así que esto es una# transferencia explícita: la cabeza empieza sin entrenar y solo sirve una# vez entrenada. Pedir task=segment aquí es lo que autoriza la transferencia.libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ task=segment epochs=50 imgsz=640from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ epochs=50 device=0,1 batch=16Si no se toca nada, el trainer ejecuta 132 épocas con lr0=2e-4 y amp=False,
un batch de 16 y early stopping tras 50 épocas sin mejora. Los pesos de
detección son un punto de partida válido para entrenar segmentación, pero solo
como transferencia explícita, ya que la cabeza de máscaras empieza sin entrenar
y de otro modo devolvería máscaras sin sentido. Pasar task=segment en el CLI
es lo que la autoriza. La vía de Python es más estrecha: hay que construir
LibreDFINE directamente con allow_detect_to_segment_transfer=True, porque la
factoría LibreYOLO() no acepta ese argumento, y la construcción directa no
descarga nada, así que el archivo de pesos ya tiene que estar en disco.
lora=True se aplica a detección. El entrenamiento de segmentación lo rechaza y
remite a freeze='backbone' en su lugar, porque la cabeza de máscaras no se ha
probado con adaptadores. En Apple silicon el trainer mueve toda la ejecución a
CPU: el backward pass del matmul por bins del Integral choca con un fallo de
compilación de Metal. La inferencia en MPS no se ve afectada.
Consulta entrenamiento para datasets, aumento de datos (data augmentation), multi-GPU y loggers.
Validación
val() devuelve un diccionario indexado por nombre de métrica, e imprime los
resultados por clase si verbose se deja activado.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreDFINEn.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # máscarasprint(metrics["metrics/mAP50-95(B)"]) # cajasContra un checkpoint -seg, la clave metrics/mAP50-95 a secas contiene la
puntuación de las máscaras, y la misma ejecución reporta además las cajas bajo
(B) y las máscaras bajo (M), así que ambas 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: no compatible | Detection to TensorRT: compatible | Detection to OpenVINO: compatible | Detection to Paddle: compatible | Detection to MNN: 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: compatible | Instance segmentation to TorchScript: compatible | Instance segmentation to ExecuTorch: no compatible | Instance segmentation to TensorRT: compatible | Instance segmentation to OpenVINO: 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 |
Un artefacto exportado se vuelve a cargar con LibreYOLO() según su sufijo de
archivo, así que un archivo .onnx o .engine se comporta como un checkpoint y
devuelve el mismo Results. Las rutas de OpenVINO, Paddle, MNN y Core AI
exportan con un lienzo fijo en lugar de con formas dinámicas.
Exportación lista los argumentos que acepta cada formato y los
extras que añaden unos pocos de ellos.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # La factoría enruta según el sufijo del archivo, así que un artefacto# exportado se carga como cualquier checkpoint y devuelve el mismo Results.model = LibreYOLO("LibreDFINEn.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 | ||
| LibreDFINEn.pt | 640 | apache-2.0 |
| LibreDFINEs.pt | 640 | apache-2.0 |
| LibreDFINEm.pt | 640 | apache-2.0 |
| LibreDFINEl.pt | 640 | apache-2.0 |
| LibreDFINEx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreDFINEn-seg.pt | 640 | apache-2.0 |
| LibreDFINEs-seg.pt | 640 | apache-2.0 |
| LibreDFINEm-seg.pt | 640 | apache-2.0 |
| LibreDFINEl-seg.pt | 640 | apache-2.0 |
| LibreDFINEx-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
- D-FINE, University of Science and Technology of China
- Licencia del proyecto original
- Apache-2.0
- Fuente del proyecto original
- github.com/Peterande/D-FINE
- 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 segmentation weights carry a second Apache-2.0 upstream, ArgoHA/D-FINE-seg, under the same terms.
Los pesos de segmentación tienen un segundo upstream: su decoder de máscaras, el emparejamiento de máscaras y la función de pérdida (loss) de máscaras vienen de ArgoHA/D-FINE-seg, también Apache-2.0, cuyo maintainer aprobó el reuso con atribución.
Cita
@misc{peng2024dfine,
title={D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement},
author={Yansong Peng and Hebei Li and Peixi Wu and Yueyi Zhang and Xiaoyan Sun and Feng Wu},
year={2024},
eprint={2410.13842},
archivePrefix={arXiv},
primaryClass={cs.CV}
}Copiado del bloque de cita de los autores en github.com/Peterande/D-FINE#citation.