Food_recipe_project/
├── 📂 src/ # ⭐ 메인 소스 코드 디렉토리
│ ├── __init__.py # 패키지 초기화
│ ├── config.py # 🔧 설정 파일 (API 키, 경로, 파라미터)
│ ├── embeddings.py # 📝 텍스트 임베딩 (OpenAI)
│ ├── image_detection.py # 🖼️ YOLO 이미지 감지
│ ├── translation.py # 🔤 GPT 재료명 번역 (캐싱)
│ ├── recipe_search.py # 🔍 FAISS 레시피 검색
│ └── main.py # 🚀 메인 실행 파일 (통합)
│
├── 📂 models/ # 🤖 훈련된 모델 파일
│ └── best.pt # YOLO 이미지 분류 모델
│
├── 📂 data/ # 💾 데이터 파일
│ ├── recipes_faiss.index # FAISS 벡터 인덱스
│ └── recipes_meta.json # 레시피 메타데이터 JSON
│
├── requirements.txt # 📦 Python 의존성
├── README.md # 📖 프로젝트 설명서
├── .env.example # 환경 변수 예시 파일
├── .gitignore # 민감한 파일 제외 설정 (.env 포함)
└── ARCHITECTURE.md # 이 파일
🖼️ 이미지 입력
↓
[image_detection.py - YOLO]
↓
📋 감지된 재료 (영어)
↓
[translation.py - GPT]
↓
🔤 번역된 재료 (한국어)
↓
[embeddings.py - OpenAI]
↓
📊 재료 벡터 임베딩
↓
[recipe_search.py - FAISS]
↓
🍳 추천 레시피 반환
역할: 모든 설정을 중앙화하여 관리 (python-dotenv로 .env 자동 로드)
# 제공하는 설정
- OPENAI_API_KEY # OpenAI API 키
- EMBEDDING_MODEL # 임베딩 모델 (text-embedding-3-small)
- GPT_MODEL # GPT 모델 (gpt-4o-mini)
- FAISS_INDEX_PATH # FAISS 인덱스 경로
- RECIPES_META_PATH # 레시피 메타 JSON 경로
- YOLO_MODEL_PATH # YOLO 모델 경로
- YOLO_CONF/IOU # YOLO 감지 파라미터설정 로드:
from dotenv import load_dotenv
load_dotenv(PROJECT_ROOT / ".env") # 루트의 .env 자동 로드
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")역할: 텍스트를 벡터로 변환
embed_text(text) → list[float]- OpenAI의
text-embedding-3-small모델 사용 - 재료 검색에 사용되는 벡터화
역할: 이미지에서 재료 자동 감지
IngredientDetector 클래스
└─ detect_from_image(image_path) → list[str]- YOLO 모델로 재료 탐지
- 중복 제거된 클래스명 반환
역할: 영어 재료명을 한국어로 변환
translate_ingredient_en2ko(label) → str # 캐싱됨
translate_ingredients_list_to_korean(list) → list- LRU 캐시로 성능 최적화
- 반복되는 번역 요청 빠르게 처리
역할: 재료 기반 유사 레시피 검색
RecipeSearchEngine 클래스
├─ search_by_ingredients(재료) → list[dict]
└─ print_results(결과) → None- FAISS 벡터 유사도 검색
- 메타데이터 기반 필터링
역할: 전체 파이프라인 통합
search_recipes_by_image(image_path) → None
search_recipes_by_text(ingredients) → None- 이미지 기반 검색: 감지 → 번역 → 검색
- 텍스트 기반 검색: 직접 레시피 검색
- 기본 실행 시: 프로젝트 루트의
test_ingredients.png로 자동 검색
config.py (설정)
↑
├── embeddings.py ──────┬─→ recipe_search.py
│ └─→ main.py
│
├── image_detection.py ─────→ main.py
│
├── translation.py ──────────→ main.py
│
└── recipe_search.py ────────→ main.py
from src.main import search_recipes_by_text
search_recipes_by_text("당근, 양파, 감자", k=10)from src.main import search_recipes_by_image
search_recipes_by_image("path/to/image.jpg", k=10)cd src
python main.py # 기본: test_ingredients.png 이미지로 검색
python main.py /path/img.png # 특정 이미지로 검색
python main.py "당근 양파 감자" # 텍스트로 재료 검색.env파일에OPENAI_API_KEY저장, git에 커밋 금지 (.gitignore적용)python-dotenv로.env자동 로드 (이미requirements.txt에 포함)
echo "OPENAI_API_KEY=your-key-here" > .env💻 macOS 실행 이슈 (OpenMP)
- 드물게 OpenMP 중복 초기화 오류가 발생할 수 있습니다.
- 임시 해결: 환경 변수 설정 후 실행
export KMP_DUPLICATE_LIB_OK=TRUE
python main.py작성일: 2026-01-24