{"notes":[{"id":"classic-cnns/internimage","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"InternImage","subtitle":"La force brute fait des miracles ?","author":"Z. Yuan","paperDate":"2022-11-10","publishedOn":"2025-09-04","world":"external/internimage","paperTitle":"InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions","paperUrl":"https://arxiv.org/abs/2211.05778","bibliography":{"title":"InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions","authors":["Wenhai Wang","Jifeng Dai","Zhe Chen","Zhenhang Huang","Zhiqi Li","Xizhou Zhu","Xiaowei Hu","Tong Lu","Lewei Lu","Hongsheng Li","Xiaogang Wang","Yu Qiao"],"url":"https://arxiv.org/abs/2211.05778","pdfUrl":"https://arxiv.org/pdf/2211.05778v4","codeUrl":null,"preprint":{"id":"2211.05778","submittedOn":"2022-11-10","url":"https://arxiv.org/abs/2211.05778"},"publication":{"venue":"CVPR","year":2023,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2023/html/Wang_InternImage_Exploring_Large-Scale_Vision_Foundation_Models_With_Deformable_Convolutions_CVPR_2023_paper.html"},"citation":"@misc{classiccnnsinternimage2022,\n  title = {{InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions}},\n  author = {Wenhai Wang and Jifeng Dai and Zhe Chen and Zhenhang Huang and Zhiqi Li and Xizhou Zhu and Xiaowei Hu and Tong Lu and Lewei Lu and Hongsheng Li and Xiaogang Wang and Yu Qiao},\n  year = {2022},\n  eprint = {2211.05778},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2211.05778}\n}\n","citationPath":"/content/papers/citations/classic-cnns/internimage.4baca0899bc9.bib"},"thumbnail":{"src":"/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png","width":1012,"height":1179},"locale":"fr","path":"/content/papers/fr/classic-cnns/internimage.61b6fcef5191.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"où-la-convolution-est-en-retard","text":"Où la convolution est en retard","depth":3},{"id":"pourquoi-dcnv2-ne-convient-pas-tel-quel","text":"Pourquoi DCNv2 ne convient pas tel quel","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"les-trois-modifications-de-dcnv3","text":"Les trois modifications de DCNv3","depth":3},{"id":"empiler-en-réseau","text":"Empiler en réseau","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"détection-et-segmentation","text":"Détection et segmentation","depth":3},{"id":"ablation-la-softmax","text":"Ablation : la softmax","depth":3},{"id":"le-prix-à-payer","text":"Le prix à payer","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/deformable-convnets","relation":"referenced","topic":""},{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/slak","relation":"referenced","topic":""}]},{"id":"classic-cnns/deformable-convnets","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Deformable ConvNets","subtitle":"Un sacré jeu de jambes","author":"Z. Yuan","paperDate":"2017-03-17","publishedOn":"2024-05-01","world":"external/deformable-convnets","paperTitle":"Deformable Convolutional Networks","paperUrl":"https://arxiv.org/abs/1703.06211","bibliography":{"title":"Deformable Convolutional Networks","authors":["Jifeng Dai","Haozhi Qi","Yuwen Xiong","Yi Li","Guodong Zhang","Han Hu","Yichen Wei"],"url":"https://arxiv.org/abs/1703.06211","pdfUrl":"https://arxiv.org/pdf/1703.06211v3","codeUrl":null,"preprint":{"id":"1703.06211","submittedOn":"2017-03-17","url":"https://arxiv.org/abs/1703.06211"},"publication":{"venue":"ICCV","year":2017,"kind":"conference","url":"https://openaccess.thecvf.com/content_iccv_2017/html/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.html"},"citation":"@misc{classiccnnsdeformableconvnets2017,\n  title = {{Deformable Convolutional Networks}},\n  author = {Jifeng Dai and Haozhi Qi and Yuwen Xiong and Yi Li and Guodong Zhang and Han Hu and Yichen Wei},\n  year = {2017},\n  eprint = {1703.06211},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1703.06211}\n}\n","citationPath":"/content/papers/citations/classic-cnns/deformable-convnets.f724f3ff1784.bib"},"thumbnail":{"src":"/content/papers/assets/942dcd98b1119ce95e8a9a24b84ed42b780d062caafa004c66f75640c4e2584a.png","width":987,"height":633},"locale":"fr","path":"/content/papers/fr/classic-cnns/deformable-convnets.20c475e9ecf6.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"une-grille-figée","text":"Une grille figée","depth":3},{"id":"faire-apprendre-la-déformation-au-réseau-une-idée-déjà-explorée","text":"Faire apprendre la déformation au réseau, une idée déjà explorée","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"les-deux-étapes-dune-convolution","text":"Les deux étapes d'une convolution","depth":3},{"id":"un-décalage-pour-chaque-point","text":"Un décalage pour chaque point","depth":3},{"id":"échantillonner-une-position-fractionnaire","text":"Échantillonner une position fractionnaire","depth":3},{"id":"doù-viennent-les-décalages","text":"D'où viennent les décalages ?","depth":3},{"id":"deux-cas-particuliers","text":"Deux cas particuliers","depth":3},{"id":"roi-pooling-déformable","text":"RoI pooling déformable","depth":3},{"id":"dans-le-réseau","text":"Dans le réseau","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"le-champ-réceptif-suit-vraiment-lobjet","text":"Le champ réceptif suit vraiment l'objet","depth":3},{"id":"combien-de-couches-remplacer","text":"Combien de couches remplacer ?","depth":3},{"id":"face-à-la-convolution-dilatée","text":"Face à la convolution dilatée","depth":3},{"id":"le-coût","text":"Le coût","depth":3},{"id":"coco","text":"COCO","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/stn","relation":"referenced","topic":""},{"id":"object-detection/deformable-detr","relation":"referenced","topic":""}]},{"id":"reparameterization/replknet","category":"reparameterization","legacyPath":"reparameterization/2203-replknet","legacySlug":"2203-replknet","legacyPaths":[],"title":"RepLKNet","subtitle":"Des noyaux de convolution géants","author":"Z. Yuan","paperDate":"2022-03-13","publishedOn":"2024-07-21","paperTitle":"Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs","paperUrl":"https://arxiv.org/abs/2203.06717","bibliography":{"title":"Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs","authors":["Xiaohan Ding","Xiangyu Zhang","Yizhuang Zhou","Jungong Han","Guiguang Ding","Jian Sun"],"url":"https://arxiv.org/abs/2203.06717","pdfUrl":"https://arxiv.org/pdf/2203.06717","codeUrl":null,"preprint":{"id":"2203.06717","submittedOn":"2022-03-13","url":"https://arxiv.org/abs/2203.06717"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://arxiv.org/abs/2203.06717"},"citation":"@misc{reparameterizationreplknet2022,\n  title = {{Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs}},\n  author = {Xiaohan Ding and Xiangyu Zhang and Yizhuang Zhou and Jungong Han and Guiguang Ding and Jian Sun},\n  year = {2022},\n  eprint = {2203.06717},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2203.06717}\n}\n","citationPath":"/content/papers/citations/reparameterization/replknet.c7cc2407aa19.bib"},"thumbnail":{"src":"/content/papers/assets/b85fa678b6e815b9d112b67d68443295a98c80478664ec8053c2e832d89574ca.jpg","width":1140,"height":972},"locale":"fr","path":"/content/papers/fr/reparameterization/replknet.d98b90ec0670.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"mode-demploi-des-convolutions-à-grand-noyau","text":"Mode d'emploi des convolutions à grand noyau","depth":2},{"id":"les-grands-noyaux-en-convolution-en-profondeur-restent-efficaces","text":"Les grands noyaux en convolution en profondeur restent efficaces","depth":3},{"id":"les-grands-noyaux-dépendent-fortement-des-connexions-résiduelles","text":"Les grands noyaux dépendent fortement des connexions résiduelles","depth":3},{"id":"les-grands-noyaux-ont-besoin-de-reparamétrisation","text":"Les grands noyaux ont besoin de reparamétrisation","depth":3},{"id":"les-grands-noyaux-améliorent-nettement-les-tâches-en-aval","text":"Les grands noyaux améliorent nettement les tâches en aval","depth":3},{"id":"les-grands-noyaux-restent-utiles-sur-de-petites-cartes-de-caractéristiques","text":"Les grands noyaux restent utiles sur de petites cartes de caractéristiques","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"architecture-du-réseau","text":"Architecture du réseau","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"évaluation-des-grands-noyaux","text":"Évaluation des grands noyaux","depth":3},{"id":"performances-sur-imagenet","text":"Performances sur ImageNet","depth":3},{"id":"un-cnn-à-grands-noyaux-a-un-erf-plus-vaste-quun-réseau-profond-à-petits-noyaux","text":"Un CNN à grands noyaux a un ERF plus vaste qu'un réseau profond à petits noyaux","depth":3},{"id":"biais-de-forme","text":"Biais de forme","depth":3},{"id":"limites","text":"Limites","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"comparison","topic":"Grands noyaux et architectures convolutives simplifiées"}]},{"id":"classic-cnns/slak","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"SLaK","subtitle":"Le noyau Pro Max","author":"Z. Yuan","paperDate":"2022-07-07","publishedOn":"2025-03-09","world":"external/slak","paperTitle":"More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity","paperUrl":"https://arxiv.org/abs/2207.03620","bibliography":{"title":"More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity","authors":["Shiwei Liu","Tianlong Chen","Xiaohan Chen","Xuxi Chen","Qiao Xiao","Boqian Wu","Tommi Kärkkäinen","Mykola Pechenizkiy","Decebal Mocanu","Zhangyang Wang"],"url":"https://arxiv.org/abs/2207.03620","pdfUrl":"https://arxiv.org/pdf/2207.03620v3","codeUrl":null,"preprint":{"id":"2207.03620","submittedOn":"2022-07-07","url":"https://arxiv.org/abs/2207.03620"},"publication":{"venue":"ICLR","year":2023,"kind":"conference","url":"https://iclr.cc/virtual/2023/poster/11529"},"citation":"@misc{classiccnnsslak2022,\n  title = {{More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity}},\n  author = {Shiwei Liu and Tianlong Chen and Xiaohan Chen and Xuxi Chen and Qiao Xiao and Boqian Wu and Tommi Kärkkäinen and Mykola Pechenizkiy and Decebal Mocanu and Zhangyang Wang},\n  year = {2022},\n  eprint = {2207.03620},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2207.03620}\n}\n","citationPath":"/content/papers/citations/classic-cnns/slak.e167e693df01.bib"},"thumbnail":{"src":"/content/papers/assets/b5b8ba279efe42831c7ec4e60395d0559da26774c8519a438783f49f4b814a85.png","width":1640,"height":660},"locale":"fr","path":"/content/papers/fr/classic-cnns/slak.a981a598f00d.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"au-delà-de-31","text":"Au-delà de 31","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"première-étape-couper-en-deux-bandes","text":"Première étape : couper en deux bandes","depth":3},{"id":"deuxième-étape-un-peu-plus-creux-un-peu-plus-large","text":"Deuxième étape : un peu plus creux, un peu plus large","depth":3},{"id":"à-quoi-ressemble-slak","text":"À quoi ressemble SLaK","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"tâches-en-aval","text":"Tâches en aval","depth":3},{"id":"en-conditions-réelles","text":"En conditions réelles","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"referenced","topic":""},{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/resnext","relation":"referenced","topic":""}]}],"text":"En 2022, les modèles de vision de plus d'un milliard de paramètres sont presque tous des Transformers. ViT-G compte 1,8 milliard de paramètres, SwinV2-G atteint 3 milliards, et BEiT-3 en a 1,9 milliard ; côté réseaux convolutifs, les plus grands, ConvNeXt-XL et RepLKNet-XL, plafonnent tous deux à un peu plus de 300 millions. ConvNeXt a montré que la convolution reste compétitive aux tailles courantes, mais à l'échelle du milliard de paramètres et des centaines de millions d'images, personne n'a encore construit de réseau convolutif capable de rivaliser avec ViT.\n\nCet article vient du Shanghai AI Laboratory, de SenseTime, de l'université Tsinghua, de l'université de Nankin et de l'université chinoise de Hong Kong. Parmi les auteurs, Jifeng Dai et Xizhou Zhu sont respectivement les premiers auteurs de la première et de la deuxième version de la convolution déformable ; ils ressortent cette fois leur propre opérateur pour en faire le backbone d'un grand modèle.\n\n\n> [!TIP]\n> \n> Pour la convolution déformable, vous pouvez commencer par notre note :\n> \n> - **[[17.03] Deformable ConvNets : Un sacré jeu de jambes](/blog/papers/classic-cnns/deformable-convnets)**\n\n\n## Définir le problème\n\n### Où la convolution est en retard\n\nLes auteurs comparent d'abord la convolution ordinaire et l'auto-attention multi-têtes (MHSA), et dégagent deux différences.\n\nLa première concerne les dépendances à longue distance. En empilant des convolutions 3×3 couche après couche, on obtient en réalité un champ réceptif effectif modeste ; même très profond, le réseau a du mal à voir toute l'image d'emblée, comme le fait ViT.\n\nLa seconde est l'agrégation spatiale adaptative. Les poids de l'auto-attention varient avec l'entrée, différents pour chaque image et chaque position ; ceux de la convolution sont figés une fois l'entraînement terminé, et s'accompagnent de forts biais inductifs, comme la localité et l'équivariance par translation. Ces biais inductifs font converger vite les réseaux convolutifs avec peu de données, mais limitent aussi leur capacité à apprendre des motifs plus généraux à partir de données à l'échelle du web.\n\n[![Schéma en quatre cases comparant quatre opérateurs de base, chacun avec au centre une étoile bleue figurant le pixel de requête. (a) Attention globale : toute l'image est couverte de cases vertes plus ou moins foncées, figurant des poids adaptatifs, avec les mentions dépendances à longue distance, agrégation adaptative, mais calcul et mémoire peu économes. (b) Attention locale : seul un petit bloc de cases vertes en haut à gauche de l'étoile, avec la mention pas de dépendances à longue distance. (c) Grand noyau : une vaste zone de cases grises figurant des poids fixes, avec la mention pas d'agrégation adaptative. (d) Le noyau creux dynamique des auteurs : neuf petits carrés verts dispersés autour de l'étoile, plus ou moins loin, avec les trois critères cochés](/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png)](/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png)\n\n*Figure 1 de l'article, extraite de la [**page 1 du PDF v4**](https://arxiv.org/pdf/2211.05778v4#page=1), CC BY 4.0. En gris, les poids fixes ; en vert, les poids qui varient avec l'entrée.*\n\nLes grands noyaux comme RepLKNet ou SLaK comblent le premier manque, mais pas le second, leurs poids restant figés après l'entraînement. La convolution déformable a les deux ; le décalage de chaque point d'échantillonnage lui permet de regarder près comme loin, et décalages comme poids de modulation sont calculés à partir de l'entrée.\n\n\n> [!TIP]\n> \n> Pour la voie des grands noyaux, vous pouvez lire ces deux notes :\n> \n> - **[[22.03] RepLKNet : Des noyaux de convolution géants](/blog/papers/reparameterization/replknet)**\n> - **[[22.07] SLaK : Le noyau Pro Max](/blog/papers/classic-cnns/slak)**\n\n\n### Pourquoi DCNv2 ne convient pas tel quel\n\nLa sortie de DCNv2 à la position $p_0$ s'écrit\n\n$$\ny(p_0)=\\sum_{k=1}^{K} w_k\\, m_k\\, x\\!\\left(p_0+p_k+\\Delta p_k\\right),\n$$\n\n$K$ est le nombre de points d'échantillonnage, $K=9$ pour un 3×3. $p_k$ est la position sur la grille de la convolution ordinaire, $\\Delta p_k$ le décalage appris, $m_k$ le poids de modulation passé par une sigmoïde, et $w_k$ le poids de projection du $k$-ième point d'échantillonnage, de taille $C\\times C$.\n\nLe problème est que DCNv2 sert d'ordinaire de module d'appoint ; on charge les poids préentraînés d'une convolution ordinaire, puis on passe à la convolution déformable pour l'affinage. Pour entraîner de zéro un backbone d'un milliard de paramètres, il a deux défauts. Chaque point d'échantillonnage a son propre jeu de poids $C\\times C$, si bien que paramètres et mémoire croissent avec $K$ ; la sigmoïde place chaque $m_k$ entre 0 et 1, et la somme des neuf peut donc prendre n'importe quelle valeur entre 0 et 9, ce qui rend le gradient instable dès que le modèle grossit et que les données abondent.\n\n## Résoudre le problème\n\n### Les trois modifications de DCNv3\n\n**Premièrement, des poids partagés entre points d'échantillonnage.** Reprenant l'idée de la convolution séparable, on scinde $w_k$ en deux. La partie liée à la position revient au poids de modulation $m_k$, l'équivalent du depthwise ; la projection indépendante de la position, $w$, est partagée par tous les points d'échantillonnage, l'équivalent du pointwise. Des neuf jeux de poids $C\\times C$, il n'en reste qu'un.\n\n**Deuxièmement, des groupes.** À l'image de l'attention multi-têtes, les canaux sont répartis en $G$ groupes, chacun avec ses propres décalages et poids de modulation ; dans une même couche, des groupes différents peuvent ainsi regarder des endroits différents.\n\n**Troisièmement, une softmax pour les poids de modulation.** La sigmoïde se calcule point par point, chacun de son côté ; on la remplace par une softmax commune aux neuf points, dont la somme vaut toujours 1.\n\nL'ensemble donne DCNv3 :\n\n$$\ny(p_0)=\\sum_{g=1}^{G}\\sum_{k=1}^{K} w_g\\, m_{gk}\\, x_g\\!\\left(p_0+p_k+\\Delta p_{gk}\\right),\n$$\n\n$x_g$ désigne les canaux du $g$-ième groupe, avec $C' = C/G$ canaux par groupe, et la softmax de $m_{gk}$ se fait le long de $K$.\n\nLes décalages sont fractionnaires, et les positions d'échantillonnage tombent généralement entre les pixels ; il faut donc une interpolation bilinéaire pour obtenir les valeurs. Écrivons la version la plus simple avec le `grid_sample` de PyTorch, en laissant de côté pour l'instant la projection partagée finale :\n\n```python\nimport torch\nimport torch.nn.functional as F\n\ndef dcnv3_core(x, offset, logits, G):\n    # x : (C, H, W) ; offset : (G, 9, 2, H, W), en pixels ; logits : (G, 9, H, W)\n    C, H, W = x.shape\n    m = logits.softmax(dim=1)                                  # dans chaque groupe, les poids des 9 points somment à 1\n    ys, xs = torch.meshgrid(torch.arange(H), torch.arange(W), indexing=\"ij\")\n    grid = [(dy, dx) for dy in (-1, 0, 1) for dx in (-1, 0, 1)]  # positions de base p_k du 3×3\n    out = torch.zeros_like(x)\n    for g, xg in enumerate(x.split(C // G)):                   # chaque groupe a ses propres décalages et poids\n        for k, (dy, dx) in enumerate(grid):\n            py = ys + dy + offset[g, k, 0]                     # p0 + p_k + Δp\n            px = xs + dx + offset[g, k, 1]\n            pos = torch.stack([px / (W - 1) * 2 - 1, py / (H - 1) * 2 - 1], -1)\n            v = F.grid_sample(xg[None], pos[None], align_corners=True)[0]   # valeur obtenue par interpolation bilinéaire\n            out[g * (C // G):(g + 1) * (C // G)] += m[g, k] * v\n    return out                                                 # à faire suivre d'une projection linéaire partagée par tous les points\n\ntorch.manual_seed(0)\nC, H, W, G = 8, 16, 16, 2\nx = torch.randn(C, H, W)\n\n# décalages tous nuls et poids tous égaux : on retombe sur une moyenne 3×3\nzero_off, flat = torch.zeros(G, 9, 2, H, W), torch.zeros(G, 9, H, W)\nout = dcnv3_core(x, zero_off, flat, G)\nprint(\"Décalages nuls, écart maximal avec un pooling moyen 3×3 :\", f\"{(out - F.avg_pool2d(x, 3, 1, 1)).abs().max():.1e}\")\n\n# les 9 points du groupe 0 descendent tous de 5 cases : le noyau 3×3 voit à 5 cases de distance\noff = zero_off.clone()\noff[0, :, 0] = 5.0\nout = dcnv3_core(x, off, flat, G)\nref = F.avg_pool2d(x, 3, 1, 1)\nprint(\"Groupe 0 descendu de 5 cases, écart maximal avec la moyenne 5 cases plus bas :\", f\"{(out[:4, :-5] - ref[:4, 5:]).abs().max():.1e}\")\nprint(\"Groupe 1 non affecté, écart maximal :\", f\"{(out[4:] - ref[4:]).abs().max():.1e}\")\n```\n\n```\nDécalages nuls, écart maximal avec un pooling moyen 3×3 : 2.4e-07\nGroupe 0 descendu de 5 cases, écart maximal avec la moyenne 5 cases plus bas : 1.8e-07\nGroupe 1 non affecté, écart maximal : 2.4e-07\n```\n\nAvec des décalages nuls et des poids softmax uniformes, DCNv3 se réduit à une moyenne 3×3. Dès que les décalages bougent, les mêmes neuf points d'échantillonnage peuvent aller à 5 cases de là, et seul le groupe concerné se déplace. Dans le vrai modèle, décalages et poids de modulation sont calculés à partir de l'entrée par une convolution depthwise 3×3 suivie d'une couche linéaire, et diffèrent donc à chaque position. Le code officiel contient aussi une version en PyTorch pur, dont les commentaires précisent qu'elle ne sert qu'au débogage et aux tests ; l'entraînement utilise l'opérateur CUDA.\n\nLa softmax a l'air d'une modification mineure ; affichons la somme obtenue par chacune des deux méthodes pour comparer :\n\n```python\nimport torch\n\ntorch.manual_seed(0)\nfor scale in (0.5, 2.0, 5.0):\n    logits = torch.randn(10000, 9) * scale        # dix mille positions, 9 points d'échantillonnage chacune\n    s = torch.sigmoid(logits).sum(1)               # DCNv2 : une sigmoïde pour chaque point séparément\n    t = torch.softmax(logits, 1).sum(1)            # DCNv3 : une softmax commune aux 9 points\n    print(f\"Écart-type des logits {scale} : somme sigmoïde de {s.min():.2f} à {s.max():.2f}, somme softmax de {t.min():.2f} à {t.max():.2f}\")\n```\n\n```\nÉcart-type des logits 0.5 : somme sigmoïde de 3.07 à 5.87, somme softmax de 1.00 à 1.00\nÉcart-type des logits 2.0 : somme sigmoïde de 0.95 à 8.13, somme softmax de 1.00 à 1.00\nÉcart-type des logits 5.0 : somme sigmoïde de 0.33 à 8.53, somme softmax de 1.00 à 1.00\n```\n\nSelon la position, la somme des sigmoïdes peut varier d'un facteur de plus de vingt, ce qui revient à multiplier la sortie de chaque position par un facteur différent. Avec la softmax, elle vaut toujours 1. Les ablations présentées plus loin montrent tout le poids de ce changement.\n\n### Empiler en réseau\n\nL'opérateur est prêt ; reste à construire un réseau avec.\n\n[![Schéma de l'architecture d'InternImage. À gauche, le backbone ; une photo de panda roux entre, passe par le stem, puis par les stages 1 à 4, reliés par des couches de downsampling, la carte de caractéristiques passant de H/4×W/4 à H/32×W/32, avant les tâches de classification, de détection, de segmentation, etc. À droite, trois cadres précisent que le stem est formé de deux convolutions 3×3 de pas 2 avec LN et GELU, et le downsampling d'une convolution 3×3 de pas 2 avec LN ; le bloc de base du stage i se compose de DCNv3, LN, FFN et LN, avec deux connexions résiduelles, DCNv3 portant à côté le décalage Δp et le poids de modulation m ; tout en bas figurent les quatre règles d'empilement](/content/papers/assets/902dfc93f6ae81a66758189ee04f89df167af4dc79a2eee9960400c444fd2515.png)](/content/papers/assets/902dfc93f6ae81a66758189ee04f89df167af4dc79a2eee9960400c444fd2515.png)\n\n*Figure 3 de l'article, extraite de la [**page 4 du PDF v4**](https://arxiv.org/pdf/2211.05778v4#page=4), CC BY 4.0.*\n\nLe bloc de base ressemble beaucoup à celui d'un Transformer ; DCNv3 prend la place de l'auto-attention, suivi d'un FFN à GELU, et la sortie de chacune des deux branches passe par une LN avant d'être additionnée au résidu. Le stem et les couches de sous-échantillonnage restent dans la tradition des réseaux convolutifs, avec deux convolutions 3×3 de pas 2 pour le stem et une convolution 3×3 de pas 2 pour le sous-échantillonnage.\n\nChacun des quatre étages a son nombre de canaux $C_i$, son nombre de groupes $G_i$ et son nombre de blocs $L_i$, soit 12 hyperparamètres au total, beaucoup trop. Les auteurs les ramènent à 4 avec quatre règles :\n\n1. $C_i = 2^{i-1} C_1$, le nombre de canaux double à chaque étage.\n2. $G_i = C_i / C'$, le nombre de canaux par groupe, $C'$, est fixe.\n3. $L_1 = L_2 = L_4$.\n4. $L_1 \\le L_3$, le troisième étage est le plus profond.\n\nLes deux dernières correspondent à l'empilement « AABA » de ConvNeXt et de Swin. Restent quatre nombres, $C_1$, $C'$, $L_1$ et $L_3$ ; autour de 30 millions de paramètres, les auteurs explorent 30 combinaisons et retiennent $(64, 16, 4, 18)$ pour InternImage-T.\n\nPour monter en taille, les auteurs s'inspirent de la mise à l'échelle composée d'EfficientNet ; la profondeur est multipliée par $\\alpha^{\\phi}$ et la largeur par $\\beta^{\\phi}$, sous la contrainte $\\alpha\\beta^{1.99}\\approx 2$, et les expériences désignent $\\alpha = 1.09$ et $\\beta = 1.36$ comme meilleur choix. On obtient finalement six tailles :\n\n| Modèle | $C_1$ | $C'$ | Blocs par étage | Paramètres |\n| --- | ---: | ---: | --- | ---: |\n| InternImage-T | 64 | 16 | 4, 4, 18, 4 | 30 M |\n| InternImage-S | 80 | 16 | 4, 4, 21, 4 | 50 M |\n| InternImage-B | 112 | 16 | 4, 4, 21, 4 | 97 M |\n| InternImage-L | 160 | 16 | 5, 5, 22, 5 | 223 M |\n| InternImage-XL | 192 | 16 | 5, 5, 24, 5 | 335 M |\n| InternImage-H | 320 | 32 | 6, 6, 32, 6 | 1,08 B |\n\n*Tableau : extrait de la Table 1 de l'article.*\n\nDe T à XL, les tailles sont alignées sur celles de ConvNeXt pour faciliter la comparaison ; H a été construit à part pour franchir le milliard de paramètres.\n\n## Discussion\n\n### ImageNet\n\nCommençons par les tailles courantes. T, S et B sont entraînés 300 époques sur ImageNet-1K seul, avec des entrées 224×224 :\n\n| Taille | Swin | ConvNeXt | SLaK | HorNet | InternImage |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| T (env. 30 M) | 81,3 % | 82,1 % | 82,5 % | 83,0 % | **83,5 %** |\n| S (env. 50 M) | 83,0 % | 83,1 % | 83,8 % | 84,0 % | **84,2 %** |\n| B (env. 90 M) | 83,5 % | 83,8 % | 84,0 % | 84,3 % | **84,9 %** |\n\n*Tableau : quelques colonnes extraites de la Table 2 de l'article. Sur une même ligne, les modèles ont des nombres de paramètres et des FLOPs proches.*\n\nÀ taille égale, InternImage est en tête sur chaque ligne ; T dépasse ConvNeXt-T de 1,4 point de pourcentage, et B le fait aussi de 1,1.\n\nPassons aux grands modèles. XL, préentraîné sur ImageNet-22K, atteint 88,0 %. H est préentraîné avec M3I sur 427 millions d'images publiques, issues de LAION-400M, YFCC-15M et CC12M, et atteint 89,6 % avec des entrées 640×640. Les meilleurs ViT et architectures hybrides se situent entre 90,5 % et 90,9 % environ, avec des données non publiques comme JFT ; l'écart est d'environ 1 point de pourcentage.\n\n### Détection et segmentation\n\nEn aval, les écarts sont plus grands qu'en classification. Sur COCO, avec Mask R-CNN entraîné 12 époques, InternImage-T obtient une box AP de 47,2, contre 42,7 pour Swin-T et 44,2 pour ConvNeXt-T, soit 4,5 et 3,0 de plus. Avec Cascade Mask R-CNN et un entraînement multi-échelle de 36 époques, XL atteint 56,2, contre 55,2 pour ConvNeXt-XL. En segmentation sémantique sur ADE20K avec UperNet, InternImage-B obtient 50,8 de mIoU, contre 49,1 pour ConvNeXt-B, 49,9 pour RepLKNet-31B et 50,2 pour SLaK-B.\n\nLe chiffre le plus cité de l'article est la box AP de 65,4 sur COCO test-dev, 1,2 de plus que le précédent record, FD-SwinV2-G, avec 27 % de paramètres en moins. La façon dont il a été obtenu mérite d'être détaillée. Le backbone est InternImage-H, préentraîné sur 427 millions d'images ; une technique de backbone composite double ensuite ses paramètres, portés à 2,18 milliards ; le détecteur est DINO, entraîné 26 époques sur Objects365, puis 12 époques sur COCO. Les 62,9 de mIoU sur ADE20K viennent eux aussi de H, associé à Mask2Former, avec en plus un test multi-échelle. Toutes les astuces cumulables ont été cumulées, et ces chiffres tiennent plutôt de la démonstration que ce backbone supporte un entraînement à grande échelle.\n\n\n> [!TIP]\n> \n> Pour le détecteur DINO, vous pouvez lire cette note :\n> \n> - **[[22.03] DINO : Proche, mais pas assez](/blog/papers/object-detection/dino-detr)**\n\n\n### Ablation : la softmax\n\nOn retire tour à tour chacune des trois modifications de DCNv3, et l'on compare sur InternImage-T :\n\n| Configuration | ImageNet top-1 | COCO box AP | COCO mask AP |\n| --- | ---: | ---: | ---: |\n| DCNv3 complet | 83,5 % | 47,2 | 42,5 |\n| Sans partage des poids | 83,6 % | 47,4 | 42,6 |\n| Sans groupes | 82,3 % | 43,8 | 40,0 |\n| Sigmoïde au lieu de softmax | **65,7 %** | 38,7 | 35,6 |\n\n*Tableau : extrait de la Table 6 de l'article. Sur COCO, Mask R-CNN entraîné 12 époques.*\n\nLe partage des poids n'affecte presque pas la précision, mais la version sans partage a 66,1 % de paramètres en plus. À l'échelle de H, le partage économise 42,0 % des paramètres et 84,2 % de la mémoire GPU ; cette modification sert à pouvoir agrandir le modèle.\n\nSans les groupes, ImageNet perd 1,2 et COCO 3,4 ; la détection en souffre davantage.\n\nEn revenant de la softmax à la sigmoïde, ImageNet tombe directement à 65,7 %, près de 18 points de pourcentage de moins. Les sommes affichées plus haut montrent ici leur effet.\n\nLes auteurs ont aussi essayé de remplacer le 3×3 par une grille d'échantillonnage plus grande. Le 5×5 donne 83,6 %, avec des paramètres qui passent de 30 M à 37 M ; le 7×7 retombe même à 82,8 %, pour 48 M de paramètres. Les points d'échantillonnage se déplacent d'eux-mêmes, et un 3×3 suffit déjà.\n\n[![Quatre fois la même photo d'un troupeau de moutons, étiquetées stage 1 à stage 4, avec une étoile bleue fixée sur un mouton à gauche. Aux stages 1 et 2, les points d'échantillonnage colorés se serrent autour de l'étoile, avec un encadré agrandi à côté ; aux stages 3 et 4, ils se dispersent sur toute la photo, sur d'autres moutons et sur l'herbe ; chaque couleur correspond à un groupe différent](/content/papers/assets/0e4e2959c920bda3aad3e121de44c615afd08bade1ea30c49dbe8f20bd801598.png)](/content/papers/assets/0e4e2959c920bda3aad3e121de44c615afd08bade1ea30c49dbe8f20bd801598.png)\n\n*Figure 5 de l'article, extraite de la [**page 8 du PDF v4**](https://arxiv.org/pdf/2211.05778v4#page=8), CC BY 4.0. L'étoile bleue est le point de requête ; chaque couleur correspond aux positions d'échantillonnage d'un groupe.*\n\nLa répartition des points d'échantillonnage suit aussi une hiérarchie. Aux deux premiers étages, ils se serrent autour du point de requête et regardent localement ; aux troisième et quatrième étages, ils se dispersent sur toute l'image. C'est très différent de ViT, global dès la première couche.\n\n### Le prix à payer\n\nLe prix principal est la vitesse. En annexe, les auteurs mesurent le débit sur un seul A100, avec des lots de 256 en 224×224 et de 2 en 800×800 :\n\n| Modèle | ImageNet top-1 | 224×224 (images/s) | 800×800 (images/s) |\n| --- | ---: | ---: | ---: |\n| ConvNeXt-B | 83,8 % | 881 | 58 |\n| RepLKNet-B | 83,5 % | 884 | 21 |\n| DAT-B | 84,0 % | 661 | 24 |\n| InternImage-B (DCNv2) | — | 311 | 16 |\n| InternImage-B | **84,9 %** | 775 | 54 |\n\n*Tableau : extrait de la Table 11 de l'article.*\n\nAvec DCNv3, le débit vaut 2,5 à 3,4 fois celui de la version DCNv2. Il reste un peu inférieur à celui de ConvNeXt-B, de 12 % en 224 et de 7 % en 800 ; en haute résolution, il atteint en revanche 2,5 fois celui de RepLKNet-B, les grands noyaux peinant sur les grandes images. Les auteurs reconnaissent aussi en conclusion que la latence des opérateurs de type DCN reste un problème pour les tâches en aval exigeantes en vitesse.\n\nL'autre point à examiner est la quantité de données. Les auteurs échantillonnent uniformément 1 %, 10 % et la totalité d'ImageNet-1K, et entraînent 300 époques sur chacun :\n\n| Modèle | 1 % | 10 % | 100 % |\n| --- | ---: | ---: | ---: |\n| ResNet-50 | **12,2 %** | **57,5 %** | 80,4 % |\n| ConvNeXt-T | 8,4 % | 52,6 % | 82,1 % |\n| Swin-T | échec | 12,1 % | 81,3 % |\n| InternImage-T | 5,9 % | 56,0 % | **83,5 %** |\n\n*Tableau : extrait de la Table 12 de l'article.*\n\nSelon les auteurs, InternImage-T est robuste avec 1 % comme avec 10 % des données. Pourtant, dans la colonne 1 %, il est battu par ResNet-50 et ConvNeXt-T, et ne devance que Swin-T, dont l'entraînement échoue purement et simplement ; à 10 %, il reste derrière ResNet-50. Qu'il supporte mieux que Swin-T un petit volume de données, c'est exact ; mais quand il ne reste que 1 % des données, ResNet-50 et ConvNeXt-T, aux biais inductifs plus forts, font encore mieux.\n\n## Conclusion\n\nLes chiffres records sont bel et bien sortis de la force brute. Il a fallu 427 millions d'images, un backbone composite aux paramètres doublés, un préentraînement sur Objects365 et DINO par-dessus pour obtenir les 65,4 sur COCO.\n\nMais ramené aux tailles courantes, avec paramètres et FLOPs alignés sur ConvNeXt, InternImage garde plus de 1 point de pourcentage d'avance sur ImageNet, et de 1,8 à 3,0 de box AP sur COCO. Ici, pas de force brute à appeler en renfort ; c'est DCNv3 lui-même qui fait la différence.\n\nPour le faire tourner vous-même, il faudra d'abord vous mettre en bons termes avec cet opérateur CUDA maison ; compilation, déploiement, export vers TensorRT, il faut passer par lui à chaque étape.\n\nUne dernière anecdote. Dans les ablations de cet article, revenir de la softmax à la sigmoïde fait chuter la précision de 83,5 % à 65,7 %. Un peu plus d'un an plus tard, à peu près la même équipe a publié DCNv4, dont l'une des deux principales modifications consiste justement à supprimer complètement la softmax ; et la convergence en devient même plus rapide.\n\nDans un article, un choix de conception clé a parfois une date de péremption d'à peine un an.\n","imageSizes":{"/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png":{"width":1012,"height":1179},"/content/papers/assets/902dfc93f6ae81a66758189ee04f89df167af4dc79a2eee9960400c444fd2515.png":{"width":1017,"height":1467},"/content/papers/assets/0e4e2959c920bda3aad3e121de44c615afd08bade1ea30c49dbe8f20bd801598.png":{"width":1012,"height":666}}}
