|
1 | | -## 작업 규칙 |
2 | | -- 각 브랜치 파서 작업 후 main 브랜치로 PR 생성 |
3 | | - |
4 | | -### 1. 브랜치 파기 |
5 | | -- `git checkout -b 브랜치명` |
6 | | -> 브랜치명은 `fe/login`, `be/login` `ai/trainig` 등 역할과 기능을 명시한다 |
7 | | -
|
8 | | -### 2. 작업 후 커밋 |
9 | | -- 커밋과 PR 단위는 짧게 가져간다 (빠른 피드백을 위함) |
10 | | -- `git commit -m "<커밋메시지>"` |
11 | | -- 커밋 메시지 컨벤션은 다음과 같다. |
12 | | - |
13 | | -| **Type** | **설명** | |
14 | | -| --- | --- | |
15 | | -| Feat: | 새로운 기능 추가 | |
16 | | -| Fix: | 버그 수정 | |
17 | | -| Refactor: | 리팩토링 | |
18 | | -| Design: | CSS 등 사용자 UI 디자인 변경 | |
19 | | -| Comment: | 필요한 주석 추가 및 변경 | |
20 | | -| Style: | 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 | |
21 | | -| Test: | 테스트(테스트 코드 추가, 수정, 삭제, 비즈니스 로직에 변경이 없는 경우) | |
22 | | -| Chore: | 위에 걸리지 않는 기타 변경사항(빌드 스크립트 수정, assets image, 패키지 매니저 등) | |
23 | | -| Init: | 프로젝트 초기 생성 | |
24 | | -| Rename: | 파일 혹은 폴더명 수정하거나 옮기는 경우 | |
25 | | -| Remove: | 파일을 삭제하는 작업만 수행하는 경우 | |
26 | | - |
27 | | -### 3. 작업한 내용들 push |
28 | | -- `git push` 먼저하고 안되면 `git push --set-upstream origin <브랜치명>` |
29 | | - |
30 | | -### 4. github 사이트에서 PR 생성하기 |
31 | | -- PR 템플릿에 맞게 내용을 적고 PR 올리기 (기타 전달사항도 전달하기) |
32 | | -- label 세팅하여 올리고, 제목에는 [Feature/BE] 등의 태그를 적어서 구분하기 쉽도록 한다 |
33 | | -- PR 생성 시 업로드하는 브랜치 설정을 dev 로 설정한다. |
34 | | - |
35 | | -### 5. 카톡으로 PR 생성 링크 보내기 |
36 | | -- 이는 클라이언트, AI 서버와 소통해야하는 BE 만 해당됨 |
| 1 | +<h1 align="center"> |
| 2 | +<img src="https://raw.githubusercontent.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis/master/Emojis/Smilies/Grinning%20Cat%20with%20Smiling%20Eyes.png" alt="Grinning Cat with Smiling Eyes" width="25" height="25" /> PETKIN <img src="https://raw.githubusercontent.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis/master/Emojis/Smilies/Grinning%20Cat%20with%20Smiling%20Eyes.png" alt="Grinning Cat with Smiling Eyes" width="25" height="25" /> |
| 3 | +</h1> |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +### <p align="center">AI 기반 반려동물 피부질환 예측 서비스</p> |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | +> ’Petkin’은 반려동물 보호자를 위한 **AI 피부질환 예측 서비스**입니다. 사용자는 반려동물의 피부 사진을 업로드하여 **딥러닝 모델을 활용한 피부질환 분석 결과**를 확인할 수 있습니다. 이 서비스는 **병원 방문 전 기본적인 피부 건강 진단**을 가능하게 하며, 보호자가 반려동물의 피부 상태를 기록하고 모니터링할 수 있도록 지원합니다. |
| 12 | +> |
| 13 | +
|
| 14 | + |
| 15 | +## 소개 |
| 16 | + |
| 17 | +### 🔎 Background |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +### 🎯 배경 |
| 22 | + |
| 23 | +- 반려동물 보호자들의 반려동물 건강에 대한 관심도 증가 |
| 24 | +- 동물병원 방문 전 **기본적인 피부 상태를 확인**할 수 있는 AI 기반 서비스 필요 |
| 25 | +- 시간과 비용 문제로 인해 **반려동물의 피부 상태를 자가 진단**할 수 있는 도구 제공 |
| 26 | + |
| 27 | +<br> |
| 28 | + |
| 29 | +## 핵심 기능 |
| 30 | + |
| 31 | +✅ **반려동물 피부 상태 분석** |
| 32 | + |
| 33 | +사용자가 반려동물 피부 사진을 업로드하면 AI가 분석하여 **피부 질환 여부 및 유형을 예측**합니다. |
| 34 | +-  |
| 35 | + |
| 36 | + |
| 37 | +✅ **반려동물 건강 정보 기록** |
| 38 | + |
| 39 | +반려동물의 건강과 관련된 상태를 **하루 단위로 기록**할 수 있습니다. |
| 40 | + |
| 41 | +<br> |
| 42 | + |
| 43 | +## 📊 AI 모델 및 학습 방법 |
| 44 | + |
| 45 | +### 🔬 데이터셋 및 전처리 |
| 46 | + |
| 47 | +- AI Hub 제공 **반려동물 피부질환 데이터셋** 활용🔗 [데이터셋 링크](https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&dataSetSn=561) |
| 48 | + |
| 49 | +- **데이터 구조**: |
| 50 | + - **A1:** 구진, 플라크 |
| 51 | + - **A2:** 비듬, 각질 |
| 52 | + - **A3:** 태선화, 과다색소침착 |
| 53 | + - **A4:** 농포, 여드름 |
| 54 | + - **A5:** 미란, 궤양 |
| 55 | + - **A6:** 결절, 종괴 |
| 56 | + - **A7:** 무증상 |
| 57 | + |
| 58 | +- **데이터 분포**: |
| 59 | + -  |
| 60 | + |
| 61 | +- **데이터 전처리**: |
| 62 | + - 이미지 데이터에 대해 Transform 적용 -> **이미지 데이터 특징 다양화** |
| 63 | + - 학습에 사용한 Features |
| 64 | + |
| 65 | + | age | breed | gender | label 인 lessons | |
| 66 | + | --- | --- | --- | --- | |
| 67 | + | 수치형 데이터이므로, MinMaxScaling 적용 | 범주형 데이터 이므로, One-hot encoding 적용 | 범주형 데이터이므로, One-hot encoding 적용 | 범주형 데이터이므로, One-hot encoding 적용 | |
| 68 | + |
| 69 | +<br> |
| 70 | + |
| 71 | +### 🔍 모델 구조 및 학습 방식 |
| 72 | + |
| 73 | +- **EfficientNet-b1** 기반 **Multi Modal Model** 활용 (이미지 데이터 학습이 주 목적이지만, 다른 features 을 통한 학습 성능 향상 기대) |
| 74 | +- **Adam, AdamW** 옵티마이저 사용 |
| 75 | +- **CosineAnnealingLR** 스케줄러 적용 |
| 76 | +- **CrossEntropy Loss** 적용 |
| 77 | +- **Hyper Parameter 조정**을 통한 최적화 실험 진행 |
| 78 | + |
| 79 | +<br> |
| 80 | + |
| 81 | +### 📈 실험 결과 |
| 82 | +- **실험 1)** 데이터 불균형 해결을 위한 **Undersampling 적용** |
| 83 | + - | No resample | Resample | |
| 84 | + | --- | --- | |
| 85 | + | |  | |
| 86 | + - > Loss 와 Accuracy 를 보면 Resampling 을 적용하지 않은 모델이 더 좋은 성능을 보이는 것처럼 보이지만, 평가 데이터가 불균형하기 때문에(A7이 많음) 그렇게 나타나며, **평가 데이터가 균형할때는 성능이 향상됨**을 확인할 수 있다. |
| 87 | + - | 불균형 평가데이터에 대한 혼동 행렬 비교 | 균형 평가 데이터에 대한 혼동행렬 비교 | |
| 88 | + | --- | --- | |
| 89 | + | | | |
| 90 | + |
| 91 | +<br> |
| 92 | + |
| 93 | +- **실험 2)** Multi Modal Model 적용 시 성능 변화 분석 |
| 94 | + - 이미지만 사용하였을 때와 멀티 모달로 다른 features 도 학습 시켰을 때를 비교하면, 극적인 차이는 없지만 Multi Modal Model 적용 시 성능이 약간 떨어진다. |
| 95 | + -  |
| 96 | + |
| 97 | +<br> |
| 98 | + |
| 99 | +- **실험 3)** Batch Size 및 Learning Rate 변경 실험 |
| 100 | + - batch size 를 크게 할수록 모델 성능이 향상될 것이라 예측했지만, 아주 미미한 차이만 있을 뿐 Batch size 에 따른 성능 변화는 거의 없다. |
| 101 | + -  |
| 102 | + |
| 103 | +<br> |
| 104 | + |
| 105 | +## 🛠 개발 내용 |
| 106 | +### 🔧 서비스 아키텍처 구조도 |
| 107 | + |
| 108 | + |
| 109 | +<br> |
| 110 | + |
| 111 | +### 🔧 기술 스택 |
| 112 | + |
| 113 | +| Frontend | Backend | AI Model | Deployment | |
| 114 | +| --- | --- | --- | --- | |
| 115 | +| <img src="https://img.shields.io/badge/Flutter-02569B?style=for-the-badge&logo=Flutter&logoColor=white"> | <img src="https://img.shields.io/badge/FastAPI-009688?style=for-the-badge&logo=FastAPI&logoColor=white"> | <img src="https://img.shields.io/badge/PyTorch-EE4C2C?style=for-the-badge&logo=PyTorch&logoColor=white"> | <img src="https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=Docker&logoColor=white"> | |
| 116 | + |
| 117 | +<br> |
| 118 | + |
| 119 | +### 🎬 시연 영상 |
| 120 | + |
| 121 | +📺 [시연 영상 보기](https://www.youtube.com/watch?v=Xs13ZMWp7xc) |
| 122 | + |
| 123 | +<br> |
| 124 | + |
| 125 | +### 개발 세부 내용 |
| 126 | + |
| 127 | +1. **ERD 설계서** |
| 128 | + |
| 129 | + |
| 130 | + |
| 131 | + |
| 132 | +2. **API 문서** |
| 133 | + 1. 🏠 **회원 API (Customer Controller)** |
| 134 | + | **회원 API (Customer Controller)** | 설명 | 엔드포인트 | 메서드 | |
| 135 | + | --- | --- | --- | --- | |
| 136 | + | 카카오 토큰 갱신 | 리프레시 토큰을 이용해 새로운 액세스 토큰을 발급 | `/api/customers/token/refresh` | `POST` | |
| 137 | + | 카카오 로그인 | Oauth 제공자(KAKAO) 로그인 후, 액세스 및 리프레시 토큰 반환 | `/api/customers/oauth/login/{oauthProvider}` | `POST` | |
| 138 | + | 내 정보 조회 | 로그인한 회원의 닉네임 반환 | `/api/customers/me` | `GET` | |
| 139 | + 2. 🧑⚕️ **질병 예측 API (Prediction Controller)** |
| 140 | + | 기능 | 엔드포인트 | 메서드 | 상태 | 설명 | |
| 141 | + | --- | --- | --- | --- | --- | |
| 142 | + | 질병 분석 (Client → Server) | `/predict/disease` | `POST` | ✅ 완료 | 서버에서 AI 서버로 질병 분석 요청 | |
| 143 | + 3. 📖 **건강 기록 API (Health Record Controller)** |
| 144 | + | 기능 | 엔드포인트 | 메서드 | 상태 | 설명 | |
| 145 | + | --- | --- | --- | --- | --- | |
| 146 | + | 특정 반려동물 건강 기록 조회 | `/api/pets/{pet_id}/health-records/` | `GET` | ✅ 완료 | 특정 반려동물의 모든 건강 기록 조회 | |
| 147 | + | 건강 기록 생성 | `/api/health-records` | `POST` | ✅ 완료 | 로그인된 사용자가 건강 기록 생성 | |
| 148 | + | 건강 기록 조회 | `/api/health-records/{record_id}` | `GET` | ✅ 완료 | 특정 건강 기록 세부 정보 조회 | |
| 149 | + | 건강 기록 수정 | `/api/health-records/{record_id}` | `PUT` | ✅ 완료 | 특정 건강 기록 내용 수정 | |
| 150 | + | 건강 기록 삭제 | `/api/health-records/{record_id}` | `DELETE` | ✅ 완료 | 특정 건강 기록 삭제 | |
| 151 | + | 특정 날짜 건강 기록 조회 | `/api/pets/{pet_id}/health-records?date={date}` | `GET` | ✅ 완료 | 특정 날짜의 건강 기록 조회 | |
| 152 | + | 특정 달 건강 기록 조회 | `/api/pets/{pet_id}/health-records?month={month}` | `GET` | ✅ 완료 | 특정 달의 건강 기록 조회 | |
| 153 | + |
| 154 | + 📌 **사전 정의된 건강 기록 아이템** |
| 155 | + | ItemType | Item Name | |
| 156 | + | --- | --- | |
| 157 | + | 1 | 📷 Photo (사진 기록) | |
| 158 | + | 2 | 🛁 Bath (목욕) | |
| 159 | + | 3 | 🚶 Walk (산책) | |
| 160 | + | 4 | 🍖 Snack (간식) | |
| 161 | + | 5 | 💊 Medicine (약) | |
| 162 | + | 6 | 💉 Vaccination (예방 접종) | |
| 163 | + | 7 | 🏥 Hospital (병원 방문) | |
| 164 | + | 8 | 📝 Memo (메모) | |
| 165 | + 4. 🐶 **반려동물 API (Pet Controller)** |
| 166 | + | 기능 | 엔드포인트 | 메서드 | 상태 | 설명 | |
| 167 | + | --- | --- | --- | --- | --- | |
| 168 | + | 반려동물 등록 | `/api/pets` | `POST` | ✅ 완료 | 새로운 반려동물을 등록하고 고유 ID 반환 | |
| 169 | + | 반려동물 정보 조회 | `/api/pets/{pet_id}` | `GET` | ✅ 완료 | 등록된 반려동물 조회 | |
| 170 | + | 반려동물 정보 수정 | `/api/pets/{pet_id}` | `PUT` | ✅ 완료 | 등록된 반려동물 정보 수정 | |
| 171 | + | 반려동물 삭제 | `/api/pets/{pet_id}` | `DELETE` | ✅ 완료 | 등록된 반려동물 삭제 | |
| 172 | + | 회원 반려동물 목록 조회 | `/api/pets/mine` | `GET` | ✅ 완료 | 로그인된 회원의 반려동물 목록 조회 | |
| 173 | + |
| 174 | + |
| 175 | +<br> |
| 176 | + |
| 177 | +## 팀원 |
| 178 | +|<img src="https://avatars.githubusercontent.com/u/102356873?v=4" width="150" height="150"/>|<img src="https://avatars.githubusercontent.com/u/82194112?v=4" width="150" height="150"/>|<img src="https://avatars.githubusercontent.com/u/105425800?v=4" width="150" height="150"/>| |
| 179 | +|:-:|:-:|:-:| |
| 180 | +|aengzu<br/>[@aengzu](https://github.com/aengzu)|[@choisieun](https://github.com/choisieun)|Heewon Choi<br/>[@o4e3](https://github.com/o4e3)| |
0 commit comments