RedesignerLab

Une application SaaS d’intelligence artificielle facilitant la décoration d’intérieur

RedesignerLab est un service d’intelligence artificielle générative, qui permet de redécorer une pièce existante de votre maison/appartement en suivant un style au choix. L'application a été développée en un an, avec une équipe de 3 personnes (Arthur, Alex et moi-même), et a été lancée en décembre 2023.

Génèse du projet

Je m'intéresse aux modèles génératifs depuis que je suis au lycée (il y a + de 7 ans!), j'avais d'ailleurs a l'époque créé un scraper Genius et un dataset de paroles de rappeurs français, et entraîné un modèle LSTM (encore.ai). Depuis 2021, j'ai expérimenté avec différents GANs pour faire du traitement d'image (upscaling, style transfer et cleaning), notamment avec StyleGAN2, puis avec LaMa, puis avec DALL-E mini et enfin avec Stable Diffusion.

J'ai partagé mon enthousiasme et mes expérimentations avec mes coéquipiers à l'école 42, et en discutant des applications possibles de ces technologies, nous avons eu l'idée de RedesignerLab. Nous avons commencé alors commencé à travailler sur le projet en novembre 2022.

Des premières décisions techniques infructueuses

Au tout début, notre idée était de développer une application à destination des architectes, avec la possible de faire de l'inpainting sur des photos d'environnements existants pour conceptualiser des projets de construction. Avec les modèles de l'époque, et notre manque d'expérience, nous avons vite réalisé que ce n'était pas une bonne idée : la cible était trop spécique, et les modèles d'inpainting trop peu performants.

Nous avons alors pivoté vers une application de décoration d'intérieur, qui nous semblait plus accessible et plus utile pour le grand public.

Dans une logique de diminution des coûts, et parce que l'idée d'une force de calcul distribuée et décentralisée nous plaisait, on a d'abord essayé de faire tourner notre modèle sur des machines de particuliers, en échange de tokens avec le projet Stable Horde. La lenteur de génération, le manque de fiabilité, l'impossibilité de garantir la qualité des modèles générés, et le manque de contrôle sur les données d'entraînement nous ont vite fait abandonner cette idée. J'ai alors basculé notre application sur un modèle dédié, hébergé auprès de Replicate.

Replicate est une plateforme de déploiement de modèles d'intelligence artificielle. Elle permet de gérer les données d'entraînement, de lancer des entraînements, de déployer des modèles, et de les exposer via une API. Nous avons choisi Replicate pour sa simplicité d'utilisation, sa fiabilité, et sa capacité à gérer des modèles de grande taille. Mais nous avons vite été limités par le coût de l'infrastructure, par la lenteur de déploiement des modèles et les contraintes de cold boot (en cas d'un nombre restraint d'utilisateurs, ce qui était notre cas).

En parallèle du modèle d'IA, j'étais en charge du développement du backend de l'application. J'ai choisi d'utiliser Supabase, une alternative open-source à Firebase, car elle affichait une simplicité d'utilisation, et la possibilité de self-host le projet. En réalité, ce choix nous a fait perdre beaucoup de temps : la documentation était incomplète, les fonctionnalités manquantes et le projet n'est clairement à destination du self-hosting.

Supabase est un projet puissant et intéressant, mais pas du tout adapté à notre cas d'usage : considérer la base de donnée comme un service complet permettant de se passer d'un backend est à mon sens une erreur. Ça ne permet pas réellement de scale des projets d'envergure, ni de gérer des cas d'usage spécifiques, et cela ajoute une trop grande couche de complexité pour des projets plus simples. Également, la documentation induit largement en erreur sur les bonnes pratiques à adopter pour sécuriser l'ensemble de l'application, ce qui conduit à un développement peu sécurisé par défaut.

Nous avons choisi de développer l'application en Vue.js, car c'était le framework que nous connaissions le mieux. Nous avons choisi d'utiliser l'Options API, car c'était la méthode que nous connaissions le mieux. En réalité, nous avons vite été limités par la complexité de l'application, et par la difficulté à maintenir un code propre et lisible. Également, le développement d'une SPA induit des problèmes de SEO, que nous avons pu résoudre par la suite.

DaisyUI est un kit UI CSS pour Tailwind, qui permet d'avoir des classes prédéfinies qui intègrent des composants de base. Nous avons finalement remplacé DaisyUI par Nuxt UI car le style du kit était plus très moderne, et difficile à personnaliser.

Notre stack finale

À la fin de notre cursus, nous avons recommencé entièrement le développement grâce aux compétences acquises lors du développement de Transcendence et de nos erreurs passées.

Le front a été refactor en Nuxt 3, avec la Composition API. Cela nous a permis de réduire la complexité de l'application, de rendre le code plus lisible, et de faciliter la maintenance. Nous avons également pu profiter des nouvelles fonctionnalités de Nuxt 3, notamment la génération statique et le support d'une application mixte (SSG/SPA). Le front intègre ainsi le SEO, une traduction en plusieurs langues et un déploiement automatique en dev et en production sur Cloudflare Pages. Nous avons refait le design de l'application avec Nuxt UI, qui nous a permis de gagner du temps et de l'homogénéité dans le design.

J'ai développé l'API REST de l'application en FastAPI, avec Pydantic pour la validation des données, Piccolo ORM pour la gestion de la base de donnée, et SQLite pour la base de donnée. J'ai choisi cette stack car elle est simple, rapide, et permet de gérer des cas d'usage spécifiques. J'ai également pu profiter de la documentation automatique de FastAPI, et de la génération de clients pour les requêtes API.

Piccolo ORM est un ORM très puissant, qui rajoute très peu d'abstraction entre la couche serveur et la base de donnée, et qui permet de gérer des cas d'usage spécifiques. Il permet de faire des migrations automatiques, de migrer des bases de données existantes vers des modèles Pydantic, et de gérer des relations complexes entre les tables

L'intégration entre FastAPI et Pydantic, et des bases de données vers des modèles de donnée Pydantic grâce à Piccolo permet de gagner énormément de temps, de réduire drastiquement la complexité du code et il est alors beaucoup plus rapide de détecter des erreurs ou de développer des fonctionnalités complexes.

Enfin, pour le coeur de notre application, j'ai composé un pipeline personnalisé avec :

Grâce à ces différents outils, des prompts et des ControlNet personnalisés, nous atteignons une qualité de génération inégalée pour de l'Img2Img, avec une latence de génération très faible, et des coûts largement réduits grâce à l'usage du Serverless fournit par Runpod.

Nous avons effectué des comparaisons avec des services concurrents (comme RoomGPT ou InteriorAI) et nous avons pu constater que notre application était plus puissante, plus jolie et moins coûteuse.

Conclusion

RedesignerLab a été un projet très formateur, qui nous a permis de mettre en pratique nos compétences en développement, en intelligence artificielle, en gestion de projet, et en entrepreneuriat. Nous avons appris de nos erreurs, et nous avons su nous adapter pour développer une application de grande qualité. Nous avons également pu constater que les technologies que nous avons utilisées sont très performantes, et on est tous les trois très fiers de ce projet que nous avons mené à bien.

Images

Before and after of a roomBefore and after of a room