오늘의 수업 요약

한식 이미지 분류 웹 서비스 구현

학습된 딥러닝 모델을 웹 서버(Flask)에 올려 누구나 사용할 수 있는 서비스로 만들기

무엇을 배울까요?

💡 쉬운 예시: 내가 만든 '음식 감별 알고리즘'을 전 세계 사람들이 접속해서 쓸 수 있게 가게 문(웹사이트)을 여는 과정이에요.

1

사용자 입력 페이지 (templates/input.html)

왜 이 코드를 실행하나요? 사용자가 자신의 컴퓨터에 있는 음식 사진을 서버로 전송할 수 있도록 파일 선택창과 업로드 버튼이 있는 웹 페이지를 만듭니다.
<!DOCTYPE html>
# HTML 문서의 시작을 알려요.
<html lang="en">
# 언어 설정을 영어로 잡아요.
<body>
# 본문 내용이 시작돼요.
<form action = "uploader" method = "post" enctype = "multipart/form-data">
# 파일을 보낼 주소(uploader)와 전송 방식(post)을 정해요.
<input type = "file" name = "file" >
# 파일을 선택할 수 있는 버튼을 만들고 이름을 'file'로 지어요.
<input type = "submit" value="확인">
# 서버로 파일을 전송하는 '확인' 버튼을 만들어요.
</form>
# 폼 작성을 마쳐요.
</body>
</html>
실제 출력 (브라우저 화면)
[파일 선택] [확인]
출력 해설: 웹 브라우저로 접속했을 때 나타나는 아주 간단한 파일 업로드 UI입니다.
2

Flask 서버 및 모델 예측 로직 (food.py)

왜 이 코드를 실행하나요? 사용자가 올린 사진을 받아 14/15번에서 만든 딥러닝 모델로 분석하고, 그 결과를 다시 웹 화면에 텍스트로 뿌려주는 백엔드 서버를 구축합니다.
from flask import Flask, render_template, request
from PIL import Image
import numpy as np
from tensorflow.keras.models import load_model
app = Flask(__name__)
# 내 이름으로 된 웹 서버 앱을 생성해요.
@app.route('/')
# 첫 페이지('/')에 접속하면 input.html을 보여주도록 설정해요.
def main():
# 실제 업로드 처리가 일어나는 주소예요.
return render_template('input.html')
# 함수가 시작돼요.
@app.route('/uploader', methods=['POST'])
# 우리가 열심히 학습시켜 저장해둔 모델 파일을 불러와요.
def upload_image():
# 사용자가 보낸 사진 데이터를 열어요.
model = load_model('c:/data/models/food_best.keras')
# 모델이 배운 크기(96x96)와 똑같이 사진을 조절해요.
img = Image.open(request.files['file'].stream)
# 픽셀 숫자를 0~1로 낮춰 계산하기 좋게 만들어요.
img = img.resize((96, 96))
# 1장임을 알리는 4차원 덩어리로 모양을 바꿔요.
arr = np.array(img) / 255
# 정답 번호와 매칭될 음식 이름 리스트예요.
arr = arr.reshape(1, 96, 96, 3)
# 모델에게 사진을 보여주고 확률을 받아와요.
menu_items = ['치킨', '돌솥비빔밥', '제육볶음', '김치', '삼겹살', '된장찌게']
# 가장 높은 확률을 가진 번호를 골라내요.
pred = model.predict(arr)
# 최종 정답 이름을 웹 화면에 글자로 출력해요.
num = np.argmax(pred, axis=1)
# 포트 8000번에서 서버를 실제로 가동해요.
return '메뉴:' + menu_items[num[0]]
if __name__ == '__main__':
app.run(port=8000, threaded=False)
실제 출력 (예측 성공 시)
메뉴:제육볶음
출력 해설: 사진을 올리고 확인을 누르면, 서버가 모델을 돌려 판단한 음식 이름을 알려줍니다.