{"notes":[{"id":"lightweight/cbam","category":"lightweight","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"CBAM","subtitle":"Où regardez-vous ?","author":"Z. Yuan","paperDate":"2018-07-17","publishedOn":"2024-07-31","world":"external/cbam","paperTitle":"CBAM: Convolutional Block Attention Module","paperUrl":"https://arxiv.org/abs/1807.06521","bibliography":{"title":"CBAM: Convolutional Block Attention Module","authors":["Sanghyun Woo","Jongchan Park","Joon-Young Lee","In So Kweon"],"url":"https://arxiv.org/abs/1807.06521","pdfUrl":"https://arxiv.org/pdf/1807.06521v2","codeUrl":null,"preprint":{"id":"1807.06521","submittedOn":"2018-07-17","url":"https://arxiv.org/abs/1807.06521"},"publication":{"venue":"ECCV","year":2018,"kind":"conference","url":"https://openaccess.thecvf.com/content_ECCV_2018/html/Sanghyun_Woo_Convolutional_Block_Attention_ECCV_2018_paper.html"},"citation":"@misc{lightweightcbam2018,\n  title = {{CBAM: Convolutional Block Attention Module}},\n  author = {Sanghyun Woo and Jongchan Park and Joon-Young Lee and In So Kweon},\n  year = {2018},\n  eprint = {1807.06521},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1807.06521}\n}\n","citationPath":"/content/papers/citations/lightweight/cbam.bf1587b50fdf.bib"},"thumbnail":{"src":"/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png","width":1395,"height":713},"locale":"fr","path":"/content/papers/fr/lightweight/cbam.14839fd9aaef.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"structure-densemble","text":"Structure d'ensemble","depth":3},{"id":"lattention-par-canal","text":"L'attention par canal","depth":3},{"id":"lattention-spatiale","text":"L'attention spatiale","depth":3},{"id":"lassemblage","text":"L'assemblage","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"une-conception-fixée-pas-à-pas","text":"Une conception fixée pas à pas","depth":3},{"id":"résultats-sur-différents-réseaux","text":"Résultats sur différents réseaux","depth":3},{"id":"détection","text":"Détection","depth":3},{"id":"où-regarde-le-modèle","text":"Où regarde le modèle ?","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/senet","relation":"referenced","topic":""},{"id":"classic-cnns/wide-resnet","relation":"referenced","topic":""},{"id":"classic-cnns/xception","relation":"referenced","topic":""}]},{"id":"lightweight/senet","category":"lightweight","legacyPath":"lightweight/1709-senet","legacySlug":"1709-senet","legacyPaths":[],"title":"SENet","subtitle":"Presser ! Encore plus fort !","author":"Z. Yuan","paperDate":"2017-09-05","publishedOn":"2024-06-28","paperTitle":"Squeeze-and-Excitation Networks","paperUrl":"https://arxiv.org/abs/1709.01507","bibliography":{"title":"Squeeze-and-Excitation Networks","authors":["Jie Hu","Li Shen","Samuel Albanie","Gang Sun","Enhua Wu"],"url":"https://arxiv.org/abs/1709.01507","pdfUrl":"https://arxiv.org/pdf/1709.01507","codeUrl":null,"preprint":{"id":"1709.01507","submittedOn":"2017-09-05","url":"https://arxiv.org/abs/1709.01507"},"publication":{"venue":"CVPR","year":2018,"kind":"conference","url":"https://arxiv.org/abs/1709.01507"},"citation":"@misc{lightweightsenet2017,\n  title = {{Squeeze-and-Excitation Networks}},\n  author = {Jie Hu and Li Shen and Samuel Albanie and Gang Sun and Enhua Wu},\n  year = {2017},\n  eprint = {1709.01507},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1709.01507}\n}\n","citationPath":"/content/papers/citations/lightweight/senet.1766a7978dde.bib"},"thumbnail":{"src":"/content/papers/assets/322f16ed8c782ffbdd7d7db3e8292c991908e3543dc69e1addd9238e22484363.jpg","width":1688,"height":394},"locale":"fr","path":"/content/papers/fr/lightweight/senet.cf880cb85b0f.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"architecture-du-modèle","text":"Architecture du modèle","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"résultats-en-classification-dimages","text":"Résultats en classification d'images","depth":3},{"id":"résultats-sur-les-modèles-légers","text":"Résultats sur les modèles légers","depth":3},{"id":"limportance-de-squeeze","text":"L'importance de Squeeze","depth":3},{"id":"limportance-dexcitation","text":"L'importance d'Excitation","depth":3},{"id":"autres-résultats-expérimentaux","text":"Autres résultats expérimentaux","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/mobilenet-v3","relation":"comparison","topic":"Attention par canal dans les réseaux légers"},{"id":"lightweight/pp-lcnet","relation":"comparison","topic":"Attention par canal dans les réseaux légers"}]},{"id":"classic-cnns/wide-resnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Wide ResNet","subtitle":"Plus large, pas plus profond","author":"Z. Yuan","paperDate":"2016-05-23","publishedOn":"2024-02-14","world":"external/wide-resnet","paperTitle":"Wide Residual Networks","paperUrl":"https://arxiv.org/abs/1605.07146","bibliography":{"title":"Wide Residual Networks","authors":["Sergey Zagoruyko","Nikos Komodakis"],"url":"https://arxiv.org/abs/1605.07146","pdfUrl":"https://arxiv.org/pdf/1605.07146v4","codeUrl":null,"preprint":{"id":"1605.07146","submittedOn":"2016-05-23","url":"https://arxiv.org/abs/1605.07146"},"publication":{"venue":"BMVC","year":2016,"kind":"conference","url":"https://doi.org/10.5244/C.30.87"},"citation":"@misc{classiccnnswideresnet2016,\n  title = {{Wide Residual Networks}},\n  author = {Sergey Zagoruyko and Nikos Komodakis},\n  year = {2016},\n  eprint = {1605.07146},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1605.07146}\n}\n","citationPath":"/content/papers/citations/classic-cnns/wide-resnet.2e42de74f658.bib"},"thumbnail":{"src":"/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png","width":1400,"height":500},"locale":"fr","path":"/content/papers/fr/classic-cnns/wide-resnet.695ffb96d3d8.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"des-resnet-de-plus-en-plus-minces","text":"Des ResNet de plus en plus minces","depth":3},{"id":"un-raccourci-trop-facile","text":"Un raccourci trop facile","depth":3},{"id":"les-réseaux-minces-et-profonds-ne-vont-pas-vite-non-plus","text":"Les réseaux minces et profonds ne vont pas vite non plus","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"ce-que-lon-peut-modifier","text":"Ce que l'on peut modifier","depth":3},{"id":"wrn-n-k","text":"WRN-n-k","depth":3},{"id":"que-mettre-dans-le-bloc","text":"Que mettre dans le bloc ?","depth":3},{"id":"un-dropout-dans-le-bloc","text":"Un dropout dans le bloc","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"répartir-largeur-et-profondeur","text":"Répartir largeur et profondeur","depth":3},{"id":"face-aux-resnet-à-mille-couches","text":"Face aux ResNet à mille couches","depth":3},{"id":"les-réseaux-larges-vont-plus-vite","text":"Les réseaux larges vont plus vite","depth":3},{"id":"leffet-du-dropout","text":"L'effet du dropout","depth":3},{"id":"sur-imagenet-élargir-la-couche-du-milieu","text":"Sur ImageNet, élargir la couche du milieu","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""},{"id":"classic-cnns/stochastic-depth","relation":"referenced","topic":""}]},{"id":"classic-cnns/xception","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Xception","subtitle":"Au bout d'Inception","author":"Z. Yuan","paperDate":"2016-10-07","publishedOn":"2024-03-20","world":"external/xception","paperTitle":"Xception: Deep Learning with Depthwise Separable Convolutions","paperUrl":"https://arxiv.org/abs/1610.02357","bibliography":{"title":"Xception: Deep Learning with Depthwise Separable Convolutions","authors":["François Chollet"],"url":"https://arxiv.org/abs/1610.02357","pdfUrl":"https://arxiv.org/pdf/1610.02357v3","codeUrl":null,"preprint":{"id":"1610.02357","submittedOn":"2016-10-07","url":"https://arxiv.org/abs/1610.02357"},"publication":{"venue":"CVPR","year":2017,"kind":"conference","url":"https://openaccess.thecvf.com/content_cvpr_2017/html/Chollet_Xception_Deep_Learning_CVPR_2017_paper.html"},"citation":"@misc{classiccnnsxception2016,\n  title = {{Xception: Deep Learning with Depthwise Separable Convolutions}},\n  author = {François Chollet},\n  year = {2016},\n  eprint = {1610.02357},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1610.02357}\n}\n","citationPath":"/content/papers/citations/classic-cnns/xception.3a6fa7188c36.bib"},"thumbnail":{"src":"/content/papers/assets/b56e8b540dd5a4cb9856460b3e47a6e3e624df308ab08b70809438075caf5f0a.png","width":917,"height":538},"locale":"fr","path":"/content/papers/fr/classic-cnns/xception.c7752fc8989d.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"un-autre-regard-sur-le-module-inception","text":"Un autre regard sur le module Inception","depth":3},{"id":"diviser-jusquau-bout","text":"Diviser jusqu'au bout","depth":3},{"id":"lautre-extrémité-du-spectre","text":"L'autre extrémité du spectre","depth":3},{"id":"xception","text":"Xception","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"jft","text":"JFT","depth":3},{"id":"autant-de-paramètres-un-peu-plus-lent","text":"Autant de paramètres, un peu plus lent","depth":3},{"id":"les-connexions-résiduelles","text":"Les connexions résiduelles","depth":3},{"id":"une-activation-au-milieu","text":"Une activation au milieu ?","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/inception-v1","relation":"referenced","topic":""},{"id":"classic-cnns/inception-v3","relation":"referenced","topic":""},{"id":"lightweight/mobilenet-v1","relation":"referenced","topic":""}]}],"text":"En 2017, SENet remporte la classification de la dernière édition de l'ILSVRC. Il ajoute après chaque bloc convolutif un tout petit module, qui réduit d'abord chaque canal à un seul nombre par une moyenne, puis calcule avec deux couches entièrement connectées un poids pour chaque canal, et multiplie la carte de caractéristiques d'origine par ces poids. À peine quelques paramètres de plus, pour une nette hausse de précision.\n\n\n> [!TIP]\n> \n> Pour SENet, vous pouvez commencer par notre note :\n> \n> - **[[17.09] SENet : Presser ! Encore plus fort !](/blog/papers/lightweight/senet)**\n\n\nSanghyun Woo et ses collègues, du KAIST et de Lunit en Corée et d'Adobe Research aux États-Unis, poussent la réflexion plus loin à partir de SENet. Suffit-il de regarder la moyenne pour pondérer les canaux ? En plus de choisir « quels canaux regarder », ne faudrait-il pas aussi décider « quelles positions regarder » ?\n\n## Définir le problème\n\nLes auteurs partent de quelques grandes directions de la conception des réseaux. Un réseau peut devenir plus profond, comme VGG ou ResNet ; plus large, comme Wide ResNet ; ou gagner en cardinalité, comme Xception et ResNeXt. Nous avons consacré des notes à ces trois directions, sur [Wide ResNet](/blog/papers/classic-cnns/wide-resnet), [Xception](/blog/papers/classic-cnns/xception) et [ResNeXt](/blog/papers/classic-cnns/resnext).\n\nLes auteurs veulent aborder la question sous un autre angle, celui de l'attention, pour que le réseau mette en avant les caractéristiques importantes et atténue celles dont il n'a pas besoin.\n\nLa convolution mélange déjà les informations des canaux et de l'espace ; les auteurs font donc suivre ces deux mêmes directions à l'attention. L'attention par canal décide « quoi regarder », car chaque canal peut être vu comme un détecteur de caractéristiques ; l'attention spatiale décide « où regarder ».\n\nSENet n'a traité que la moitié canal, et ne recueille l'information que par pooling moyen. Les auteurs estiment qu'il reste de la marge sur ces deux points, tout en voulant garder un module léger, que l'on puisse insérer directement dans n'importe quel réseau convolutif.\n\n## Résoudre le problème\n\n### Structure d'ensemble\n\n[![Structure d'ensemble de CBAM : l'Input Feature entre d'abord dans le Channel Attention Module, et l'attention par canal obtenue est multipliée par l'entrée ; le résultat entre ensuite dans le Spatial Attention Module, et l'attention spatiale obtenue est multipliée une seconde fois, ce qui donne la Refined Feature](/content/papers/assets/6bb23fb7d2af72e07e37ef41762e65dd79a4f36a6b6309ea002c27127650f5bd.png)](/content/papers/assets/6bb23fb7d2af72e07e37ef41762e65dd79a4f36a6b6309ea002c27127650f5bd.png)\n\n*Fig. 1 de l'article, extraite de la [**page 2 du PDF v2**](https://arxiv.org/pdf/1807.06521v2#page=2). CBAM se compose de deux sous-modules, canal puis spatial, placés à la suite.*\n\nÉtant donné une carte de caractéristiques intermédiaire $\\mathbf{F}\\in\\mathbb{R}^{C\\times H\\times W}$, CBAM calcule d'abord une attention par canal 1D $\\mathbf{M_c}\\in\\mathbb{R}^{C\\times1\\times1}$, puis une attention spatiale 2D $\\mathbf{M_s}\\in\\mathbb{R}^{1\\times H\\times W}$ :\n\n$$\n\\mathbf{F}'=\\mathbf{M_c}(\\mathbf{F})\\otimes\\mathbf{F},\\qquad\n\\mathbf{F}''=\\mathbf{M_s}(\\mathbf{F}')\\otimes\\mathbf{F}'.\n$$\n\n$\\otimes$ est la multiplication élément par élément ; là où les formes diffèrent, la diffusion (broadcasting) les complète. L'attention par canal a un nombre par canal, recopié sur tout le plan lors de la multiplication ; l'attention spatiale a un nombre par position, recopié sur tous les canaux.\n\n[![Détail des deux sous-modules. En haut, dans le cadre vert, le Channel Attention Module : l'Input feature F passe par un MaxPool et un AvgPool, qui donnent deux vecteurs, envoyés chacun dans le même Shared MLP ; les deux sorties sont additionnées puis passent par une sigmoïde, ce qui donne la Channel Attention Mc. En bas, dans le cadre violet, le Spatial Attention Module : la Channel-refined feature F' subit un MaxPool et un AvgPool le long des canaux, empilés en deux cartes, qui passent par une conv layer et une sigmoïde pour donner la Spatial Attention Ms](/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png)](/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png)\n\n*Fig. 2 de l'article, extraite de la [**page 5 du PDF v2**](https://arxiv.org/pdf/1807.06521v2#page=5). Les sous-modules d'attention par canal et d'attention spatiale.*\n\nLes deux sous-modules procèdent de façon très symétrique. Chacun compresse d'abord l'information par un pooling moyen et un max pooling le long d'une direction, puis calcule l'attention avec un petit réseau. Voyons-les l'un après l'autre.\n\n### L'attention par canal\n\nL'attention par canal doit réduire les $H\\times W$ valeurs de chaque canal à un seul nombre. SENet utilise le pooling moyen ; selon les auteurs, il faudrait y ajouter le max pooling.\n\nPourquoi ? Prenons un exemple extrême. Supposons deux canaux, l'un valant 0,1 partout sur une carte $10\\times10$, l'autre valant 10 en une seule position et 0 partout ailleurs :\n\n```python\nimport torch\n\nflat = torch.full((10, 10), 0.1)                   # canal A : 0.1 partout\npeak = torch.zeros(10, 10); peak[3, 6] = 10.0       # canal B : une seule position très lumineuse\nF = torch.stack([flat, peak])                      # [C=2, H=10, W=10]\n\nprint(\"pooling moyen :\", [round(v, 4) for v in F.mean(dim=(1, 2)).tolist()])\nprint(\"max pooling :\", [round(v, 4) for v in F.amax(dim=(1, 2)).tolist()])\n```\n\n```text\npooling moyen : [0.1, 0.1]\nmax pooling : [0.1, 10.0]\n```\n\nÀ ne regarder que la moyenne, les deux canaux sont identiques ; le maximum révèle que le second canal réagit très fortement quelque part. Pour les auteurs, le pooling moyen fournit une statistique globale douce, tandis que le max pooling retient l'intensité de la partie la plus saillante, et les deux se complètent.\n\nLes résultats des deux poolings passent par **le même** MLP, et les sorties sont additionnées avant de passer par une sigmoïde :\n\n$$\n\\mathbf{M_c}(\\mathbf{F})=\\sigma\\big(\\mathrm{MLP}(\\mathrm{AvgPool}(\\mathbf{F}))+\\mathrm{MLP}(\\mathrm{MaxPool}(\\mathbf{F}))\\big).\n$$\n\nLe MLP n'a qu'une couche cachée, de taille $C/r$, où $r$ est le taux de réduction, fixé à 16 comme dans SENet. Comme le MLP est partagé, le nombre de paramètres reste le même que pour SENet.\n\n### L'attention spatiale\n\nL'attention spatiale fait l'inverse, et applique le pooling moyen et le max pooling le long des **canaux**. Les $C$ valeurs de chaque position sont réduites à deux nombres, et la carte entière devient deux cartes descriptives $H\\times W$. On les empile, puis on applique une convolution $7\\times7$, suivie d'une sigmoïde :\n\n$$\n\\mathbf{M_s}(\\mathbf{F})=\\sigma\\big(f^{7\\times7}([\\mathrm{AvgPool}(\\mathbf{F});\\mathrm{MaxPool}(\\mathbf{F})])\\big).\n$$\n\n### L'assemblage\n\nÉcrivons les deux sous-modules, et faisons-y passer une carte de caractéristiques de $14\\times14$ à 256 canaux :\n\n```python\nimport torch\nimport torch.nn as nn\n\nclass ChannelAttention(nn.Module):\n    def __init__(self, C, r=16):\n        super().__init__()\n        self.mlp = nn.Sequential(nn.Linear(C, C // r), nn.ReLU(), nn.Linear(C // r, C))   # MLP partagé\n\n    def forward(self, F):\n        avg = F.mean(dim=(2, 3))                  # [B, C]\n        mx = F.amax(dim=(2, 3))                   # [B, C]\n        Mc = torch.sigmoid(self.mlp(avg) + self.mlp(mx))\n        print(\"  attention par canal Mc :\", tuple(Mc[:, :, None, None].shape))\n        return Mc[:, :, None, None]               # [B, C, 1, 1]\n\nclass SpatialAttention(nn.Module):\n    def __init__(self, k=7):\n        super().__init__()\n        self.conv = nn.Conv2d(2, 1, k, padding=k // 2)\n\n    def forward(self, F):\n        avg = F.mean(dim=1, keepdim=True)         # [B, 1, H, W]\n        mx = F.amax(dim=1, keepdim=True)          # [B, 1, H, W]\n        desc = torch.cat([avg, mx], dim=1)        # [B, 2, H, W]\n        Ms = torch.sigmoid(self.conv(desc))\n        print(\"  descripteur spatial :\", tuple(desc.shape), \"→ attention spatiale Ms :\", tuple(Ms.shape))\n        return Ms\n\nclass CBAM(nn.Module):\n    def __init__(self, C, r=16):\n        super().__init__()\n        self.channel, self.spatial = ChannelAttention(C, r), SpatialAttention()\n\n    def forward(self, F):\n        F1 = self.channel(F) * F                  # équation (1) : multiplier d'abord par l'attention par canal\n        F2 = self.spatial(F1) * F1                # puis par l'attention spatiale\n        return F2\n\nF = torch.randn(2, 256, 14, 14)\ncbam = CBAM(256)\nout = cbam(F)\nprint(\"sortie :\", tuple(out.shape))\nprint(f\"paramètres de la partie canal {sum(p.numel() for p in cbam.channel.parameters()):,}, paramètres de la partie spatiale {sum(p.numel() for p in cbam.spatial.parameters()):,}\")\n```\n\n```text\n  attention par canal Mc : (2, 256, 1, 1)\n  descripteur spatial : (2, 2, 14, 14) → attention spatiale Ms : (2, 1, 14, 14)\nsortie : (2, 256, 14, 14)\nparamètres de la partie canal 8,464, paramètres de la partie spatiale 99\n```\n\nLa sortie a la même forme que l'entrée, si bien que CBAM peut s'insérer n'importe où. Presque tous les paramètres se trouvent dans le MLP de la partie canal ($256\\to16\\to256$) ; la partie spatiale n'a qu'une convolution $7\\times7$ de $2\\to1$, soit 99 paramètres.\n\nDans ResNet, CBAM s'applique à la sortie des convolutions de chaque bloc résiduel, avant l'addition avec le raccourci, à la même place que SENet. timm en propose aussi une version toute faite, et `timm.layers.create_attn(\"cbam\", channels)` renvoie un `CbamModule`.\n\n## Discussion\n\nSauf mention contraire, les expériences portent sur ImageNet-1K et rapportent le taux d'erreur sur l'ensemble de validation, en recadrage unique. Tous les réseaux ont été réentraînés par les auteurs eux-mêmes avec PyTorch, SENet compris ; les chiffres de SE dans les tableaux sont ceux de leur reproduction, et ne coïncident pas tout à fait avec ceux de l'article de SENet.\n\n### Une conception fixée pas à pas\n\nLes auteurs fixent d'abord ResNet-50, puis décident tour à tour comment calculer l'attention par canal, comment calculer l'attention spatiale, et comment combiner les deux.\n\n**Quel pooling pour l'attention par canal ?** Cette série n'utilise que l'attention par canal, avec $r=16$ :\n\n| Configuration | Erreur top-1 | Erreur top-5 |\n| --- | ---: | ---: |\n| ResNet-50 | 24,56 % | 7,50 % |\n| + pooling moyen (c'est-à-dire SE) | 23,14 % | 6,70 % |\n| + max pooling | 23,20 % | 6,83 % |\n| + pooling moyen et max pooling | **22,80 %** | **6,52 %** |\n\n*Tableau : extrait de la Table 1 de l'article.*\n\nLe max pooling seul fait à peu près aussi bien que le pooling moyen ; les deux ensemble font le mieux, avec 0,34 point de pourcentage d'erreur de moins que SE, sans paramètre supplémentaire.\n\n**Comment calculer l'attention spatiale ?** Elle est placée après l'attention par canal de l'étape précédente, et la comparaison porte sur deux façons de produire les cartes descriptives, le pooling le long des canaux proposé par les auteurs et une couche de convolution $1\\times1$ qui réduit les canaux à un seul ; pour la taille du noyau, on compare 3 et 7 :\n\n| Configuration | Erreur top-1 | Erreur top-5 |\n| --- | ---: | ---: |\n| Attention par canal seule | 22,80 % | 6,52 % |\n| + spatiale (convolution $1\\times1$, $k=3$) | 22,96 % | 6,64 % |\n| + spatiale (convolution $1\\times1$, $k=7$) | 22,90 % | 6,47 % |\n| + spatiale (pooling moyen et max, $k=3$) | 22,68 % | 6,41 % |\n| + spatiale (pooling moyen et max, $k=7$) | **22,66 %** | **6,31 %** |\n\n*Tableau : extrait de la Table 2 de l'article.*\n\nLes deux versions qui produisent les cartes descriptives par convolution $1\\times1$ font même moins bien en top-1 que l'attention par canal seule ; seul le pooling le long des canaux apporte un gain. Le noyau le plus grand fait mieux ; selon les auteurs, juger quelles zones sont importantes demande un champ de vision plus large.\n\n**Dans quel ordre placer les deux sous-modules ?**\n\n| Disposition | Erreur top-1 | Erreur top-5 |\n| --- | ---: | ---: |\n| Canal seul (SE) | 23,14 % | 6,70 % |\n| Canal, puis spatial | **22,66 %** | **6,31 %** |\n| Spatial, puis canal | 22,78 % | 6,42 % |\n| En parallèle, somme puis sigmoïde | 22,95 % | 6,59 % |\n\n*Tableau : extrait de la Table 3 de l'article.*\n\nLa disposition séquentielle fait mieux que la disposition parallèle, et l'ordre canal puis spatial est encore légèrement meilleur ; c'est le CBAM final.\n\nEn enchaînant les trois tableaux, on passe des 23,14 % de SE aux 22,66 % de CBAM, soit un gain total de 0,48 point de pourcentage. Sur ce total, 0,34 point vient du max pooling ajouté à l'attention par canal, et l'attention spatiale apporte 0,14 point de plus.\n\n### Résultats sur différents réseaux\n\nLes auteurs insèrent ensuite CBAM dans divers réseaux, et le comparent à la version d'origine et à la version avec SE :\n\n| Réseau | Original | + SE | + CBAM | Paramètres (original → avec module) |\n| --- | ---: | ---: | ---: | ---: |\n| ResNet-18 | 29,60 % | 29,41 % | **29,27 %** | 11,69 M → 11,78 M |\n| ResNet-34 | 26,69 % | 26,13 % | **25,99 %** | 21,80 M → 21,96 M |\n| ResNet-50 | 24,56 % | 23,14 % | **22,66 %** | 25,56 M → 28,09 M |\n| ResNet-101 | 23,38 % | 22,35 % | **21,51 %** | 44,55 M → 49,33 M |\n| WideResNet-18 (largeur ×1,5) | 26,85 % | 26,21 % | **26,10 %** | 25,88 M → 26,08 M |\n| WideResNet-18 (largeur ×2) | 25,63 % | 24,93 % | **24,84 %** | 45,62 M → 45,97 M |\n| ResNeXt-50 (32×4d) | 22,85 % | **21,91 %** | 21,92 % | 25,03 M → 27,56 M |\n| ResNeXt-101 (32×4d) | 21,54 % | 21,17 % | **21,07 %** | 44,18 M → 48,96 M |\n\n*Tableau : extrait de la Table 4 de l'article ; erreur top-1 sur ImageNet-1K. SE et CBAM ont des nombres de paramètres presque identiques ; ce sont ceux de CBAM qui figurent ici.*\n\nCBAM fait mieux que la version d'origine sur tous les réseaux, et mieux que SE dans la plupart des cas ; le plus grand écart concerne ResNet-101 (0,84 point de pourcentage de moins que SE). Sur ResNeXt-50, il fait jeu égal avec SE. Le surcoût de calcul est minime, ResNet-50 passant de 3,858 à 3,864 GFLOPs.\n\nLes auteurs ont aussi essayé le MobileNet, un réseau léger. Le MobileNet d'origine a une erreur top-1 de 31,39 %, contre 29,97 % avec SE et 29,01 % avec CBAM ; pour la version dont la largeur est réduite à 0,7 fois, les trois chiffres sont respectivement de 34,86 %, 32,50 % et 31,51 %.\n\n### Détection\n\nSur COCO, avec Faster R-CNN et CBAM ajouté au backbone, la mAP@[.5:.95] passe de 27,0 à 28,1 pour ResNet-50, et de 29,1 à 30,8 pour ResNet-101.\n\nSur VOC 2007, les auteurs placent cette fois CBAM dans le détecteur, avec un module devant chaque classifieur de StairNet, un détecteur fondé sur SSD. Avec un backbone VGG16, la mAP@0.5 passe de 78,9 à 79,3 (79,1 avec SE) ; avec un backbone MobileNet, de 70,1 à 70,5 (70,0 avec SE). En détection, les gains se situent environ entre 0,4 et 1,7 point de pourcentage.\n\n### Où regarde le modèle ?\n\nLes auteurs utilisent Grad-CAM pour afficher les régions que le réseau regarde quand il décide. Grad-CAM généralise CAM ; il calcule à partir du gradient l'importance de chaque position pour une classe donnée, sans exiger que le réseau se termine par un pooling moyen global.\n\n\n> [!TIP]\n> \n> Pour CAM, vous pouvez lire notre note :\n> \n> - **[[15.12] CAM : Où regarde le modèle ?](/blog/papers/classic-cnns/cam)**\n\n\n[![Visualisations Grad-CAM, en six colonnes, pour les classes Tailed frog, Toilet tissue, Loudspeaker, Spider web, American egret et Tank. La première ligne montre les images d'entrée ; les trois lignes suivantes montrent les cartes de chaleur de ResNet50, ResNet50 + SE et ResNet50 + CBAM, chacune avec, en dessous, le score softmax P du réseau pour la bonne classe. Dans la ligne de CBAM, les zones rouges couvrent le plus souvent l'objet entier, avec les scores les plus élevés ; pour Tank, par exemple, le score passe de 0,14763 et 0,15367 à 0,53005](/content/papers/assets/80d662363e321efb620082338d5820d7ffec1bee0ef0cb792b3b69e58a759f43.png)](/content/papers/assets/80d662363e321efb620082338d5820d7ffec1bee0ef0cb792b3b69e58a759f43.png)\n\n*Les six premières colonnes de la moitié supérieure de la Fig. 5 de l'article, extraites de la [**page 12 du PDF v2**](https://arxiv.org/pdf/1807.06521v2#page=12). Le P sous chaque image est le score softmax du réseau pour la bonne classe.*\n\nDans chaque colonne, de haut en bas, on trouve l'image d'origine, puis les cartes de chaleur de ResNet-50, de la version avec SE et de la version avec CBAM. Pour l'aigrette (American egret), la zone rouge du ResNet-50 d'origine se concentre autour de la tête, alors que celle de CBAM s'étend le long de tout le corps, et le score de la bonne classe passe de 0,64 à 0,87. La colonne du char est encore plus parlante, avec un score qui bondit d'environ 0,15 à 0,53.\n\nLes auteurs avancent donc l'hypothèse que le progrès de CBAM vient d'une attention plus juste, ainsi que d'une meilleure suppression des perturbations dues aux fonds encombrés. Ce sont des exemples choisis ; ils illustrent ce que fait le module, mais pour le quantifier, il faut revenir aux tableaux précédents.\n\n## Conclusion\n\nL'attention par canal de CBAM s'appuie sur le max pooling en plus du pooling moyen ; s'y ajoute ensuite une attention spatiale, qui décide quelles positions regarder. Les deux sous-modules se suivent sur la branche résiduelle, avec presque autant de paramètres que SE.\n\nDans le détail, sur ResNet-50, la plus grande partie des 0,48 point de pourcentage gagnés sur SE vient du max pooling ; l'attention spatiale, chargée de l'autre moitié du travail, n'apporte que 0,14 point et se fait plutôt discrète. Si vous ne voulez toucher qu'à très peu de choses, remplacer le pooling moyen de SE par « moyen plus max » vous donnera l'essentiel du bénéfice.\n\nQuant aux figures Grad-CAM, CBAM y regarde le plus juste dans chaque colonne, avec à chaque fois le score le plus élevé. Les auteurs ont choisi eux-mêmes les exemples à mettre dans l'article ; forcément, ils sont flatteurs. Pour juger de l'utilité du module, mieux vaut revenir aux tableaux précédents.\n","imageSizes":{"/content/papers/assets/6bb23fb7d2af72e07e37ef41762e65dd79a4f36a6b6309ea002c27127650f5bd.png":{"width":1446,"height":437},"/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png":{"width":1395,"height":713},"/content/papers/assets/80d662363e321efb620082338d5820d7ffec1bee0ef0cb792b3b69e58a759f43.png":{"width":960,"height":713}}}
