jeudi 2 mars 2023

Comprendre les liens résiduelles - Deep Learning

Comprendre les liens résiduelles

Avant la découverte des réseaux à liens résiduels, l'entraînement de réseaux de neurones profonds était très difficile car les gradients avaient du mal à se propager à travers toutes les couches pour modifier les poids du réseau. Parmi les problèmes d’apprentissage dans les réseaux profonds se trouve l'évanescence du gradient.

Une partie, d’un petit peu, d’un fragment, d’un reste, d’un soupçon, d’une miette, d’un chouilla, …

Lorsque l'on entraîne un réseau de neurones à plusieurs couches, l'algorithme de rétropropagation de l'erreur progresse vers les couches inférieures, ce qui rend les gradients de plus en plus petits. Cela signifie que la mise à jour des poids des connexions de la couche inférieure par descente de gradient est très faible, ce qui peut empêcher une convergence efficace de l'entraînement.

Un début de solution structurelle a été mise en place dans le modèle GoogLeNet en 2014. Elle consiste à ajouter, en plusieurs points du modèle, des têtes de sorties pour réinjecter des gradients entre les couches.

Comment entraîner des réseaux profonds ?

Les liens résiduels, également appelés connexions résiduelles, ont été introduits dans le réseau ResNet (Residual Network) en 2015, dans l'article "Deep Residual Learning for Image Recognition" par Kaiming He, Xiangyu Zhang, Shaoqing Ren et Jian Sun.

Voici la représentation d'un lien ResNet tel qu’il est représenté dans le papier de 2015.

De fait, nous ne cherchons pas à faire converger la fonction Y = f( X ) mais Y = f( X ) + X

À première vue, nous ne comprenons pas pourquoi ajouter l'entrée du réseau avec sa sortie fonctionne. Cela semble illogique. Pourquoi cela marche ?

Un peu de math ( sans le formalisme )

La raison du fonctionnement du lien résiduel se cache derrière le calcul des gradients. Le gradient est obtenu en accumulant toutes les dérivées partielles calculées pour chaque poids du réseau. Sans entrer dans les détails, il se trouve que la dérivée partielle agit de la manière suivante :

La multiplication divise le gradient.
L'addition distribue le gradient.

Les couches de convolutions sont principalement constituées de multiplications et elles participent grandement à la disparition du gradient. Avec une opération d’addition, les liens résiduels contournent les convolutions et préservent la dynamique des gradients.

C'est presque magique !

Oui. Presque car les liens résiduels apportent leurs lots de contraintes structurelles. En effet, pour pouvoir ajouter le tenseur d'entrée avec le tenseur de sortie d’une couche, il faut avoir la même dimension en amont et en aval.

Impossible, donc, d’avoir des opérations de pooling ou de changer le nombre de couches dans un bloc avec un lien résiduel. L'opération d’addition est contraignante sur les dimensions. Il est possible d’utiliser l'opération de concaténation qui est plus souple (comme dans U-Net) mais c’est au détriment du combinatoire des couches suivantes.

La solution est donc d'intercaler, a chaque réduction de dimension, des couches de convolutions entre les blocs resnet.

Conclusion

Les liens résiduels sont des chemins privilégiés d’irrigations des gradients. Ils sont présents dans la grande majorité des architectures comme DenseNet, EfficientNet, ConvNext, LSTM ou même les transformers.

Merci de votre attention (Is all you need !).

lundi 29 novembre 2021

Google Brain - Ventilator Pressure Prediction

 Cet article est un rapport de compétition Kaggle Google Brain - Ventilator Pressure Prediction.

Kaggle est une plateforme web organisant des compétitions en science des données. Sur cette plateforme, les entreprises proposent des problèmes en science des données et offrent un prix aux datalogistes obtenant les meilleures performances. L'entreprise a été fondée en 2010 par Anthony Goldbloom. (Source Wikipedia ).


Problématique

Nous avons choisi de participer a la compétition “Ventilator Pressure Prediction”. Le but de cette compétition est de produire un modèle capable de simuler le comportement des patients sous ventilation artificielle. Avoir une simulation numérique permettra d'améliorer la régulation des appareils respiratoires. 



Compétition:

https://www.kaggle.com/c/ventilator-pressure-prediction


Notebook:

https://www.kaggle.com/manuelmasiello/ventilator-pressure-prediction-using-cnn-lstm/notebook

Etudes des données

Les données sont de type time series. Elles sont composées de 75450 séquences de respirations d’une taille toujours égale de 80 data points. Ces séquences sont des enregistrements de pression ainsi que des consignes données aux appareils respiratoires. Voici la liste des champs et l’explication de leurs valeurs.



id

Identifiant unique de chaque donnée. Il n’y a pas d’information à en tirer. 

breath_id

Identifiant unique des séquences de respiration. Utile pour découper les séquences. Ne donne pas d’information pour la prédiction.

R

Attribut pulmonaire indiquant à quel point les voies respiratoires sont restreintes (en cmH2O/L/S). Information essentielle pour la prédiction. Trois valeurs possibles: 5, 20 et 50.

C

Attribut pulmonaire indiquant le degré de conformité du poumon (en mL/cmH2O). Information essentielle pour la prédiction. Trois valeurs possibles: 5, 20 et 50.

time_step

Pas d’avancement dans la séquence de respiration. Information sans intérêt. Les séquences sont à taille fixe et à échantillonnage régulier. Nous n’avons pas besoin d’information temporelle dans la séquence. 

u_in

Commande de l'électrovanne inspiratoire. Information importante pour la prédiction. Valeur de 0 à 100. 

u_out

Commande de l'électrovanne exploratrice. Soit 0, soit 1.

pressure

La valeur que nous cherchons à prédire. Pression des voies aériennes mesurée dans le circuit respiratoire, mesurée en cmH2O.

Tableau des différentes colonnes du fichier .csv


Courbes des features R, C, u_out, u_in et pressure.



La première séquence du jeu de données. A gauche la période d'inspiration, à droite la période d’expiration.




Schéma de fonctionnement de l'expérience ayant donné les données du dataset.

Préparation des données

Normalisation des données

Nous appliquons l’algorithme sklearn.preprocessing.MinMaxScaler pour normaliser et borner les colonnes entre 0 et +1.



R

C

u_in

u_out

pressure

breath_id






1

0.333333

1.0

0.000833

0.0

0.115911

1

0.333333

1.0

0.183830

0.0

0.116965

1

0.333333

1.0

0.225093

0.0

0.146470

...

...

...

...

...

...

125749

1.000000

0.0

0.015590

1.0

0.085353

125749

1.000000

0.0

0.012727

1.0

0.089568

125749

1.000000

0.0

0.014827

1.0

0.086407

Extrait des données normalisées.

Séquençage

Les données vont être groupées par “breath_id” dans des tableaux à 3 dimensions.


Évaluation

Pour évaluer le modèle, nous utiliserons une validation simple d’un groupe d'entraînement de 69414 séquences (92%) et d’un groupe de test de 6036 séquences (8%). Par ces proportions, nous cherchons à vérifier que l’apprentissage se déroule bien plutôt que d'évaluer la qualité de la prédiction.   

Modèle proposé

La taille fixe des séquences nous permet d’envisager l’usage d’un réseau de neurones convolutifs (CNN) pour abstraire l’information via des kernels de convolution. En utilisant les paramètres du layer padding='same' et strides=2 nous pouvons réduire la taille en sortie du layer par 2. La taille des séquences, 80, nous permet d’envisager 4 couches d’abstraction avec réduction de taille (40, 20, 10, 5). 


A la sortie de la dernière couche de convolution, nous avons une représentation abstraite du signal. Pour prédire la pression, nous devons dé-abstraite le signal avec des couches de convolution inverse. La taille des kernels, et le nombre de kernels ont été fixés empiriquement par l’usage de la librairie Keras Tuner. Pour finir, nous ajoutons un couche Dropout 0.1 ainsi qu’une couche Dense pour avoir une sortie avec la shape (80, 1).

Apprentissage

Nous avons utilisé différentes stratégies pendant l’apprentissage. Nous commençons l’apprentissage avec un “learning rate” de “0.00018”.


ModelCheckpoint

Cette stratégie enregistre le modèle avec le meilleur score d'évaluation.

monitor=’val_loss’


EarlyStopping

Cette stratégie arrête l’apprentissage s' il ne permet plus d'améliorer l'évaluation. 

monitor=’val_loss’

patience=4

ReduceLROnPlateau

Cette stratégie permet de réduire le paramètre learning rate si l’apprentissage ne s'améliore plus.

monitor=’val_loss’, factor=0.9, patience=2





Courbe d’apprentissage

Résultats

Différence absolue moyenne entre la valeur “pressure” et la prédiction pour le jeu de validation.

0.3970 MAE



Extrait de courbe. “pressure” en bleu et la prédiction en orange.




Extrait de courbe. Différente en valeur absolue entre la prédiction et la “pressure”.



 

Trois séquences quelconques. “pressure” en bleu et la prédiction en orange. 


Histogramme de la différence entre la prédiction et la “pressure”.

Axe d’amélioration

L'évaluation simple peut être remplacée par une découpe du dataset en k-fold. Ensuite, les modèles entraînés par k-fold participent au résultat d’un modèle d’ensemble.

Conclusion

Kaggle étant une compétition, le score de 0.397 MAE est dépassé par d'autres techniques plus performantes (comme BiLSTM). Toutefois, pour un usage industriel, l’algorithme obtient de très bons résultats. 



jeudi 25 novembre 2021

Changer de point de vue dans une image

Cet article est une preuve de concept pour démontrer la possibilité d'utiliser des technique de Deep Learning (CNN, GAN) pour changer de point de vue dans une image. Aucune optimisation n’a été faite pour améliorer le rendu des images. Il reste du chemin à parcourir pour une utilisation quotidienne. Bien qu’imparfait, le résultat est très encourageant et mérite d'être étudié.



Problématique

Dans le film Blade Runner réalisé par Ridley Scott en 1982, Rick Deckard, un ancien policier qui traque un groupe d’androïdes, explore des photographies avec une machine capable de deviner les parties cachées des photographies. 


Cette étude porte sur l'association de plusieurs algorithmes pour simuler le changement de l’angle de vue dans une photographie. 

Principe

Pour permettre de changer de point de vue dans une image, nous allons extraire les informations de géométrie de l’image puis trouver la position de chacun des points de l’image en trois dimensions. Les points vont être rendus dans une vue avec un déplacement de la position de la caméra. Les zones parties vides d’informations vont alors être remplies avec un algorithme de complétion des images.

Schéma de principe pour déplacer le point de vue dans une image.


Estimation de la profondeur

L’information de profondeur n’est pas présente naturellement dans les photographies. Pour faire une estimation de la profondeur, il faut reconnaître des éléments dans une image et comparer leurs échelles sur des images référentielles qui contiennent la profondeur. Ainsi, une chaise semblable à plusieurs mètres sur une photo de référence peut nous donner l’information de sa profondeur sur la photo que nous cherchons à approfondir.


Voici l'étude retenue pour l’estimation de la profondeur:


Boosting Monocular Depth Estimation Models to High-Resolution via

Content-Adaptive Multi-Resolution Merging


Abstract

Neural networks have shown great abilities in estimating depth from a single image. However, the inferred depth maps are well below one-megapixel resolution and often lack fine-grained details, which limits their practicality. Our method builds on our analysis on how the input resolution and the scene structure affects depth estimation performance. We demonstrate that there is a trade-off between a consistent scene structure and the high-frequency details, and merge low- and high-resolution estimations to take advantage of this duality using a simple depth merging network. We present a double estimation method that improves the whole-image depth estimation and a patch selection method that adds local details to the final result. We demonstrate that by merging estimations at different resolutions with changing context, we can generate multimegapixel depth maps with a high level of detail using a pre-trained model.


https://arxiv.org/pdf/2105.14021v1.pdf [1]


Les algorithmes MiDaS [2] donnent de bons résultats sur les images mais manquent de finesse dans l’estimation des petits reliefs. Boosting Binocular Depth propose une solution pour évaluer les petits reliefs.


Par nature, les CNN sont capables de travailler sur plusieurs échelles, l’idée est donc de superposer les estimations de différentes parties de l’image à échelles différentes. Ainsi, l’image de profondeur gagne en précision et ce sont toutes les parties qui participent localement et globalement dans l’estimation. 




(a) Fonctionnement de la méthode Boosting Binocular Depth : (b) Fournir l'image en basse et haute résolution au réseau, voici les résultats montrés avec MiDaS [2], et les fusionner pour obtenir une estimation de base avec une structure cohérente avec une bonne localisation des bordures. (c) Déterminons ensuite des différents morceaux (patchs) dans l'image. Ici, quelques patchs sélectionnés avec leurs estimations de profondeur. (d) Fusion des estimations de patch sur l’estimation de base de (b) pour obtenir notre résultat final à haute résolution. (source de l’image et de l’explication [1])




Quelques exemples d’estimation de profondeur avec Boosting Monocular Depth MiDas [1] .




Illusion du damier, de l'échiquier de Adelson. Illusion de couleur.


Les résultats des algorithmes d’estimations donnent des images de profondeurs vraiment attrayantes. C’est un piège de nos sens que de penser que ces images sont justes. La vision humaine étant basée sur les contrastes, il est très difficile d’estimer la qualité de l’image de profondeur. Une zone sombre entourée de noir n’est pas perçues comme la même zone entourée de blanc. L'illusion d’Edward Adelson [3] montre que deux cases A et B de même couleur mais ayant des voisines de couleurs différentes sont perçues comme de couleurs différentes. 


Notre difficulté à voir la progression d’intensité de profondeur nous empêche de bien vérifier la justesse des prédictions. Pour cela, nous pouvons considérer chaque point de l’image en 3 dimensions puis changer d’angle de vue pour voir si la profondeur est cohérente. 

Projection inverse

La projection inversée répond à la question de savoir où se trouve, en trois dimensions, le point présent à l'écran en fonction de sa profondeur. Une photographie numérique est la mesure des rayons lumineux provenant du sujet, vue à travers un écran (les capteurs numériques) et l'œil centre de convergence de tous les rayons.



image



Les exemples ont été pris par un téléphone portable Pixel3a. Sa focale est de 28 mm soit 75.4° pour l’angle d’ouverture. Nous pouvons en déduire la position des points en 3d  grâce à quelques règles de trigonométrie simples.


Exemple de projection inversée rendu dans Blender. La géométrie est enregistré dans un fichier au format stl

Changement de point de vue

Maintenant que les points sont en 3 dimensions, nous pouvons faire un rendu en déplaçant la caméra. Nous avons utilisé la librairie hardware accéléré OpenGL pour faire un rendu de la géométrie. 


A gauche: une photo à tester. A droite: les profondeurs estimées par Boosting Binocular Depth.



Image de gauche: Simulation d’une caméra à l’emplacement de convergence des rayons lumineux. Cette vue ressemble à la photo d’origine. Cela permet de s’assurer que la projection inversée est juste. Image de droite: si l’on déplace la caméra, des manques d'informations font apparaître des trous dans la géométrie.



Rendu 3d et génération du masque 

Pour générer le maillage en 3 dimensions de la géométrie, nous créons 2 triangles qui partagent 2 points en commun à partir de 4 pixels voisins sur l’image source. Un système de seuillage de distance maximum en Z permet de supprimer les triangles trop grands pour que le modèle soit cohérent. Le déplacement de la caméra fait apparaître des zones de manque d’information dans l’image. Nous allons extraire les zones vides dans un fichier image séparé.


 

A gauche: Image après le déplacement de la caméra. Les parties roses sont des endroits où il manque des données. A droite : L’image de masque extrait des parties roses de l’image de rendu.

Complétion de l’image

Nous allons utiliser un Generative Adversarial Networks pour compléter l’image dans les zones noires du masque. Pour compléter l’image, nous utilisons un Co-modulated Generative Adversarial Networks [4] pré-entraîné sur le dataset Places2 [5]. 


Large Scale Image Completion Via 

Co-modulated Generative Adversarial Networks


Abstract

Numerous task-specific variants of conditional generative adversarial networks have been developed for image completion. Yet, a serious limitation remains that all existing algorithms tend to fail when handling large-scale missing regions. To overcome this challenge, we propose a generic new approach that bridges the gap between image-conditional and recent modulated unconditional generative architectures via co-modulation of both conditional and stochastic style representations. Also, due to the lack of good quantitative metrics for image completion, we propose the new Paired/Unpaired Inception Discriminative Score (P-IDS/U-IDS), which robustly measures the perceptual fidelity of inpainted images compared to real images via linear separability in a feature space. Experiments demonstrate superior performance in terms of both quality and diversity over state-of-the-art methods in free-form image completion and easy generalization to image-to-image translation.

https://arxiv.org/pdf/2103.10428.pdf [4]



En haut, à gauche: image source. Autres images: génération d'images à différentes positions


A gauche, les images sources. A droite après un déplacement de la caméra.




Interprétation des résultats

Les images semblent cohérentes visuellement si l’on regarde l’ensemble de l’image sans se concentrer sur les détails. Une fois focalisés sur les détails, nous pouvons constater des artefacts visuels.


La personne sur la photo a des postures étranges. Cela est dû à une mauvaise estimation des formes humaines. 


Les éléments ajoutés par le Co-modulated GAN [4] sont cohérents quoique légèrement brouillés. Il est difficile de discerner le vrai du faux. 


Améliorations possibles

L’estimation de la profondeur semble souffrir d’une dérive en Z de la profondeur. Pour améliorer les images nous pouvons compenser l’estimation de profondeur.


Le réseau Co-modulated GAN [4] prend en compte uniquement les pixels proches des zones à remplir pour compléter l'image. L’utilisation d’un algorithme DGGAN [6] pour fonctionner avec la profondeur pourrait rendre plus cohérent les images. Par exemple: https://arxiv.org/pdf/2012.03197.pdf

Références

[1] S. Mahdi H. Miangoleh, Sebastian Dille, Long Mai, Sylvain Paris, Yagız Aksoy,

Simon Fraser University, Adobe Research. Boosting Monocular Depth Estimation

Models to High-Resolution via Content-Adaptive Multi-Resolution Merging.

arXiv:2105.14021v1


[2] Rene Ranftl, Katrin Lasinger, David Hafner, Konrad Schindler, and Vladlen Koltun.

Towards robust monocular depth estimation: Mixing datasets for zero-shot cross-dataset

transfer. IEEE Trans. Pattern Anal. Mach. Intell., 2020.

arXiv:1907.01341v3


[3] Illusion d’Edward Adelson http://www-bcs.mit.edu/people/adelson/illusions_demos.html


[4] Shengyu Zhao, Jonathan Cui, Yilun Sheng, Yue Dong, Xiao Liang, Eric I Chang, Yan Xu.

Large Scale Image Completion via Co-Modulated Generative Adversarial Networks.

arXiv:2103.10428


[5] Places2 dataset: http://places2.csail.mit.edu/


[6] Liangjian Chen, Shih-Yao Lin, Yusheng Xie, Yen-Yu Lin, Wei Fan, Xiaohui Xie,

University of California, Irvine, Tencent America, Amazon, National Chiao Tung University.

DGGAN: Depth-image Guided Generative Adversarial Networks for

Disentangling RGB and Depth Images in 3D Hand Pose Estimation.

arXiv:2012.03197v1




Comprendre les liens résiduelles - Deep Learning

Comprendre les liens résiduelles Avant la découverte des réseaux à liens résiduels, l'entraînement de réseaux de neurones profonds ...