L’Évolution des Architectures Mobiles CNN
Introduction
Ces dernières années, les réseaux neuronaux convolutifs (convolutional neural networks, CNN) sont devenus plus faisables pour utilisation sur des systèmes embarqués et des systèmes mobiles. Des outils come Tensorflow Lite et ONNX ont encore accéléré les opportunités pour l’application du deep learning sur des systèmes embarqués. Pour la vision par ordinateur, nous utilisons souvent des architectures CNN spécialisées pour ces applications. Ce rapport offre une vue d’ensemble des architectures mobiles CNN disponibles. Nous évaluerons également un sous-set de ces modèles sur un dataset issu d’une compétition Kaggle récente. Le cas d’utilisation sera de détecter des maladies sur des pommiers en utilisant des données issues de la Compétition Kaggle 2020 sur la Pathologie des Plantes.
Consultez le Kaggle Notebook d’accompagnement → →
Architectures
MobileNet (2017)
MobileNet étaient parmi les premières initiatives de construction de CNN qui se voulaient facilement déployable sur les applications mobiles. Une des principales innovations sont les convolutions séparables en fonction de la profondeur (depthwise separable convolutions), qui sont visualisées plus bas. Une convolution séparable sépare un kernel de convolution classique en deux kernels. Par exemple, à la place d’un kernel 3x3, on obtient un kernel 3x1 et un kernel 1x3. Cette séparation réduit le nombre d’opérations nécessaires pour effectuer la convolution et donc, est bien plus efficiente. Cependant, il n’est pas toujours possible de séparer dans la dimension spatiale, et il est bien plus courant de séparer dans la dimension de profondeur (de canaux). Cette convolution séparable en fonction de la profondeur est utilisée dans MobileNet. Le papier introduit également un multiplicateur de largeur qui vous permet de facilement mettre à l’échelle un modèle CNN en fonction de votre cas d’utilisation. Ce modèle est devenu une solution facile pour la détection d’objet mobile, la détection de visage mobile, et les applications de classification d’image.
Pour une étude plus approfondie des convolutions séparables en fonction de la profondeur, consultez cet article de blog de Chi-Feng Wang.
ShuffleNet (2017) / ShuffleNetV2 (2018)
ShuffleNet a fait avancer la technologie de pointe pour les architectures mobiles CNN en présentant les convolutions de groupe par point (pointwise group convolutions) et le mélange de canaux (channel shuffle). Les convolutions de groupe par point sont utilisées pour accélérer les convolutions 1x1 communément utilisées dans les architectures mobiles CNN. Néanmoins, ces convolutions ont un effet secondaire, qui fait que les outputs d’un canal en particulier ne sont dérivées que d’une petite fraction des canaux d’input. Nous pouvons mitiger cet effet secondaire en divisant les canaux de chaque groupe en de multiples sous-groupes, ce qui est l’opération de mélange de canaux. ShuffleNetV2 propose de nombreux guides pratiques pour des architectures CNN efficientes. Il optimise davantage l’architecture avec des changements dans le goulot d’étranglement et en présentant la division de canaux (channel split). Dans l’image ci-dessous, on peut voir les différences entre ShuffleNetV1 (a., b.) et ShuffleNetV2 (c. d.).
MobileNetV2 (2018)
La V2 des séries MobileNet introduit les résiduels inversés (inverted residuals) et les goulots d’étranglement linéaires (linear bottlenecks) pour améliorer les performances de MobileNets. Les résiduels inversés permettent au réseau de calculer des activations (ReLU) de manière plus efficace, et de préserver plus d’informations après activation. Pour préserver cette information, il devient important que la dernière activation dans le goulot d’étranglement ait une activation linéaire. Le schéma ci-dessous issu du papier original MobileNetV2 montre le goulot d’étranglement, et inclue les résiduels inversés. Sur ce schéma, les blocs plus épais ont plus de canaux.
The ReLU6 activation is defined as: De plus, l’activation ReLU6 est présentée ici pour accélérer les activations pour les calculs à base précision et pour les rendre plus convenables pour la quantification. L’activation ReLU6 est définie comme
ReLU6(x)=min(max(x,0),6)ReLU6(x) = min(max(x, 0), 6)
Avec la détection d’objet et la classification d’image, ce papier démontre aussi des résultats prometteurs pour la segmentation sémantique efficiente en utilisant des techniques issues du papier DeepLabV3.
NASNetMobile (2018)
La recherche NASNet visait à rechercher une architecture CNN optimale en utilisant l’apprentissage de renforcement. NAS signifie Neural Architecture Search, Recherche d’Architecture Neuronale, et est une technique développée à Google Brain pour la recherche à travers un espace de configurations de réseaux neuronaux. NAS a été utilisé avec des datasets standards comme CIFAR10 et ImageNet pour optimiser des CNN pour différentes tailles. La version réduite est appelée NASNetMobile. Ci-dessous, vous pouvez voir la meilleure cellule convolutive réduite avec NAS et CIFAR10.
FBNet (2018)
FBNet est l’abréviation de Facebook-Berkeley-Nets et présente une famille d’architectures mobiles spécifiques à l’appareil (e.g., iPhone X et Samsung Galaxy 8) dérivée avec la recherche d’architecture neuronale. L’innovation principale, ici, est une version différentiable de recherche d’architecture neuronale (differentiable version of neural architecture search, DANS), qui est visualisée ci-dessous.
EfficientNetB0 (2019)
La recherche EfficientNet s’intéresse à la manière de mettre à l’échelle des architectures CNN de manière efficiente en utilisant le calcul de paramètres de mise à l’échelle composite. La plus petite version d’EfficientNet est EfficientNetB0. Cette architecture est similaire à NASNetMobile mais utilise principalement les goulots d’étranglement que nous avons vus dans MobileNetV2. De plus, pour cette recherche, ils ont également ajouté une optimisation squeeze-and-excite et la puissante fonction d’activation Swish. C’est une activation qui a été optimisée en utilisant l’apprentissage de renforcement (NAS) et qui est définie comme :
Swish(x)=x⋅sigmoid(βx)Swish(x) = x \cdot sigmoid(\beta x)
où β\beta peut être définie comme une constante ou comme un paramètre entraînable.
MobileNetV3 (2019)
The Hard Swish activation is defined as:MobileNetV3 présente de nombreuses astuces pour optimiser MobileNetV2, à la fois en vitesse et en performances. L’architecture a été optimisée pour les CPU de téléphones mobiles, en utilisant à la fois un NAS de détection du matériel (hardware-aware NAS) et l’algorithme NetAdapt. Pour la segmentation sémantique, MobileNetV3 a un décodeur efficace appelé Lite Reduced Atrous Spatial Pyramid Pooling" (LR-ASPP). De plus, l’activation Hard Swish est utilisée pour améliorer les activations ReLU6 et est une alternative bien plus efficiente que l’activation Swish classique. L’activation Hard Swish peut être définie comme :
hswish(x)=xReLU6(x+3)6hswish(x) = x \frac{ReLU6(x+3)}{6}
GhostNet (2020)
L’architecture GhostNet du Laboratoire Noah’s Ark de Huawei est considérée comme l’architecture mobile la plus avancée technologiquement. La caractéristique centrale de l’architecture de GhostNet est le "Module Ghost" (ghost module). Le module Ghost adopte d’abord des convolutions ordinaires pour générer des maps de caractéristiques, puis il utilise des opérations linéaires peu demandeuses pour augmenter ces maps de caractéristiques appelées "caractéristiques Ghost" (ghost features). À cause de ces opérations linéaires, l’architecture requiert beaucoup moins de FLOPS (opérations en virgule flottante par seconde) et de paramètres pour effectuer des convolutions, tandis qu’elle est encore capable d’apprendre des représentations puissantes des données. De plus, le Module Ghost contient un mappage d’identité pour préserver les maps de caractéristiques initiales. Voir le schéma ci-dessous pour comprendre les différences entre une convolution classique et un module Ghost.
Comme nous l’avons vu avec EfficientNetB0, l’optimisation squeeze-and-excite est aussi utilisée dans les couches résiduelles des goulots d’étranglement de GhostNet. Malgré les avancées dans les fonctions d’activation que nous avons relevées, GhostNet utilise toujours l’activation ReLU classique.
Expériences
Dataset
Nous utilisons des données issues de la Compétition Kaggle 2020 sur la Pathologie des Plantes. Ce dataset contient environ 1 800 images de feuilles de pommier avec 4 classes qui dénotent des maladies chez les pommiers. Ci-dessous, un échantillon des images libellées avec la classe "Multiples maladies". Notez que ceci est un dataset relativement petit et que si nous utilisions des méthodes d’apprentissage par transfert, nous aurions plus de chances d’obtenir de bien meilleurs résultats. Pour en apprendre davantage sur le dataset en lui-même, consultez l’excellent notebook d’exploration de Tarun Paparaju pour cette compétition.
Setup Expérimental
Dans cette expérience, nous évaluerons MobileNet, MobileNetV2, NASNetMobile, EfficientNetB0 et GhostNet. Nos mesures principales d’intérêt sont la précision de validation, la vitesse d’inférence par image, et le nombre de paramètres dans un modèle.
La vitesse d’inférence est mesurée en prédisant toutes les images dans notre générateur de test et en calculant le temps qu’il faut pour prédire une seule image en utilisant un générateur de Dataset TensorFlow. Notez que cette méthode est un peu brutale, parce que le temps peut varier en fonction des spécificités CPU/GPU et des autres processus en cours d’exécution. Néanmoins, cela nous donne une estimation relativement raisonnable pour estimer la vitesse du modèle.
Cette expérience utilisera les poids ImageNet pré-entraînés pour les architectures MobileNet et NASNetMobile, les poids Noisy Student pour l’affinage de EfficientNetB0. GhostNet sera entraîné en utilisant l’initialisation de poids uniforme Glorot, et nous utilisons l’implémentation de GhostNet pour Tensorflow 2 de sunnyyeah. Notre programme de taux d’apprentissage est un programme de dégradation exponentiel avec 5 epochs d’échauffement. Pour GhostNet, nous utilisons un taux d’apprentissage plus élevé, parce qu’il faut entraîner le réseau à partir d’initialisations de poids aléatoires. Nos augmentations de données sont des inversions horizontales ou verticales.
Consultez ce Kaggle Notebook pour voir le setup expérimental complet →
Résultats
EfficientNetB0 se démarque comme le meilleur modèle en termes de précision de validation, et est rapide avec un nombre relativement élevé de paramètres. MobileNetV2 offre de bons résultats et est le plus petit de notre sélection. Malheureusement, nous n’avons pas été en mesure de reproduire les résultats à la pointe de la technologie pour GhostNet dans notre problème de classification d’images. Une des raisons est probablement parce que nous n’avons pas pu utiliser de poids ImageNet pré-entraînés pour ce modèle.
Conclusion
Dans notre expérience, EfficientNetB0 obtient la plus haute précision de validation de tous les modèles. La différence en précision avec le deuxième modèle en lice, MobileNetV2, est de 1%. Comme nous nous y attendions, MobileNetV2 converge plus rapidement et est plus précis, en comparaison avec la première version de MobileNet. Néanmoins, MobileNetV2 est légèrement plus lent que MobileNet lorsque nous évaluons sur le GPU dans les Kaggle Notebooks. Notez que MobileNetV2 pourrait toujours être plus rapide sur appareils mobiles. La différence s’explique parce que les convolutions séparables en fonction de la profondeur ne sont pour l’instant pas prises en charge dans cuDNN.
Si la mémoire de travail est très limitée, MobileNetV2 serait le meilleur choix parmi tous les modèles de notre expérience. Si ce n’est pas une contrainte dure, alors EfficientNetB0 semble la meilleure architecture pour les applications mobiles pour le moment. Malheureusement, il n’est pas clair, d’après nos expériences, si l’architecture intelligente GhostNet permet aussi d’obtenir des résultats à la pointe de la technologie au-delà de datasets universitaires comme CIFAR10 ou ImageNet. Nous espérons voir davantage d’expériences sur GhostNet de la part de la communauté pour voir si cette architecture peut aussi briller sur les applications de vision par ordinateur mobile dans la vraie vie.
Derniers mots
Dans ce rapport, nous n’avons pas évalué l’effet de techniques come l’élagage de modèle (model pruning) et la quantification quantization sur ces architectures CNN. Notez bien qu’il existe un compromis distinct entre la vitesse et la précision avec ces techniques, et certaines architectures mobiles pourraient être plus à même de bénéficier de l’élagage ou de la quantification.
Nous espérons que cette introduction vous a donné un bon aperçu des architectures mobiles CNN ! Si c’est le cas, assurez-vous de jeter un œil au Kaggle notebook d’accompagnement pour ce rapport.
Si vous avez des questions ou des retours, n’hésitez pas à commenter ci-dessous. Vous pouvez également me contacter sur Twitter, @carlolepelaars.