Aller au contenu
Alae Belaich

Projets

Démonstrations détaillées de mes projets en ingénierie, IA, IoT, robotique et logiciel.

Industrie 5.0 & Robotique

REFUSE : Démonstrateur 3D

DESPlant SimulationImmersion VRFabrication
Démonstrateur 3D REFUSE : le modèle Siemens Plant Simulation d'une usine reconfigurable à l'ASSAR Industrial Innovation Arena, annoté sur la station de marquage RFID, la cellule de lavage, l'opération de fraisage-perçage et la ligne d'assemblage qui alimente la visite en réalité virtuelle

Un démonstrateur 3D de pointe conçu pour donner vie aux concepts de systèmes de fabrication reconfigurables à l'ASSAR Industrial Innovation Arena. Focalisé sur le passage des modèles Plant Simulation aux environnements de réalité virtuelle immersive, permettant aux parties prenantes de visiter virtuellement une usine numériquement reconfigurable. Partenaires industriels : Scania, Volvo, AFRY, AC Floby, LEAX Group.

Plant Sim
Meta Quest
Unity

Simulateur de Surf

INGENIUMJumeaux NumériquesVR/AR

Développement d'un simulateur de surf intégrant la Réalité Virtuelle (VR) et la Robotique en temps réel pour reproduire la sensation physique de surfer sur des vagues océaniques. En exploitant le moteur Unity 3D et les casques Meta Quest, le projet crée un environnement visuel immersif piloté par des données réelles.

Unity 3D
Meta Quest
Surf Data
C#

X-RAPT : Formation en Programmation de Robots par XR

Tests d'UtilisabilitéJumeaux NumériquesVR/ARArchitecture Logicielle
Architecture en cinq couches de X-RAPT : enseignants et étudiants dans la couche utilisateur, un éditeur web et une simulation VR des robots UR3 et ABB IRB120 dans la couche applicative, le moteur multijoueur VIROO assurant la synchronisation temps réel, et un backend Java Spring Boot sur AWS et Azure dans les couches données et infrastructure

En collaboration avec l'Université de Skövde, j'ai participé au développement et à l'évaluation de X-RAPT, une plateforme XR multi-utilisateurs conçue pour combler le fossé entre simulation virtuelle et programmation de robots industriels. Ce projet exploite une architecture à 5 couches, intégrant des jumeaux numériques Unity de robots UR3 et ABB IRB120 avec un backend Java Spring Boot et AWS, pour faciliter la formation collaborative. Mon rôle a porté sur la faisabilité technique de la synchronisation VR/PC multiplateforme et les tests d'utilisabilité.

Unity
Meta Quest
C#
ABB
Spring Boot
AWS

Embarqué & IoT

Système de Sécurité Intelligent et Résilient pour Consignation Industrielle

Architecture Cyber-PhysiqueJournalisation AvancéeBackend RESTful
Écran tactile de la station de consignation en mode local : les 26 boîtiers électroniques affichés verrouillés ou déverrouillés, un clavier demandant le code de libération, et un journal local enregistrant en direct les événements de batterie, de réseau et de serveur

Développement d'une station de consignation (LOTO) intelligente et connectée, conçue pour gérer 26 verrous électroniques pour la sécurité industrielle. Le système garantit que les opérations de maintenance sont effectuées en toute sécurité via un contrôle d'accès centralisé. Construit sur une architecture Raspberry Pi 4/5 et conçu pour une résilience extrême : en cas de panne réseau, la station bascule automatiquement en mode local avec base de données CSV locale et IHM Tkinter pour que les protocoles de sécurité ne soient jamais interrompus.

Raspberry Pi
Flask
Tkinter HMI
IoT / GPIO
Network / GSM

Compression de Modèle Deep Learning par Quantification TFLite

Quantification Post-EntraînementArchitecture de ModèleStratégies d'Optimisation
Banc d'essai de quantification TensorFlow Lite : le modèle original face aux variantes float16, int16 et int8, la précision se maintenant près de 0,98 tandis que la taille passe de 434 Ko à 55 Ko et que la latence chute de trois ordres de grandeur

Développé dans le cadre du module Architectures Spécialisées à l'Université de Rouen Normandie, ce projet se concentre sur le pipeline complet de création, entraînement et optimisation d'un réseau de neurones pour déploiement embarqué. Il résout le défi du déploiement d'un modèle de classification à 1 024 caractéristiques sur des dispositifs à ressources limitées, en implémentant la Quantification Post-Entraînement (PTQ) via TensorFlow Lite, compressant les poids de 32 bits flottants à 8 bits entiers.

Post-training INT8 quantization
1conv = tf.lite.TFLiteConverter.from_keras_model(model)
2conv.optimizations = [tf.lite.Optimize.DEFAULT]
3conv.target_spec.supported_types = [tf.int8]
4tflite_model = conv.convert() # 32-bit → 8-bit
Python
TensorFlow
TF Lite
Scikit-Learn
Keras

Web & Mobile

Plateforme Interactive de Présentation & Analytique d'Engagement en Temps Réel

Réactions en DirectSondages & QuestionsDessin en DirectAnalytique d'Engagement
Vue présentateur de Diaposi : une diapositive en direct entourée de la barre d'outils de dessin et des panneaux questions, sondages, historique et réactions alimentés en temps réel par l'audience

Diaposi transforme n'importe quelle présentation en une conversation bidirectionnelle en temps réel. Réactions, questions, sondages et dessin en direct vous montrent exactement ce que votre audience comprend : chaque présentation devient centrée sur l'audience, plus jamais à sens unique.

React
Vite
TypeScript
Node.js
MongoDB
Socket.io
SEO
Startup

Application Mobile de Gestion de Données

AndroidJetpack ComposeRoomRetrofit
Architecture MVVM de l'application Android : Activity et Fragment dans la couche vue, un ViewModel exposant des LiveData, et un repository distribuant vers Room sur SQLite pour le stockage local et vers Retrofit pour le service web distant

Application Android native conçue pour gérer et visualiser efficacement les données mobiles. Construite avec Jetpack Compose, elle intègre le stockage local et la récupération de données distantes pour offrir une expérience utilisateur fluide.

Compose + Retrofit data flow
1@Composable
2fun DataScreen(vm: DataViewModel = hiltViewModel()) {
3 val items by vm.items.collectAsState()
4 LazyColumn { items(items) { ItemRow(it) } }
5}
Kotlin
Jetpack Compose
Hilt
Coroutines
Retrofit

IA, ML & Vision par Ordinateur

Planification de Chemin Stochastique par Processus de Décision de Markov

Intelligence ArtificielleApprentissage par RenforcementProcessus de Décision de Markov
Carte des villes de Roumanie servant d'espace d'états au MDP de planification de trajet stochastique, avec les distances routières entre Arad, Sibiu, Pitesti et Bucarest
Politique optimale dépendante du temps calculée par programmation dynamique rétrograde : la meilleure ville suivante depuis chaque ville, pour chacun des six jours restants

Ce projet modélise un problème de planification de chemin stochastique via un Processus de Décision de Markov à horizon fini. Un agent doit atteindre une ville cible dans un nombre limité de jours en tenant compte de résultats d'actions incertains. La politique optimale dépendant du temps est calculée par programmation dynamique à rebours.

Python
MDP

Suivi de Billes de Billard en Temps Réel & Analytique

Détection d'ObjetsSuivi de BallesAnalytique SportiveVision par Ordinateur
Tableau de bord d'analyse vidéo du billard : trajectoires de chaque bille, profils de vitesse, carte de chaleur des positions et chronologie des coups
Planche de vignettes de la bille blanche détectée image par image par le modèle YOLOv8 entraîné sur mesure
Planche de vignettes de la bille noire (numéro 8) suivie tout au long du match par le pipeline de vision par ordinateur YOLOv8

Système de vision par ordinateur qui détecte et suit les billes de billard en temps réel dans des séquences de match via un modèle YOLOv8 entraîné sur mesure. Entraîné sur un dataset annoté manuellement de billes queue, jaune, rouge et noire, il produit des trajectoires, profils de vitesse, cartes de chaleur et une timeline des coups, le tout dans un tableau de bord analytique.

Python
YOLOv8
OpenCV
PyTorch

Agent d'Apprentissage par Renforcement YAMS

Apprentissage par RenforcementThéorie des JeuxModélisation Stochastique
Scores des agents de Yams comparés entre l'agent aléatoire, trois niveaux gloutons et le Q-learning par perceptron, au-dessus de la courbe de score moyen du Q-learning sur 10 000 épisodes d'entraînement
Distribution des scores de l'agent de niveau 2 sur 1 000 parties simulées : moyenne de 126,6, entre 93 et 182
Distribution des scores de l'agent de niveau 1 sur 1 000 parties simulées : moyenne de 63,9, entre 44 et 102
Distribution des scores de l'agent de niveau 3 sur 1 000 parties simulées : moyenne de 188,7, entre 143 et 260

Développement d'un agent IA autonome entraîné à jouer au Yams de manière optimale. Le projet compare plusieurs stratégies d'apprentissage par renforcement (SARSA, Q-Learning et approximation de fonction par perceptron) pour naviguer dans un espace d'états de plus de 1 200 possibilités et maximiser le score à long terme sur des épisodes multi-tours.

Core Q-Learning update
1def update_q(self, s, a, r, s_next, alpha, gamma):
2 best_next = np.argmax(self.q[s_next])
3 td_target = r + gamma * self.q[s_next][best_next]
4 td_error = td_target - self.q[s][a]
5 self.q[s][a] += alpha * td_error
Python
NumPy
Scikit-Learn
Stochastic

Reconnaissance des Maladies Végétales & IA Explicable

Vision par OrdinateurApprentissage ProfondIA Explicable
Pipeline de détection de la pourriture noire du pommier : une feuille malade sous seuillage global puis adaptatif, suivie des cartes de chaleur d'analyse de sensibilité mettant en évidence les pixels sur lesquels le modèle VGG-16 fonde son diagnostic

Pipeline de diagnostic pour identifier la pourriture noire des pommes via l'extraction de caractéristiques profondes VGG-16. Le projet compare l'Analyse Discriminante de Fisher et la Différence des Moyennes, et utilise l'Analyse de Sensibilité pour générer des cartes de chaleur pixel par pixel, validant le focus du modèle sur les régions pathologiques.

Sensitivity analysis: pixel importance via backprop
1def sensitivity_analysis(model, image, device):
2 image.requires_grad = True
3 output = model(image)
4 output = torch.flatten(output, 1)
5 output.backward()
6 gradient = image.grad.data.squeeze().pow(2).sum(0).sqrt()
7 return gradient.cpu().numpy()
Python
PyTorch
OpenCV
Scikit-Learn
XAI

Optimisation des Arbres de Décision & Benchmarking Comparatif

Apprentissage SuperviséSélection de ModèleOptimisation des Hyperparamètres
Frontières de décision d'un arbre de décision, d'un classifieur bayésien naïf gaussien et des k plus proches voisins comparées sur le même jeu de données en deux croissants
Arbre de décision entraîné avec le critère de Gini, montrant sa frontière de décision alignée sur les axes
Arbre de décision entraîné avec le critère d'entropie, montrant comment la géométrie des coupes change par rapport à la version Gini

Exploration approfondie des arbres de décision, évaluant leurs performances face à Gaussian Naive Bayes et KNN. L'étude utilise les datasets Iris et Make_Moons pour visualiser des frontières de décision complexes, et conduit une analyse exhaustive des hyperparamètres pour limiter le surapprentissage via des contraintes de profondeur et de taille de feuilles.

Python
Scikit-Learn
K-Fold CV
Graphviz
Matplotlib

Benchmarking Multi-Classifieurs ML Statistique

Apprentissage StatistiqueReconnaissance de FormesThéorie de la Décision
Distributions des échantillons d'apprentissage et de test pour les trois problèmes de référence, six graphiques montrant la séparabilité de chaque jeu de classes
Frontière de décision multi-classes sur le problème 1, cinq groupes gaussiens bien séparés occupant chacun sa propre région colorée
Frontière de décision multi-classes sur le problème 3, où le chevauchement des groupes produit des régions bien plus enchevêtrées
Classifieur de Parzen à noyau uniforme sur le problème 3, ses régions pilotées par la densité se fragmentant dans le plan des caractéristiques
Frontière de décision du perceptron séparant une classe des quatre autres par une seule droite
Frontière de décision du perceptron pour une seconde séparation un-contre-tous, la coupe linéaire isolant le groupe en bas à droite
Région de décision un-contre-tous pour la classe 1 du jeu de référence multi-classes
Région de décision un-contre-tous pour la classe 3 du jeu de référence multi-classes
Région de décision un-contre-tous pour la classe 4 du jeu de référence multi-classes
Frontière de décision linéaire séparant la classe 1 de la classe 2
Frontière de décision linéaire séparant la classe 1 de la classe 4
Frontière de décision linéaire séparant la classe 2 de la classe 3
Frontière de décision linéaire séparant la classe 2 de la classe 4
SVC à noyau linéaire comparé à LinearSVC sur le jeu de données Iris, tracé selon la longueur et la largeur des sépales
Régions de décision de LinearSVC sur le problème 1, les points d'apprentissage en cercles et les points de test en étoiles
Régions de décision de LinearSVC sur le problème 2, où les classes commencent à se chevaucher
Régions de décision de LinearSVC sur le problème 3, le plus difficile des trois problèmes

Étude comparative de cinq algorithmes de classification fondamentaux : Distance Euclidienne Minimale, Distance de Mahalanobis, k-NN (Majorité/Unanimité) et Fenêtres de Parzen. Le projet comprend la modélisation mathématique des frontières de décision et l'optimisation des performances par validation croisée 5-Fold pour déterminer les hyperparamètres.

Mahalanobis distance
1# Distance relative to class covariance
2def mahalanobis_distance(self, x, class_label):
3 mu = self.mean_vectors[class_label]
4 inv_cov = np.linalg.inv(self.covariance_matrices[class_label])
5 delta = x - mu
6 return np.sqrt(delta @ inv_cov @ delta.T)
Python
NumPy
Scikit-Learn
Seaborn
Matplotlib

Importance des Variables en Matrice Industrielle & Aide à la Décision

IA Explicable (XAI)Industrie 5.0Systèmes d'Aide à la Décision
Carte d'influence de la matrice de décision industrielle, regroupant plus de 40 variables sous Risque, Reconfigurabilité, Extensibilité, Standardisation globale et Temps & Coût, avec les variables d'influence, d'impact et d'action distinguées par couleur
Tableau de bord d'aide à la décision en Tkinter où la Durabilité, l'Empreinte et la Reconfigurabilité sont pondérées face à chaque critère par des curseurs de 0,00 à 1,00, avec une colonne de poids global

Système d'aide à la décision de haut niveau développé pour l'ASSAR Industrial Innovation Arena. Ce projet utilise des régresseurs Random Forest et l'interprétabilité SHAP pour décoder les relations complexes entre plus de 40 variables industrielles, identifiant les principaux facteurs de Durabilité, Reconfigurabilité et Empreinte.

SHAP variable importance
1model = RandomForestRegressor(n_estimators=400).fit(X, y)
2explainer = shap.TreeExplainer(model)
3shap_values = explainer.shap_values(X) # 40+ industrial vars
4shap.summary_plot(shap_values, X) # top drivers
Python
SHAP
RFR
Tkinter
Seaborn