??? Neuigkeiten : Die erweiterte Journalversion von UniRepLKNet ist bei arxiv veröffentlicht.
Ein ConvNet vereint mehrere Modalitäten und übertrifft modalitätsspezifische Modelle . Dieses Papier fasst Architekturrichtlinien zum Aufbau von CNN mit großem Kernel zusammen, das erstaunlich gut mit Bildern und anderen Modalitäten funktioniert. Dies ist der neueste Beitrag zu beiden einflussreichen Bereichen – Structural Re-param (seit RepVGG, Ding et al. 2021) und Very-Large-Kernel ConvNet (seit RepLKNet, Ding et al. 2022). ImageNet-Genauigkeit von 88,0 %, COCO AP von 56,4, ADE20K mIoU von 55,6 mit nur ImageNet-22K-Vortraining . Höhere tatsächliche Geschwindigkeit und Leistung als neuere Modelle wie ConvNeXt v2 und InternImage. Mit einer einheitlichen Architektur und einer äußerst einfachen modalitätsspezifischen Vorverarbeitung werden hochmoderne Leistungen bei der Audioerkennung und, was am erstaunlichsten ist, bei der globalen Temperatur- und Windgeschwindigkeitsvorhersage (eine anspruchsvolle, groß angelegte Zeitreihenvorhersageaufgabe) erreicht und die übertroffen bestehendes globales Prognosesystem.
Genauer gesagt leisten wir in zweierlei Hinsicht einen Beitrag:
UniRepLKNet bedeutet nicht nur ein „Comeback“ für ConvNet in seiner ursprünglichen Domäne, sondern zeigt auch das Potenzial von ConvNet mit großem Kernel, neue Gebiete zu „erobern“, und hebt die weitere Anpassungsfähigkeit und den breiten Nutzen für verschiedene Modalitäten und Aufgaben hervor.
Die ImageNet-, COCO- und ADE20K-Prüfpunkte wurden veröffentlicht (siehe das unten gezeigte Huggingface-Repo), mit Ausnahme des vorab trainierten ImageNet-22K UniRepLKNet-S und UperNet mit UniRepLKNet-XL, die verloren gingen, und wir reproduzieren sie.
Neueste Nachrichten: Es wurde ein Fehler behoben, der aus diesem Commit am 1. Dezember 2023 resultierte. Jetzt ist er behoben. Wenn Sie unireplknet.py nach dem 1. Dezember 2023 verwendet haben, überprüfen Sie bitte Ihren Code.
unireplknet.py
gibt es Code im Zusammenhang mit MMDetection und MMSegmentation, sodass Sie ihn direkt kopieren und in Ihre MMDetection- oder MMSegmentation einfügen können, z. B. hier und hier. Wenn Sie es nicht mit MMDetection oder MMSegmentation verwenden möchten, können Sie diese Codezeilen bedenkenlos löschen.timm.create_model
erstellen. Beispielsweise ruft model = timm.create_model('unireplknet_l', num_classes=num_classes_of_your_task, in_22k_pretrained=True)
die hier definierte Funktion unireplknet_l
auf, die ein UniRepLKNet-L erstellt und automatisch unsere Prüfpunkte herunterlädt und die Gewichte lädt. # 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()
bereit, die ein trainiertes UniRepLKNet in die Inferenzstruktur umwandelt, die äquivalent die parallelen Zweige in Dialted Reparam Blocks, Batch Norm Layers und den Bias-Term in GRN entfernt. Der Pseudocode der gesamten Pipeline wird wie folgt aussehen: 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()
entspricht dem Aufruf von timm.utils.reparameterize_model(some_unireplknet_model)
. Wenn Sie also unseren Code mit der Codebasis von timm verwenden, z. B. dem Evaluierungscode von timm, fügen Sie einfach --reparam
zu Ihrem Befehl hinzu, damit timm.utils.reparameterize_model
aufgerufen wird (siehe hier). Wir haben fünf Möglichkeiten zum Herunterladen unserer Checkpoints bereitgestellt.
pip install huggingface_hub
Verwenden Sie dann Huggingface_hub beispielsweise so in Ihrem Python-Code:
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 )
Sehen Sie sich unser Huggingface-Repo oder unseren Code für FILE_NAME an (z. B. unireplknet_xl_in22k_pretrain.pth
).
Verwenden Sie die Huggingface-CLI. Sehen Sie sich das Tutorial an.
Laden Sie unsere Prüfpunkte automatisch herunter, indem Sie beim Aufrufen unserer bereitgestellten Funktionen in_1k_pretrained=True
, in_22k_pretrained=True
oder in_22k_to_1k=True
übergeben. Den Code finden Sie hier.
Name | Auflösung | acc@1 | #params | FLOPs | Gewichte |
---|---|---|---|---|---|
UniRepLKNet-A | 224x224 | 77,0 | 4,4 Millionen | 0,6G | ckpt |
UniRepLKNet-F | 224x224 | 78,6 | 6,2 Mio | 0,9G | ckpt |
UniRepLKNet-P | 224x224 | 80.2 | 10,7 Mio | 1,6G | ckpt |
UniRepLKNet-N | 224x224 | 81,6 | 18,3 Mio | 2,8G | ckpt |
UniRepLKNet-T | 224x224 | 83,2 | 31M | 4,9G | ckpt |
UniRepLKNet-S | 224x224 | 83,9 | 56M | 9,1G | ckpt |
Name | Auflösung | #params | FLOPs | 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 |
Name | Auflösung | acc@1 | #params | FLOPs | 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 |
Code-, Dokument- und Konfigurationsdateien wurden veröffentlicht. Den Erkennungsleitfaden finden Sie hier.
Kontrollpunkte wurden bereits auf umarmendem Gesicht freigegeben. Sie können sie jetzt unter https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main herunterladen.
Oder Sie können diese Kontrollpunkte wie folgt von Google Drive herunterladen:
Name | Auflösung | Box-Karte | Maskenkarte | #params | FLOPs | Gewichte |
---|---|---|---|---|---|---|
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 |
Code-, Dokument- und Konfigurationsdateien wurden veröffentlicht. Den Segmentierungsleitfaden finden Sie hier.
Kontrollpunkte wurden bereits auf umarmendem Gesicht freigegeben. Sie können sie jetzt unter https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main herunterladen.
Oder Sie können diese Kontrollpunkte wie folgt von Google Drive herunterladen:
Name | Auflösung | mioU (ss/ms) | #params | FLOPs | Gewichte |
---|---|---|---|---|---|
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 |
Wir geben einen Beispielauswertungsbefehl.
Single-GPU
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
Informationen zum Training oder zur Feinabstimmung von UniRepLKNets auf ImageNet-1K oder 22K finden Sie in dieser Anleitung
Eine ausführliche Dokumentation finden Sie in den folgenden Dokumenten:
Wir verwenden eine Conv-Implementierung mit großem Kernel in PyTorch , die effizienter ist als die native Torch.nn.Conv2d . Die Implementierung basiert auf dem iGEMM-Algorithmus und einem leichten Tool namens Cutlass. Die Installation ist sehr einfach und kostet weniger als eine Minute. Wenn Sie diese Implementierung nicht installieren, können Sie unser Modell immer noch überall verwenden, es wird jedoch etwas langsamer sein.
unzip cutlass.zip
und geben Sie das Verzeichnis ein. Diese in diesem Repository bereitgestellte Version von Cutlass funktioniert gut mit unserer Implementierung mit großem Kernel und mehreren Python-Versionen. Alternativ können Sie den vom MegEngine-Team verwalteten Cutlass-Zweig verwenden (Klon https://github.com/MegEngine/cutlass), aber möglicherweise müssen Sie mit Ihrer Python-Version vorsichtiger sein (siehe diese Ausgabe).cd examples/19_large_depthwise_conv2d_torch_extension
./setup.py install --user
. Wenn Sie Fehler erhalten, überprüfen Sie Ihr CUDA_HOME
.python depthwise_conv2d_implicit_gemm.py
PATH_TO_CUTLASS_DIRECTORY/examples/19_large_depthwise_conv2d_torch_extension
zu Ihrem PYTHONPATH
hinzu, damit Sie from depthwise_conv2d_implicit_gemm import DepthWiseConv2dImplicitGEMM
können. Dann können Sie DepthWiseConv2dImplicitGEMM
als Ersatz für nn.Conv2d
verwenden.Es sollte mit einer Vielzahl von GPUs und PyTorch/CUDA-Versionen funktionieren. Wir empfehlen Ihnen, es zunächst zu versuchen und die Umgebungen nur zu überprüfen, wenn Fehler auftreten. Unsere letzten Testpersonen verwendeten beides
Es wird berichtet (siehe hier), dass eine Nichtübereinstimmung der Python-Version zu einem Fehler führen kann ( forward_fp32.cu(212): error: more than one instance of constructor "cutlass::Tensor4DCoord::Tensor4DCoord" ...
oder cutlass/include/cutlass/fast_math.h(741): error: no suitable conversion function from "__half" to "float" exists
. Bitte aktualisieren oder downgraden Sie Ihr Python. Wir danken @sleeplessai und @ewrfcas aufrichtig für das Teilen ihrer Erfahrungen.
Pull-Anfragen (z. B. bessere oder andere Implementierungen oder Implementierungen auf anderen Frameworks) sind willkommen.
Wenn der Code und das Papier Ihrer Recherche helfen, geben Sie bitte Folgendes an:
@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}
}
Dieses Projekt wird unter der Apache 2.0-Lizenz veröffentlicht. Weitere Informationen finden Sie in der LIZENZ-Datei.