??? Noticias : La versión de diario ampliado de UniRepLKNet se publica en arxiv.
Una ConvNet unifica múltiples modalidades y supera a los modelos específicos de modalidad . Este artículo resume las pautas arquitectónicas para construir CNN de núcleo grande, que funciona sorprendentemente bien con imágenes y otras modalidades. Esta es la última contribución a dos áreas influyentes: Structural Re-param (desde RepVGG, Ding et al. 2021) y ConvNet de núcleo muy grande (desde RepLKNet, Ding et al. 2022). Precisión de ImageNet del 88,0 %, COCO AP de 56,4, ADE20K mIoU de 55,6 con solo preentrenamiento de ImageNet-22K . Mayor velocidad y rendimiento reales que los modelos recientes como ConvNeXt v2 e InternImage. Con una arquitectura unificada y un preprocesamiento específico de modalidad extremadamente simple, logra rendimientos de última generación en reconocimiento de audio y, lo que es más sorprendente, pronóstico global de temperatura y velocidad del viento (una tarea desafiante de pronóstico de series de tiempo a gran escala), superando al sistema de pronóstico global existente.
Más concretamente contribuimos desde dos vertientes:
UniRepLKNet no sólo significa un "regreso" de ConvNet a su dominio original, sino que también muestra el potencial de ConvNet de núcleo grande para "conquistar" nuevos territorios, destacando una mayor adaptabilidad y una amplia utilidad en diferentes modalidades y tareas.
Se han publicado los puntos de control ImageNet, COCO y ADE20K (consulte el repositorio de Huggingface que se muestra a continuación), excepto UniRepLKNet-S previamente entrenado con ImageNet-22K y UperNet con UniRepLKNet-XL, que se perdieron y los estamos reproduciendo.
Últimas noticias: se corrigió un error que resultó de esta confirmación el 1 de diciembre de 2023. Ahora está solucionado. Si utilizó unireplknet.py después del 1 de diciembre de 2023, verifique su código.
unireplknet.py
para que pueda copiarlo y pegarlo directamente en su MMDetection o MMSegmentation, por ejemplo, aquí y aquí. Si no desea utilizarlo con MMDetection o MMSegmentation, puede eliminar esas líneas de código de forma segura.timm.create_model
para construir los modelos. Por ejemplo, model = timm.create_model('unireplknet_l', num_classes=num_classes_of_your_task, in_22k_pretrained=True)
llamará a la función unireplknet_l
definida aquí, que construirá un UniRepLKNet-L y descargará automáticamente nuestros puntos de control y cargará los pesos. # The simplest way to use our model in your project is to copy-paste unireplknet.py into your working directory and create models. For example
from unireplknet import *
model = timm.create_model('unireplknet_l', num_classes=num_classes_of_your_task, in_22k_pretrained=True)
reparameterize_unireplknet()
que convierte un UniRepLKNet entrenado en la estructura de inferencia, lo que elimina de manera equivalente las ramas paralelas en bloques de reparación dializados, capas de normas por lotes y el término de sesgo en GRN. El pseudocódigo del pipeline completo será como training_model = unireplknet_l (..., deploy = False )
train ( training_model )
trained_results = evaluate ( training_model )
training_model . reparameterize_unireplknet ()
inference_results = evaluate ( training_model )
# you will see inference_results are identical to trained_results
save ( training_model , 'converted_weights.pth' )
# use the converted model
deploy_model = unireplknet_l (..., deploy = True )
load_weights ( deploy_model , 'converted_weights.pth' )
deploy_results = evaluate ( deploy_model )
# you will see deploy_results == inference_results == trained_results
some_unireplknet_model.reparameterize_unireplknet()
es equivalente a llamar timm.utils.reparameterize_model(some_unireplknet_model)
. Entonces, si usa nuestro código con el código base de timm, por ejemplo, el código de evaluación de timm, simplemente agregue --reparam
a su comando para que se llame a timm.utils.reparameterize_model
(ver aquí). Hemos proporcionado cinco formas de descargar nuestros puntos de control.
pip install huggingface_hub
Luego, usa huggingface_hub así en tu código Python, por ejemplo,
from huggingface_hub import hf_hub_download
repo_id = 'DingXiaoH/UniRepLKNet'
cache_file = hf_hub_download ( repo_id = repo_id , filename = FILE_NAME )
checkpoint = torch . load ( cache_file , map_location = 'cpu' )
model . load_state_dict ( checkpoint )
Consulte nuestro repositorio de huggingface o nuestro código para FILE_NAME (por ejemplo, unireplknet_xl_in22k_pretrain.pth
).
Utilice la CLI de Huggingface. Consulta el tutorial.
Descargue automáticamente nuestros puntos de control pasando in_1k_pretrained=True
, in_22k_pretrained=True
o in_22k_to_1k=True
mientras llama a nuestras funciones proporcionadas. Vea el código aquí.
nombre | resolución | acc@1 | #parametros | FLOP | Pesos |
---|---|---|---|---|---|
UniRepLKNet-A | 224x224 | 77.0 | 4,4 millones | 0,6G | ckpt |
UniRepLKNet-F | 224x224 | 78,6 | 6,2 millones | 0,9G | ckpt |
UniRepLKNet-P | 224x224 | 80.2 | 10,7 millones | 1,6G | ckpt |
UniRepLKNet-N | 224x224 | 81,6 | 18,3 millones | 2,8G | ckpt |
UniRepLKNet-T | 224x224 | 83.2 | 31M | 4,9G | ckpt |
UniRepLKNet-S | 224x224 | 83,9 | 56M | 9,1G | ckpt |
nombre | resolución | #parametros | FLOP | ckpt |
---|---|---|---|---|
UniRepLKNet-S | 224x224 | 56M | 26,7G | ckpt |
UniRepLKNet-B | 224x224 | 98M | 47,2G | ckpt |
UniRepLKNet-L | 192x192 | 218M | 105,4G | ckpt |
UniRepLKNet-XL | 192x192 | 386M | 187G | ckpt |
nombre | resolución | acc@1 | #parametros | FLOP | ckpt |
---|---|---|---|---|---|
UniRepLKNet-S | 384x384 | 86,4 | 56M | 26,7G | ckpt |
UniRepLKNet-B | 384x384 | 87,4 | 98M | 47,2G | ckpt |
UniRepLKNet-L | 384x384 | 87,9 | 218M | 105,4G | ckpt |
UniRepLKNet-XL | 384x384 | 88.0 | 386M | 187G | ckpt |
Se han publicado archivos de código, documentos y configuración. Consulta la guía de detección aquí.
Ya se han liberado los controles sobre la cara del abrazo. Puede descargarlos ahora mismo desde https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main.
O puede descargar estos puntos de control desde Google Drive de la siguiente manera:
nombre | resolución | mapa de caja | mapa de máscara | #parametros | FLOP | Pesos |
---|---|---|---|---|---|---|
UniRepLKNet-T | 1280x800 | 51,7 | 44,9 | 89M | 749G | ckpt |
UniRepLKNet-S | 1280x800 | 53.0 | 45,9 | 113M | 835G | ckpt |
UniRepLKNet-S_22K | 1280x800 | 54.3 | 47.1 | 113M | 835G | ckpt |
UniRepLKNet-B_22K | 1280x800 | 54,8 | 47,4 | 155M | 978G | ckpt |
UniRepLKNet-L_22K | 1280x800 | 55,8 | 48.4 | 276M | 1385G | ckpt |
UniRepLKNet-XL_22K | 1280x800 | 56,4 | 49.0 | 443M | 1952G | ckpt |
Se han publicado archivos de código, documentos y configuración. Consulte la guía de segmentación aquí.
Ya se han liberado los controles sobre la cara del abrazo. Puede descargarlos ahora mismo desde https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main.
O puede descargar estos puntos de control desde Google Drive de la siguiente manera:
nombre | resolución | mIOU (ss/ms) | #parametros | FLOP | Pesos |
---|---|---|---|---|---|
UniRepLKNet-T | 512x512 | 48,6/49,1 | 61M | 946G | ckpt |
UniRepLKNet-S | 512x512 | 50,5/51,0 | 86M | 1036G | ckpt |
UniRepLKNet-S_22K | 512x512 | 51,9/52,7 | 86M | 1036G | ckpt |
UniRepLKNet-S_22K | 640x640 | 52,3/52,7 | 86M | 1618G | ckpt |
UniRepLKNet-B_22K | 640x640 | 53,5/53,9 | 130M | 1850G | ckpt |
UniRepLKNet-L_22K | 640x640 | 54,5/55,0 | 254M | 2507G | ckpt |
UniRepLKNet-XL_22K | 640x640 | 55,2/55,6 | 425M | 3420G | ckpt |
Damos un comando de evaluación de ejemplo.
GPU única
python main.py --model unireplknet_b --eval true
--resume unireplknet_b_in22k_to_in1k_384_acc87.40.pth
--input_size 384
--data_path /path/to/imagenet-1k
GPU múltiple
python -m torch.distributed.launch --nproc_per_node=8 main.py
--model unireplknet_b --eval true
--resume unireplknet_b_in22k_to_in1k_384_acc87.40.pth
--input_size 384
--data_path /path/to/imagenet-1k
Para entrenar o ajustar UniRepLKNets en ImageNet-1K o 22K, consulte esta guía
Para obtener documentación detallada, consulte estos documentos de la siguiente manera:
Usamos una implementación de conversión de kernel grande en PyTorch que es más eficiente que la torch.nn.Conv2d nativa. Se implementa en base al algoritmo iGEMM y una herramienta liviana llamada cutlass. La instalación es muy sencilla y te costará menos de un minuto. Si no instala esta implementación, aún puede usar nuestro modelo en cualquier lugar que desee, pero será un poco más lento.
unzip cutlass.zip
, ingrese al directorio. Esta versión de cutlass proporcionada en este repositorio funciona bien con nuestra implementación de kernel grande y múltiples versiones de Python. Alternativamente, puede utilizar la rama cutlass mantenida por el equipo de MegEngine (clon https://github.com/MegEngine/cutlass), pero es posible que deba tener más cuidado con su versión de Python (consulte este problema).cd examples/19_large_depthwise_conv2d_torch_extension
./setup.py install --user
. Si recibe errores, verifique su CUDA_HOME
.python depthwise_conv2d_implicit_gemm.py
PATH_TO_CUTLASS_DIRECTORY/examples/19_large_depthwise_conv2d_torch_extension
a su PYTHONPATH
para que pueda from depthwise_conv2d_implicit_gemm import DepthWiseConv2dImplicitGEMM
en cualquier lugar. Entonces puedes usar DepthWiseConv2dImplicitGEMM
como reemplazo de nn.Conv2d
.Debería funcionar con una amplia gama de GPU y versiones de PyTorch/CUDA. Le sugerimos que intente primero y verifique los entornos solo si obtiene algún error. Nuestros últimos testículos usaron ambos
Se informa (ver aquí) que una discrepancia en la versión de Python puede provocar un error ( forward_fp32.cu(212): error: more than one instance of constructor "cutlass::Tensor4DCoord::Tensor4DCoord" ...
o cutlass/include/cutlass/fast_math.h(741): error: no suitable conversion function from "__half" to "float" exists
. Actualice o baje su Python. Agradecemos sinceramente a @sleeplessai y @ewrfcas por compartir su experiencia.
Las solicitudes de extracción (por ejemplo, implementaciones mejores o de otro tipo o implementaciones en otros marcos) son bienvenidas.
Si el código y el artículo ayudan en su investigación, por favor cite:
@article{zhang2024scaling,
title={Scaling Up Your Kernels: Large Kernel Design in ConvNets towards Universal Representations},
author={Zhang, Yiyuan and Ding, Xiaohan and Yue, Xiangyu},
journal={arXiv preprint arXiv:2410.08049},
year={2024}
}
@inproceedings{ding2024unireplknet,
title={UniRepLKNet: A Universal Perception Large-Kernel ConvNet for Audio Video Point Cloud Time-Series and Image Recognition},
author={Ding, Xiaohan and Zhang, Yiyuan and Ge, Yixiao and Zhao, Sijie and Song, Lin and Yue, Xiangyu and Shan, Ying},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={5513--5524},
year={2024}
}
Este proyecto se publica bajo la licencia Apache 2.0. Consulte el archivo de LICENCIA para obtener más información.