๐ง๐ปโโ๏ธ SkinAI WebDiagnosis
A. ํ๋ก์ ํธ ๋ช
ํผ๋ถ ์งํ ์ง๋จ ์น ์๋น์ค, Dr.Skin
B. ํ๋ก์ ํธ ๋ฉค๋ฒ ์ด๋ฆ ๋ฐ ๋ฉค๋ฒ ๋ณ ๋ด๋นํ ํํธ ์๊ฐ
201824441 ๊น์นํ 201924587 ์กฐ์ฃผ์ |
202055565 ์ฌ์ง์ |
โข React ํ๋ก ํธ์๋ ๊ฐ๋ฐ โข Proxy ์๋ฒ ๊ตฌ์ถ โข CORS ๊ตฌํ โข Postgresql ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ถ โข Fast API ๋ฐฑ์๋ ๊ฐ๋ฐ โข Docker ๋ฐฐํฌ |
โข Figma ์์ฑ โข ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ์ ์ฒ๋ฆฌ, AI (๋ถ๋ฅ, ์ธ๊ทธ๋ฉํ
์ด์
) ๋ชจ๋ธ ๊ฐ๋ฐ โข AI ๋ชจ๋ธ ๋ฐฐํฌ์ฉ Flask Rest API ๊ฐ๋ฐ โข PythonAnywhere ๋ฐฐํฌ |
C. ํ๋ก์ ํธ ์๊ฐ
๐ก ํผ๋ถ ์งํ ๋ถ๋ฅ ๋ฐ ์ธ๊ทธ๋ฉํ
์ด์
์ ์ํ ์ธ๊ณต์ง๋ฅ ๋ชจ๋ธ๊ณผ ์น ๊ธฐ๋ฐ ์ง๋จ ์๋น์ค ๊ฐ๋ฐ
์ด ํ๋ก์ ํธ๋ kaggle์ HAM10000 ๋ฐ์ดํฐ์
์ ํ์ฉํ์ฌ ๋ค์ํ ํผ๋ถ ์งํ์ ๋ถ๋ฅํ๊ณ ์ธ๊ทธ๋ฉํ
์ด์
ํ๋ ์ธ๊ณต์ง๋ฅ ๋ชจ๋ธ์ ๊ฐ๋ฐํ๊ณ , ์ด๋ฅผ ์ฌ์ฉ์ ์นํ์ ์ธ ์น ๊ธฐ๋ฐ ์ง๋จ ์๋น์ค๋ก ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ฌ์ฉ์๋ ์์ ์ ํผ๋ถ ์ฌ์ง์ ์
๋ก๋ํ๋ฉด, AI ๋ชจ๋ธ์ด ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ถ์ํ์ฌ ํผ๋ถ ์งํ์ ์์ธกํ๊ณ , ์ธ๊ทธ๋ฉํ
์ด์
๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ์๋น์ค๋ Flask ๊ธฐ๋ฐ์ REST API๋ฅผ ํตํด AI ๋ชจ๋ธ๊ณผ ํต์ ํ๋ฉฐ, ์น ํ์ด์ง๋ FastAPI ๋ฐฑ์๋์ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๊ทธ๋ฆฌ๊ณ React ํ๋ก ํธ์๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Flask ๊ธฐ๋ฐ REST API์ AI ๋ชจ๋ธ์ PythonAnywhere ํด๋ผ์ฐ๋ ํ๋ซํผ์ ๋ฐฐํฌํ์ฌ, ํ๋ก ํธ์๋์์ ์ฌ์ฉํฉ๋๋ค. PostgreSQL์ Docker Container์ ๋ฐฐํฌํ์ฌ ๊ด๋ฆฌํฉ๋๋ค.
D. ํ๋ก์ ํธ ํ์์ฑ ์๊ฐ
ํผ๋ถ ์งํ์ ์กฐ๊ธฐ ์ง๋จ์ด ๋งค์ฐ ์ค์ํ ์ง๋ณ ์ค ํ๋์
๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ฌธ ํผ๋ถ๊ณผ ์์ฌ์ ์ ๊ทผ์ด ์ด๋ ค์ด ์ง์ญ์์๋ ์กฐ๊ธฐ ์ง๋จ์ด ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ผ๋ฐ์ธ๋ค์ด ์์ ์ ํผ๋ถ ์ํ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์๋ ๊ฐํธํ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ์ด ํ๋ก์ ํธ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋๊ตฌ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ ์น ๊ธฐ๋ฐ์ ํผ๋ถ ์งํ ์ง๋จ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
E.ย ๊ด๋ จ ๊ธฐ์ /๋
ผ๋ฌธ/ํนํ ์กฐ์ฌ ๋ด์ฉ ์๊ฐ
F. ํ๋ก์ ํธ ๊ฐ๋ฐ ๊ฒฐ๊ณผ๋ฌผ ์๊ฐ (+ ๋ค์ด์ด๊ทธ๋จ)
๐ฑ ์๋น์ค ๊ตฌ์กฐ๋ (๋ค์ด์ด๊ทธ๋จ)
[ ํผ๋ถ ์งํ ์ง๋จ ๊ธฐ๋ฅ ๋์๋ฐฉ์ ]
- ์ฌ์ฉ์๊ฐ React web์์ ํผ๋ถ ์งํ ์ฌ์ง์ ์
๋ก๋.
- React -> flask -> model๋ก ํด๋น img url์ด ์ ๋ฌ.
- model์ ํด๋น ์ด๋ฏธ์ง๋ฅผ predictionํ๊ณ , ์ธ๊ทธ๋ฉํ
์ด์
๊ฒฐ๊ณผ ์ด๋ฏธ์ง์ ๋ ์ด๋ธ์ flask์ ๋ฐํ.
- flask๋ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ์๋ฒ์ ์
๋ก๋ํ๊ณ , ๊ฒฐ๊ณผ ์ด๋ฏธ์ง์ ๋ํ new img url์ ์์ฑ.
- flask -> React ๋ก new img url๊ณผ label์ด ์ ๋ฌ๋๊ณ , ์ต์ข
์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค.
[ ๊ธฐํ ์ปค๋ฎค๋ํฐ, ๋์ ์ ๋ณด ์กฐํ ๋ฑ์ ๊ธฐ๋ฅ ๋์ ๋ฐฉ์ ]
- ์ฌ์ฉ์๊ฐ React web์์ ์ ๋ณด๋ฅผ ์์ฒญ.
- React -> Fast API -> postgres DB๋ก ํด๋น ๋ด์ฉ ์ ๋ฌ.
- DB๋ ์์ฒญ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ์ FastAPI์ ๋ฐํ.
- Fast API -> React Web๋ก ๊ฒฐ๊ณผ ์ ๋ฌ๋๊ณ , ์ต์ข
์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค.
๐ฑ ์ธ๊ณต์ง๋ฅ ๊ฐ๋ฐ ๊ฒฐ๊ณผ๋ฌผ ์๊ฐ
โ ๋ฐ์ดํฐ์
๋ถ์ ๋ฐ ์ ์ฒ๋ฆฌ
โ๏ธ ๋ฐ์ดํฐ์
๋ถ์
- ์ด 7 class๋ก ๊ตฌ์ฑ
- ์กํฐ๋ ์ผ๋ผํ ์์ค์ ์ํผ๋ด์/๋ณด์ฌ๋ณ (AKIEC), ๊ธฐ์ ์ธํฌ์์ข
(BCC), ์์ฑ ๊ฐํ์ฆ์ฑ ๋ณ๋ณ (BKL), ํผ๋ถ์ฌ์ ์ข
(DF), ํ์์ข
(MEL), ๋ฉ๋ผ๋์ฑ ๋ชจ๋ฐ (NV), ํ๊ด ๋ณ๋ณ (VASC)
- ๊ฐ ํด๋์ค ๋ถํฌ๋ ๋ถ๊ท ํ์ ์ด๋ฃจ๊ณ ์์
- GroundTruth.csv ํ์ผ๊ณผ images์ masks ํด๋๊ฐ ์์
- GroundTruth.csv ํ์ผ์๋ image ์นผ๋ผ๊ณผ 7๊ฐ class ์นผ๋ผ์ด ์์
- images์๋ ์๋ณธ ์ด๋ฏธ์ง๋ค์ด, masks์๋ ๋ง์คํฌ ์ด๋ฏธ์ง๋ค์ด ์์
โ๏ธ ๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌ(๊ณตํต)
- mask ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ์ฌ RLE Encoded Pixels๋ฅผ ์์ฑ
- images, classID, Encoded Pixels๋ก ๊ตฌ์ฑ๋ newGroundTruth.csv๋ฅผ ์์ฑ
- ํด๋์ค๋ณ ๋์ผํ ๋น์จ 8:1:1 ์ ์งํ์ฌ ๋ฐ์ดํฐ์
๋ถ๋ฆฌํ์ฌ ์ ์ฅ. -> TrainData.csv, ValidationData.csv, TestData.csv
โก Classification ๋ชจ๋ธ
โ๏ธ ๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌ
- ์๋ณธ์ด๋ฏธ์ง(450 x 600) -> crop (300 x 300) -> resize (128 x 128) -> ์ฆ๊ฐ (๋๋ค ํ์ , ์ํ/์์ง ์ด๋, ํ๋/์ถ์, ์ํ/์์ง flip, ๋๋ค ๋ฐ๊ธฐ ๋ฐ ๋๋น ์กฐ์ )
โ๏ธ ๋ชจ๋ธ ๊ตฌ์ฑ
- Pre-trained EfficientNet B3
โ๏ธ ๋ชจ๋ธ ํ์ต ๊ฒฐ๊ณผ
- Loss graph of Train & Validation, Accuracy graph of Train & Validation
- Test Data์ ๋ํ Classification ๊ฒฐ๊ณผ
โ๏ธ Test Data์ ์ ํ๋: 88%
โข Lesion Segmentation ๋ชจ๋ธ
โ๏ธ ๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌ
- ์๋ณธ์ด๋ฏธ์ง(450 x 600) -> crop (300 x 300) -> resize (224 x 224) + mask ์ ๋ณด
โ๏ธ ๋ชจ๋ธ ๊ตฌ์ฑ
- U-Net - Encoder: Pre-trained ResNet34, Weights: Pre-trained ImageNet
โ๏ธ ๋ชจ๋ธ ํ์ต ๊ฒฐ๊ณผ
- Loss graph of Train & Validation, IoU graph of Train & Validation, Dice graph of Train & Validation
โ๏ธ Test Data์ IoU: 0.85, Dice: 0.91
โฃ ๋ชจ๋ธ ๋ฐฐํฌ ๋ฐ ์์ธก api ๊ฐ๋ฐ
โ๏ธ Flask ์คํ
- flask ์ํ ํ์ผ ์์ฑ -> app.py
โ๏ธ ๋ชจ๋ธ ๋ฐฐํฌ ๋ฐ ์คํ
- prediction์ ์ํ ํ์ผ ์์ฑ -> test.py
- pythonanywhere ์๋ฒ์ label_encoder.pkl, cls_model.pth, seg_model.pth ์
๋ก๋ํจ.
โ๏ธ pythonanywhere์ Flask api ๋ฐฐํฌ
- https://yeojisu.pythonanywhere.com/test/ ์ POST request๋ก body์ json ๋ฐ์ดํฐ ํ์ {"image_url": "์์ธกํ ์ด๋ฏธ์ง url"} ์์ฑํ์ฌ ์ ์ก
- ์๋ต๊ฐ {"image_url": "mask ์์ฑ๋ Image Url", โlabelโ: โPredicted Classโ} ์ด ๋์ด
๐ฑ ์นํ์ด์ง ๊ฐ๋ฐ ๊ฒฐ๊ณผ๋ฌผ ์๊ฐ
๋ฉ์ธ ํ์ด์ง(/index)
- AI๋ฅผ ํตํ์ฌ ํผ๋ถ ์งํ ๋ถ์์ ํ ์ ์๋ ํจ์์
- ์นด๋ฉ๋ผ๋ก ์ง์ ์ดฌ์ํ๊ฑฐ๋ ์ฌ์ง์ ์
๋ก๋ํ์ฌ ๊ฐ๋จํ๊ฒ ํผ๋ถ ์งํ ํ
์คํธ๋ฅผ ์ํํ ์ ์์
์๊ฐ ํ์ด์ง(/about)
- Dr. Skin(ํ ํ๋ซํผ) ์ ๋ํ ์๊ฐ ํ์ด์ง
ํผ๋ถ ์งํ ์ข
๋ฅ ์๊ฐ ํ์ด์ง(disease)
- ํผ๋ถ ์งํ ์ข
๋ฅ ์๊ฐ ๋ฐ ์์ธ/์๋ฐฉ๋ฒ ๋ฑ์ ๋ํ ์๊ฐ ํ์ด์ง
์ปค๋ฎค๋ํฐ ํ์ด์ง(/community)
- ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ์ํตํ ์ ์๋ ํ์ด์ง
- ํต์ฌ ๊ธฐ๋ฅ์ ์๋๋ฏ๋ก ๊ตฌํํ์ง ์์์. ์ถํ ๊ตฌํ ์์
G. ๊ฐ๋ฐ ๊ฒฐ๊ณผ๋ฌผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์๊ฐ (์ค์น ๋ฐฉ๋ฒ, ๋์ ๋ฐฉ๋ฒ ๋ฑ)
๐ฑ ์ค์น ๋ฐฉ๋ฒ
Frontend (src/Frontend/)
- npm install
- npm start
Backend-Flask (src/AI/flask-api)
- flask run ๋๋ python app.py
Backend-FastAPI (src/Backend)
- python3 -m venv .venv
- source .venv/bin/activate
- cd api
- pip install -r requirements.txt
- gunicorn --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker --reload app:app
DB-postgreSQL (src/Backend/)
- docker compose up --buiild
(--build ==> ์ต์ด 1ํ๋ง ์ํ)
๐ฑ ๋์ ๋ฐฉ๋ฒ
๐ก ๋์ ์์ url: https://photos.app.goo.gl/FnREN8LpcbR5id368
โ ๋ฉ์ธํ์ด์ง(/index) ์์ '์ฌ์ง ๋ชจ๋ ํ
์คํธ' ๋ฒํผ ํด๋ฆญ
โก Dialog์์ '์์ํ๊ธฐ' ๋ฒํผ ํด๋ฆญ
โข ์นด๋ฉ๋ผ OR ํ์ผ ์ ํ์ผ๋ก ์ฌ์ง ์
๋ก๋
โฃ ํผ๋ถ ์งํ ๋ถ์ ์ฌ์ง ๋ฐ ์ค๋ช
ํ์ธ
H. ๊ฐ๋ฐ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ฉ๋ฐฉ์ ์๊ฐ
- ์๋ฃ ์๋น์ค ์ ๊ทผ์ด ์ด๋ ค์ด ์ง์ญ์ด๋ ๊ฐ์ธ์๊ฒ ์๊ฐ์ง๋จ ์๋น์ค๋ฅผ ํตํด์ ์ ๊ทผ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- ์ ๋ฌธ๊ฐ์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ธฐ์กด๋ณด๋ค ๋์ฑ ์ ์ํ๊ณ ์ ํํ๊ฒ ์ง๋จํ์ฌ ํจ์จ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- ์์คํ
์ด ์์งํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ ๋ฐ ์ฐ๊ตฌ์๋ค์๊ฒ ์ ๊ณตํด ์ํ ๊ต์ก ๋ฐ ์ํ ์ฐ๊ตฌ์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
- ์์คํ
์ ์์
์ ์ผ๋ก ํ์ฉํด ๋ง์ถคํ ํผ๋ถ ๊ด๋ฆฌ ์ ํ์ด๋ ์น๋ฃ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.