???新闻:UniRepLKNet 的扩展期刊版本在 arxiv 上发布。
ConvNet 统一了多种模态并优于特定模态模型。本文总结了构建大内核 CNN 的架构指南,它与图像和其他模式的配合非常好。这是对两个有影响力的领域的最新贡献:结构重参数(自 RepVGG,Ding 等人,2021 年以来)和超大型内核 ConvNet (自 RepLKNet,Ding 等人,2022 年以来)。仅使用 ImageNet-22K 预训练,ImageNet 准确度为 88.0%,COCO AP 为 56.4,ADE20K mIoU 为 55.6 。比 ConvNeXt v2 和 InternImage 等最新模型更高的实际速度和性能。凭借统一的架构和极其简单的特定模态预处理,在音频识别方面实现了最先进的性能,最令人惊奇的是,在全球温度和风速预测(一项具有挑战性的大规模时间序列预测任务)方面,优于现有的全球预测系统。
更具体地说,我们从两个方面做出贡献:
UniRepLKNet 不仅标志着 ConvNet 在其原始领域的“回归”,而且还展示了大内核 ConvNet “征服”新领域的潜力,强调了跨不同模式和任务的进一步适应性和广泛实用性。
ImageNet、COCO 和 ADE20K 检查点已发布(请参见下面所示的 Huggingface 存储库),但 ImageNet-22K 预训练的 UniRepLKNet-S 和带有 UniRepLKNet-XL 的 UperNet 已丢失,我们正在复制它们。
最新消息:修复了 2023 年 12 月 1 日提交的错误。现在已修复。如果您在 2023 年 12 月 1 日之后使用了 unireplknet.py,请检查您的代码。
unireplknet.py
中有一些与 MMDetection 和 MMSegmentation 相关的代码,因此您可以直接将其复制粘贴到 MMDetection 或 MMSegmentation 中,例如,此处和此处。如果您不想将其与 MMDetection 或 MMSegmentation 一起使用,您可以安全地删除这些代码行。timm.create_model
来构建模型。例如, model = timm.create_model('unireplknet_l', num_classes=num_classes_of_your_task, in_22k_pretrained=True)
将调用此处定义的函数unireplknet_l
,该函数将构建 UniRepLKNet-L 并自动下载我们的检查点并加载权重。 # 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()
,它将训练好的 UniRepLKNet 转换为推理结构,这相当于删除了 Dialted Reparam Blocks 中的并行分支、Batch Norm 层以及 GRN 中的偏差项。完整管道的伪代码如下 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()
相当于调用timm.utils.reparameterize_model(some_unireplknet_model)
。因此,如果您将我们的代码与 timm 的代码库一起使用,例如 timm 的评估代码,只需将--reparam
添加到您的命令中,以便调用timm.utils.reparameterize_model
(请参阅此处)。 我们提供了五种下载检查点的方法。
pip install huggingface_hub
然后,在你的Python代码中像这样使用huggingface_hub,例如,
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 )
请参阅我们的 Huggingface 存储库或 FILE_NAME 的代码(例如unireplknet_xl_in22k_pretrain.pth
)。
使用 Huggingface CLI。检查教程。
在调用我们提供的函数时传递in_1k_pretrained=True
、 in_22k_pretrained=True
或in_22k_to_1k=True
来自动下载我们的检查点。请参阅此处的代码。
姓名 | 解决 | 帐户@1 | #参数 | 失败次数 | 重量 |
---|---|---|---|---|---|
UniRepLKNet-A | 224x224 | 77.0 | 4.4M | 0.6G | 控制点 |
UniRepLKNet-F | 224x224 | 78.6 | 6.2M | 0.9G | 控制点 |
UniRepLKNet-P | 224x224 | 80.2 | 10.7M | 1.6G | 控制点 |
UniRepLKNet-N | 224x224 | 81.6 | 18.3M | 2.8G | 控制点 |
UniRepLKNet-T | 224x224 | 83.2 | 31M | 4.9G | 控制点 |
UniRepLKNet-S | 224x224 | 83.9 | 56M | 9.1G | 控制点 |
姓名 | 解决 | #参数 | 失败次数 | 控制点 |
---|---|---|---|---|
UniRepLKNet-S | 224x224 | 56M | 26.7G | 控制点 |
UniRepLKNet-B | 224x224 | 98M | 47.2G | 控制点 |
UniRepLKNet-L | 192x192 | 218M | 105.4G | 控制点 |
UniRepLKNet-XL | 192x192 | 386M | 187G | 控制点 |
姓名 | 解决 | 帐户@1 | #参数 | 失败次数 | 控制点 |
---|---|---|---|---|---|
UniRepLKNet-S | 384x384 | 86.4 | 56M | 26.7G | 控制点 |
UniRepLKNet-B | 384x384 | 87.4 | 98M | 47.2G | 控制点 |
UniRepLKNet-L | 384x384 | 87.9 | 218M | 105.4G | 控制点 |
UniRepLKNet-XL | 384x384 | 88.0 | 386M | 187G | 控制点 |
代码、文档和配置文件已发布。请参阅此处的检测指南。
检查站已经在拥抱的脸上放行了。您现在可以从 https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main 下载它们。
或者您可以从 Google Drive 下载这些检查点,如下所示:
姓名 | 解决 | 盒图 | 掩模图 | #参数 | 失败次数 | 重量 |
---|---|---|---|---|---|---|
UniRepLKNet-T | 1280x800 | 51.7 | 44.9 | 89M | 749G | 控制点 |
UniRepLKNet-S | 1280x800 | 53.0 | 45.9 | 113M | 835G | 控制点 |
UniRepLKNet-S_22K | 1280x800 | 54.3 | 47.1 | 113M | 835G | 控制点 |
UniRepLKNet-B_22K | 1280x800 | 54.8 | 47.4 | 155M | 978G | 控制点 |
UniRepLKNet-L_22K | 1280x800 | 55.8 | 48.4 | 276M | 1385G | 控制点 |
UniRepLKNet-XL_22K | 1280x800 | 56.4 | 49.0 | 443M | 1952G | 控制点 |
代码、文档和配置文件已发布。请参阅此处的分段指南。
检查站已经在拥抱的脸上放行了。您现在可以从 https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main 下载它们。
或者您可以从 Google Drive 下载这些检查点,如下所示:
姓名 | 解决 | mIoU (秒/毫秒) | #参数 | 失败次数 | 重量 |
---|---|---|---|---|---|
UniRepLKNet-T | 512x512 | 48.6/49.1 | 61M | 946G | 控制点 |
UniRepLKNet-S | 512x512 | 50.5/51.0 | 86M | 1036G | 控制点 |
UniRepLKNet-S_22K | 512x512 | 51.9/52.7 | 86M | 1036G | 控制点 |
UniRepLKNet-S_22K | 640x640 | 52.3/52.7 | 86M | 1618G | 控制点 |
UniRepLKNet-B_22K | 640x640 | 53.5/53.9 | 130M | 1850G | 控制点 |
UniRepLKNet-L_22K | 640x640 | 54.5/55.0 | 254M | 2507G | 控制点 |
UniRepLKNet-XL_22K | 640x640 | 55.2/55.6 | 425M | 3420G | 控制点 |
我们给出一个示例评估命令。
单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
多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
如需在 ImageNet-1K 或 22K 上训练或微调 UniRepLKNet,请参阅本指南
详细文档请参考以下文档:
我们在PyTorch中使用大内核转换实现,它比本机 torch.nn.Conv2d 更高效。它是基于iGEMM算法和一个名为cutlass的轻量级工具实现的。安装非常简单,花费不到一分钟。如果您不安装此实现,您仍然可以在任何您想要的地方使用我们的模型,但速度会慢一些。
unzip cutlass.zip
,进入目录。此存储库中提供的这个版本的 cutlass 与我们的大型内核实现和多个 python 版本配合得很好。您也可以使用 MegEngine 团队维护的 cutlass 分支(克隆 https://github.com/MegEngine/cutlass),但您可能需要更加小心您的 python 版本(请参阅此问题)。cd examples/19_large_depthwise_conv2d_torch_extension
./setup.py install --user
。如果出现错误,请检查您的CUDA_HOME
。python depthwise_conv2d_implicit_gemm.py
PATH_TO_CUTLASS_DIRECTORY/examples/19_large_depthwise_conv2d_torch_extension
添加到您的PYTHONPATH
中,以便您可以在任何地方from depthwise_conv2d_implicit_gemm import DepthWiseConv2dImplicitGEMM
。然后您可以使用DepthWiseConv2dImplicitGEMM
代替nn.Conv2d
。它应该适用于各种 GPU 和 PyTorch/CUDA 版本。我们建议您首先尝试,仅在出现任何错误时检查环境。我们最新的睾丸同时使用了
据报道(请参见此处),Python 版本不匹配可能会导致错误( forward_fp32.cu(212): error: more than one instance of constructor "cutlass::Tensor4DCoord::Tensor4DCoord" ...
or cutlass/include/cutlass/fast_math.h(741): error: no suitable conversion function from "__half" to "float" exists
)。请升级或降级您的Python。我们衷心感谢@sleeplessai 和@ewrfcas 分享他们的经验。
欢迎拉取请求(例如,更好的或其他实现或其他框架上的实现)。
如果代码和论文对您的研究有帮助,请引用:
@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}
}
该项目是在 Apache 2.0 许可证下发布的。请参阅许可证文件以获取更多信息。