smooth-app
전 세계 식품의 성분·영양·정보를 자유롭게 협업하고 공개하는 데이터베이스
AI 기반 자동 심장 분할 (Cascaded U‑Net). 심장 혈관 스캔을 불러와 몇 초 만에 3D 분할 결과를 얻음
Segmentation automatique du cœur par IA (Cascaded U-Net). Importez votre angioscanner cardiaque et obtenez une segmentation 3D en quelques secondes.
건강TypeScript · PythonGitHub @THE-LIRK온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Segmentation cardiaque automatisée par IA - Cascaded U-Net (Next.js + Modal + Supabase)
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Application de segmentation automatique de structures cardiaques et des artères coronaires à partir d'images CT au format NIfTI (.nii / .nii.gz), combinant un pipeline de deep learning cascadé (U-Net 3D + Swin UNETR V2) et une interface web complète (auth, paiement par crédits, visualisation 2D/3D).README 전문 보기 ↗
Application de segmentation automatique de structures cardiaques et des artères coronaires à partir d'images CT au format NIfTI (.nii / .nii.gz), combinant un pipeline de deep learning cascadé (U-Net 3D + Swin UNETR V2) et une interface web complète (auth, paiement par crédits, visualisation 2D/3D).
Le projet est découplé en deux services indépendants :
/segment_nifti, /health).flowchart LR
U[Utilisateur] -->|upload .nii.gz| FE[Frontend Next.js<br/>Vercel]
FE -->|auth| SB[Supabase]
FE -->|paiement| ST[Stripe]
FE -->|POST fichier brut| BE[Backend Modal<br/>GPU A10G]
BE -->|masque .nii.gz| FE
FE -->|erreurs/perf| SE[Sentry]
Le masque de sortie contient 10 labels :
| Label | Structure | Modèle |
|---|---|---|
| 0 | Fond | — |
| 1 | Myocarde VG | U-Net 3D |
| 2 | Oreillette gauche | U-Net 3D |
| 3 | Ventricule gauche | U-Net 3D |
| 4 | Oreillette droite | U-Net 3D |
| 5 | Ventricule droit | U-Net 3D |
| 6 | Aorte ascendante | U-Net 3D |
| 7 | Artère pulmonaire | U-Net 3D |
| 8 | Coronaire gauche | Swin UNETR V2 |
| 9 | Coronaire droite | Swin UNETR V2 |
Créer l'environnement conda à partir du fichier fourni :
cd segmentation
conda env create -f environment.yml
conda activate cardioseg
Se connecter à Modal (ouvre une page web pour l'authentification) :
modal setup
# ou : modal token new
Placer les checkpoints des modèles dans ml/pretrained_models/ (voir Modèles pré-entraînés) :
ml/pretrained_models/
├── 1stage.ckpt # détection du cœur (crop)
├── 2stage.ckpt # segmentation cardiaque (7 structures)
└── coronary.ckpt # segmentation des coronaires (Swin UNETR)
cd segmentation/frontend
npm install
cp .env.local.example .env.local # si le fichier exemple existe, sinon créer manuellement
Renseigner les variables dans .env.local (voir Variables d'environnement).
conda activate cardioseg
cd segmentation/api
modal serve modal_inference.py
Modal affiche une URL temporaire (*.modal.run) à utiliser pendant le développement. Le code est rechargé automatiquement à chaque modification.
conda activate cardioseg
cd segmentation/api
modal deploy modal_inference.py
Cette commande construit l'image Docker (si nécessaire) et déploie les deux endpoints de façon persistante :
https://<user>--cardioseg-inference-segment-nifti.modal.runhttps://<user>--cardioseg-inference-health.modal.runVérifier le déploiement :
curl https://<user>--cardioseg-inference-health.modal.run
cd segmentation/frontend
npm run dev
L'application est disponible sur http://localhost:3000.
Le déploiement se fait via la CLI Vercel :
cd segmentation/frontend
vercel --prod
Ou automatiquement à chaque push si le dépôt Git est lié à un projet Vercel.
Fichier segmentation/frontend/.env.local :
# Supabase
NEXT_PUBLIC_SUPABASE_URL=https://xxxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=xxxxx
SUPABASE_SERVICE_ROLE_KEY=xxxxx
# Stripe
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_xxxxx
STRIPE_SECRET_KEY=sk_test_xxxxx
STRIPE_WEBHOOK_SECRET=whsec_xxxxx
# Sentry
NEXT_PUBLIC_SENTRY_DSN=https://xxxxx.ingest.de.sentry.io/xxxxx
SENTRY_ORG=xxxxx
SENTRY_PROJECT=cardioseg
SENTRY_AUTH_TOKEN=xxxxx
# API Modal (optionnel — a des valeurs par défaut dans lib/config.ts)
NEXT_PUBLIC_API_URL=https://<user>--cardioseg-inference-segment-nifti.modal.run
NEXT_PUBLIC_HEALTH_URL=https://<user>--cardioseg-inference-health.modal.run
Ces mêmes variables doivent être configurées sur Vercel pour la production :
vercel env add NEXT_PUBLIC_SUPABASE_URL production
vercel env add SUPABASE_SERVICE_ROLE_KEY production
# ... etc pour chaque variable
Tables Supabase requises (user_credits, payment_logs) : voir le SQL fourni dans le dépôt ou l'historique du projet.
segmentation/
├── environment.yml # environnement conda (backend/ML)
├── api/
│ ├── modal_inference.py # app Modal : pipeline d'inférence 3 étapes
│ └── requirements.txt # dépendances Python (pour référence/Docker)
├── ml/
│ ├── segmenter.py # U-Net 3D — 8 classes (structures cardiaques)
│ ├── segmenter_2labels.py # U-Net 3D — 2 classes (détection du cœur)
│ ├── model_adaptable.py # architecture UNet3D_adaptable (depth, start_filts)
│ ├── models/
│ │ ├── swin_unetr.py # Swin UNETR V2 — 3 classes (coronaires)
│ │ └── losses.py # DiceLoss, ClDiceLoss
│ ├── utils.py # prétraitement / post-traitement U-Net
│ ├── preprocessing_swin.py # prétraitement / post-traitement coronaires
│ ├── sitk_utils.py # utilitaires SimpleITK (resize, resample)
│ ├── dataset.py # chargement des données, K-Fold cross-val
│ └── pretrained_models/ # checkpoints (.ckpt) — non versionnés (gros fichiers)
└── frontend/
├── src/
│ ├── app/
│ │ ├── auth/ # page de connexion (email + Google OAuth)
│ │ ├── upload/ # upload + suivi de progression
│ │ ├── result/ # visualisation des résultats (Niivue)
│ │ ├── pricing/ # achat de crédits (Stripe)
│ │ └── api/ # routes API Next.js (checkout, credits, webhook)
│ ├── components/ # NiivueViewer, Navbar, AuthProvider, animations
│ └── lib/ # config, clients Supabase/Stripe, gestion des crédits
├── sentry.*.config.ts # configuration Sentry (client/serveur/edge)
└── next.config.ts
Segmenter_2labels (U-Net 3D, 2 classes) localise le cœur sur l'image complète redimensionnée en 128³, puis calcule une boîte englobante (+15 % de marge).Segmenter (U-Net 3D, 8 classes) segmente les 7 structures cardiaques sur l'image recadrée.SwinUNETRSegmenter (Swin UNETR V2, 3 classes) segmente les artères coronaires gauche/droite sur la même région recadrée, avec un prétraitement HU dédié ([-200, 1411] HU, normalisation min-max).En cas d'échec d'une étape (coronaires notamment), le pipeline se dégrade proprement et renvoie le masque cardiaque seul (voir en-tête de réponse X-Coronary-Status).
Les checkpoints (.ckpt) ne sont pas versionnés dans Git (confidentialité et fichiers volumineux, voir Fichiers exclus du dépôt). Ils doivent être placés manuellement dans ml/pretrained_models/ avant le déploiement :
| Fichier | Modèle | Taille approx. |
|---|---|---|
1stage.ckpt | Segmenter_2labels (crop) | ~67 Mo |
2stage.ckpt | Segmenter (8 classes) | ~1,1 Go |
coronary.ckpt | SwinUNETRSegmenter (coronaires) | ~613 Mo |
Certains fichiers ont été volontairement retirés de ce dépôt pour des raisons de confidentialité (et, pour les modèles, de taille). Ils sont listés dans le .gitignore ; le projet ne peut donc pas être exécuté de bout en bout sans eux.
| Fichier / dossier | Contenu | Raison |
|---|---|---|
ml/pretrained_models/*.ckpt (1stage.ckpt, 2stage.ckpt, coronary.ckpt) | Poids des modèles entraînés | Confidentialité (propriété du modèle) et fichiers trop lourds pour GitHub |
SWIN_CORONAIRES_*/ | Données brutes d'entraînement des coronaires | Confidentialité (données médicales) |
ml/*.nii.gz | Images NIfTI de test utilisées en local | Confidentialité (données médicales) |
.env, .env.local, .env.vercel.local, .env*.local | Clés Supabase, Stripe, Sentry, Modal | Secrets, ne jamais les versionner |
command not found: modal → activer l'environnement conda (conda activate cardioseg) avant toute commande Modal.curl .../health) et que l'URL dans lib/config.ts / .env.local est à jour.PytorchStreamReader failed reading zip archive) → le fichier .ckpt a été mal transféré ; le re-télécharger/copier depuis la source d'origine.Restore project).