??? Notícias : A versão estendida do UniRepLKNet é lançada no arxiv.
Um ConvNet unifica múltiplas modalidades e supera modelos específicos de modalidade . Este artigo resume as diretrizes arquitetônicas para construir CNN de kernel grande, que funciona surpreendentemente bem com imagens e outras modalidades. Esta é a contribuição mais recente para ambas as áreas influentes - Structural Re-param (desde RepVGG, Ding et al. 2021) e ConvNet de kernel muito grande (desde RepLKNet, Ding et al. 2022). Precisão do ImageNet de 88,0%, COCO AP de 56,4, ADE20K mIoU de 55,6 com apenas pré-treinamento ImageNet-22K . Maior velocidade e desempenho reais do que modelos recentes como ConvNeXt v2 e InternImage. Com uma arquitetura unificada e pré-processamento específico de modalidade extremamente simples, alcança desempenhos de última geração em reconhecimento de áudio e, o mais surpreendente, em previsão de temperatura global e velocidade do vento (uma tarefa desafiadora de previsão de séries temporais em grande escala), superando o sistema de previsão global existente.
Mais especificamente, contribuímos em dois aspectos:
UniRepLKNet não apenas significa um "retorno" para ConvNet em seu domínio original, mas também mostra o potencial do ConvNet de grande kernel para "conquistar" novos territórios, destacando maior adaptabilidade e ampla utilidade em diferentes modalidades e tarefas.
Os pontos de verificação ImageNet, COCO e ADE20K foram lançados (veja o repositório huggingface mostrado abaixo), exceto o UniRepLKNet-S pré-treinado ImageNet-22K e UperNet com UniRepLKNet-XL, que foram perdidos e estamos reproduzindo-os.
Últimas notícias: corrigido um bug, que resulta deste commit em 1º de dezembro de 2023. Agora está corrigido. Se você usou unireplknet.py após 1º de dezembro de 2023, verifique seu código.
unireplknet.py
para que você possa copiá-lo e colá-lo diretamente em seu MMDetection ou MMSegmentation, por exemplo, aqui e aqui. Se não quiser usá-lo com MMDetection ou MMSegmentation, você pode excluir com segurança essas linhas de código.timm.create_model
para construir os modelos. Por exemplo, model = timm.create_model('unireplknet_l', num_classes=num_classes_of_your_task, in_22k_pretrained=True)
chamará a função unireplknet_l
definida aqui, que construirá um UniRepLKNet-L e baixará automaticamente nossos pontos de verificação e carregará os 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 converte um UniRepLKNet treinado na estrutura de inferência, que remove equivalentemente as ramificações paralelas em blocos de reparação discados, camadas de norma de lote e o termo de polarização em GRN. O pseudocódigo do 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()
é equivalente a chamar timm.utils.reparameterize_model(some_unireplknet_model)
. Portanto, se você usar nosso código com a base de código do timm, por exemplo, o código de avaliação do timm, basta adicionar --reparam
ao seu comando para que timm.utils.reparameterize_model
seja chamado (veja aqui). Fornecemos cinco maneiras de baixar nossos pontos de verificação.
pip install huggingface_hub
Em seguida, use huggingface_hub assim em seu código python, por exemplo,
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 )
Veja nosso repositório huggingface ou nosso código para FILE_NAME (por exemplo, unireplknet_xl_in22k_pretrain.pth
).
Use a CLI huggingface. Verifique o tutorial.
Baixe automaticamente nossos pontos de verificação passando in_1k_pretrained=True
, in_22k_pretrained=True
ou in_22k_to_1k=True
ao chamar nossas funções fornecidas. Veja o código aqui.
nome | resolução | conta@1 | #params | FLOPs | Pesos |
---|---|---|---|---|---|
UniRepLKNet-A | 224x224 | 77,0 | 4,4 milhões | 0,6G | confirmado |
UniRepLKNet-F | 224x224 | 78,6 | 6,2 milhões | 0,9G | confirmado |
UniRepLKNet-P | 224x224 | 80,2 | 10,7 milhões | 1,6G | confirmado |
UniRepLKNet-N | 224x224 | 81,6 | 18,3 milhões | 2,8G | confirmado |
UniRepLKNet-T | 224x224 | 83,2 | 31 milhões | 4,9G | confirmado |
UniRepLKNet-S | 224x224 | 83,9 | 56 milhões | 9.1G | confirmado |
nome | resolução | #params | FLOPs | confirmado |
---|---|---|---|---|
UniRepLKNet-S | 224x224 | 56 milhões | 26,7G | confirmado |
UniRepLKNet-B | 224x224 | 98 milhões | 47,2G | confirmado |
UniRepLKNet-L | 192x192 | 218 milhões | 105,4G | confirmado |
UniRepLKNet-XL | 192x192 | 386 milhões | 187G | confirmado |
nome | resolução | conta@1 | #params | FLOPs | confirmado |
---|---|---|---|---|---|
UniRepLKNet-S | 384x384 | 86,4 | 56 milhões | 26,7G | confirmado |
UniRepLKNet-B | 384x384 | 87,4 | 98 milhões | 47,2G | confirmado |
UniRepLKNet-L | 384x384 | 87,9 | 218 milhões | 105,4G | confirmado |
UniRepLKNet-XL | 384x384 | 88,0 | 386 milhões | 187G | confirmado |
Arquivos de código, documento e configuração foram lançados. Consulte o guia de detecção aqui.
Já foram liberados checkpoints no rosto do abraço. Você pode baixá-los agora mesmo em https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main.
Ou você pode baixar esses pontos de verificação do Google Drive da seguinte maneira:
nome | resolução | caixa mapa | máscara mAP | #params | FLOPs | Pesos |
---|---|---|---|---|---|---|
UniRepLKNet-T | 1280x800 | 51,7 | 44,9 | 89 milhões | 749G | confirmado |
UniRepLKNet-S | 1280x800 | 53,0 | 45,9 | 113 milhões | 835G | confirmado |
UniRepLKNet-S_22K | 1280x800 | 54,3 | 47,1 | 113 milhões | 835G | confirmado |
UniRepLKNet-B_22K | 1280x800 | 54,8 | 47,4 | 155 milhões | 978G | confirmado |
UniRepLKNet-L_22K | 1280x800 | 55,8 | 48,4 | 276 milhões | 1385G | confirmado |
UniRepLKNet-XL_22K | 1280x800 | 56,4 | 49,0 | 443 milhões | 1952G | confirmado |
Arquivos de código, documento e configuração foram lançados. Veja o guia de segmentação aqui.
Já foram liberados checkpoints no rosto do abraço. Você pode baixá-los agora mesmo em https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main.
Ou você pode baixar esses pontos de verificação do Google Drive da seguinte maneira:
nome | resolução | miU (ss/ms) | #params | FLOPs | Pesos |
---|---|---|---|---|---|
UniRepLKNet-T | 512x512 | 48,6/49,1 | 61 milhões | 946G | confirmado |
UniRepLKNet-S | 512x512 | 50,5/51,0 | 86 milhões | 1036G | confirmado |
UniRepLKNet-S_22K | 512x512 | 51,9/52,7 | 86 milhões | 1036G | confirmado |
UniRepLKNet-S_22K | 640x640 | 52,3/52,7 | 86 milhões | 1618G | confirmado |
UniRepLKNet-B_22K | 640x640 | 53,5/53,9 | 130 milhões | 1850G | confirmado |
UniRepLKNet-L_22K | 640x640 | 54,5/55,0 | 254 milhões | 2507G | confirmado |
UniRepLKNet-XL_22K | 640x640 | 55,2/55,6 | 425 milhões | 3420G | confirmado |
Damos um exemplo de comando de avaliação.
GPU único
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
Multi-GPU
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 treinar ou ajustar UniRepLKNets em ImageNet-1K ou 22K, consulte este guia
Para obter documentação detalhada, consulte estes documentos da seguinte forma:
Usamos uma implementação de conversão de kernel grande no PyTorch que é mais eficiente do que o torch.nn.Conv2d nativo. Ele é implementado com base no algoritmo iGEMM e em uma ferramenta leve chamada cutlass. A instalação é muito simples e custa menos de um minuto. Se você não instalar esta implementação, você ainda poderá usar nosso modelo em qualquer lugar que desejar, mas será um pouco mais lento.
unzip cutlass.zip
e entre no diretório. Esta versão do cutlass fornecida neste repositório funciona bem com nossa implementação de kernel grande e várias versões de python. Alternativamente, você pode usar o branch cutlass mantido pela equipe MegEngine (clone https://github.com/MegEngine/cutlass), mas pode ser necessário ter mais cuidado com sua versão python (veja este problema).cd examples/19_large_depthwise_conv2d_torch_extension
./setup.py install --user
. Se você receber erros, verifique seu CUDA_HOME
.python depthwise_conv2d_implicit_gemm.py
PATH_TO_CUTLASS_DIRECTORY/examples/19_large_depthwise_conv2d_torch_extension
em seu PYTHONPATH
para que você possa from depthwise_conv2d_implicit_gemm import DepthWiseConv2dImplicitGEMM
para qualquer lugar. Então você pode usar DepthWiseConv2dImplicitGEMM
como um substituto de nn.Conv2d
.Deve funcionar com uma ampla gama de GPUs e versões PyTorch/CUDA. Sugerimos que você tente primeiro e verifique os ambientes somente se encontrar algum erro. Nossos últimos testes usaram ambos
É relatado (veja aqui) que uma incompatibilidade de versão do python pode resultar em um erro ( forward_fp32.cu(212): error: more than one instance of constructor "cutlass::Tensor4DCoord::Tensor4DCoord" ...
ou cutlass/include/cutlass/fast_math.h(741): error: no suitable conversion function from "__half" to "float" exists
). Atualize ou faça downgrade do seu python. Agradecemos sinceramente a @sleeplessai e @ewrfcas por compartilharem suas experiências.
Solicitações pull (por exemplo, implementações melhores ou outras ou implementações em outras estruturas) são bem-vindas.
Se o código e o artigo ajudarem em sua pesquisa, 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 projeto é lançado sob a licença Apache 2.0. Consulte o arquivo LICENSE para obter mais informações.