Flask(플라스크) 활용한 머신러닝 웹 서비스 구축
학습 목표
가. Flask를 활용한 머신러닝 웹 서비스를 구현할 수 있다.
학습 내용
가. 가상환경 만들기
나. 필수 라이브러리 설치
다. 전체 폴더 구조
라. iris.py 소스 코드
마. flask_app 소스 코드
사. home.html 소스 코드
아. after.html 소스 코드
자. 실행
목차
가. 가상환경 만들기
conda create -n flask_ml python=3.8
conda activate flask_ml
나. 필수 라이브러리 설치
[방법1] requirements.txt 가 있을 경우,
pip install -r requirements.txt
requirements.txt 내용
Flask
Jinja2
scikit-learn
scipy
virtualenv
pillow
imageio
opencv-python
numpy
[방법2]
pip install flask==2.1.3 Jinja2
pip install scikit-learn
pip install numpy==1.23.1
pip install virtualenv
pip install pillow
pip install seaborn
pip install imageio
pip install opencv-python
pip install pandas
[리스트 확인]
(flask_ml) C:\Users\totofriend>conda list
# packages in environment at C:\Users\totofriend\anaconda3\envs\flask_ml:
#
# Name Version Build Channel
ca-certificates 2022.07.19 haa95532_0
certifi 2022.9.24 py38haa95532_0
click 8.1.3 pypi_0 pypi
colorama 0.4.5 pypi_0 pypi
contourpy 1.0.5 pypi_0 pypi
cycler 0.11.0 pypi_0 pypi
distlib 0.3.6 pypi_0 pypi
filelock 3.8.0 pypi_0 pypi
flask 2.1.3 pypi_0 pypi
fonttools 4.37.4 pypi_0 pypi
imageio 2.22.1 pypi_0 pypi
importlib-metadata 5.0.0 pypi_0 pypi
itsdangerous 2.1.2 pypi_0 pypi
jinja2 3.1.2 pypi_0 pypi
joblib 1.2.0 pypi_0 pypi
kiwisolver 1.4.4 pypi_0 pypi
markupsafe 2.1.1 pypi_0 pypi
matplotlib 3.6.1 pypi_0 pypi
numpy 1.23.1 pypi_0 pypi
opencv-python 4.6.0.66 pypi_0 pypi
openssl 1.1.1q h2bbff1b_0
packaging 21.3 pypi_0 pypi
pandas 1.5.0 pypi_0 pypi
pillow 9.2.0 pypi_0 pypi
pip 22.2.2 py38haa95532_0
platformdirs 2.5.2 pypi_0 pypi
pyparsing 3.0.9 pypi_0 pypi
python 3.8.13 h6244533_0
python-dateutil 2.8.2 pypi_0 pypi
pytz 2022.4 pypi_0 pypi
scikit-learn 1.1.2 pypi_0 pypi
scipy 1.9.2 pypi_0 pypi
seaborn 0.12.0 pypi_0 pypi
setuptools 63.4.1 py38haa95532_0
six 1.16.0 pypi_0 pypi
sqlite 3.39.3 h2bbff1b_0
threadpoolctl 3.1.0 pypi_0 pypi
vc 14.2 h21ff451_1
virtualenv 20.16.5 pypi_0 pypi
vs2015_runtime 14.27.29016 h5e58377_2
werkzeug 2.2.2 pypi_0 pypi
wheel 0.37.1 pyhd3eb1b0_0
wincertstore 0.2 py38haa95532_2
zipp 3.9.0 pypi_0 pyp
다. 전체 폴더 구조
[리스트 확인]
----[폴더명]
----- [폴더] model
----- [폴더] static
----- [폴더] templates
----- iris.py
----- flask_app.py
iris.py : 파일을 불러오고, 실제 모델 구축 후, 이를 pickle 파일로 저장한다.
flask_app.py : iris.py에서 생성한 pickle파일을 불러온다. Flask App을 띄운다.
----- [폴더] model : 학습된 모델 저장할 폴더
(예) iris_knn.pkl
----- [폴더] static : 참조할 이미지 폴더. 이곳에서 이미지를 불러와 웹에서 보여주게 된다.
(예) flower_iris.jpg, iris_setosa.jpg, iris_versicolor.jpg, iris_virginica.jpg
----- [폴더] templates : 첫 웹 페이지와 데이터 입력 후, 실행될 웹 html 파일 저장 폴더
home.html
after.html
라. iris.py 소스 코드
import time
import pickle
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
start_time = time.time()
# 01 데이터 불러오기
df = sns.load_dataset("iris")
print( df.shape )
print( df.columns )
print( df.head() )
sel = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
# 02 라벨 인코딩(Label Encoding)
le = LabelEncoder()
y_lbl = le.fit_transform(df['species'])
# 03 데이터 나누기 - 입력, 출력
X = df[sel]
y = y_lbl
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=77)
# 04 모델 구축 및 학습, 모델 저장
knn = KNeighborsClassifier().fit(X_train, y_train)
print(knn.score(X_test, y_test))
pickle.dump(knn, open('./model/iris_knn.pkl', 'wb'))
print("시간 (초): ", time.time() - start_time )
마. flask_app 소스 코드
from flask import Flask, render_template, request
import pickle
import numpy as np
# 01 학습된 모델 가져오기
model = pickle.load(open('./model/iris_knn.pkl', 'rb'))
# 02 플라스크 사용을 위한 준비
app = Flask(__name__)
# 03 플라스크 앱의 루트 디렉터리를 초기화
@app.route('/')
def main():
return render_template('start.html')
# 04 초기 웹 페이지에서 submit 했을 때 실행
# request.form['']을 사용하여 HTML 페이지에서 입력한 데이터를 가져온다.
# model.predict()를 통해 클래스를 예측한다.
# 예측값에 따라 어떤 텍스트와 이미지를 보낼지, after.html에 설정.
@app.route('/predict', methods=['POST'])
def home():
val1 = request.form['a']
val2 = request.form['b']
val3 = request.form['c']
val4 = request.form['d']
val1 = float(val1); val2 = float(val2); val3 = float(val3); val4 = float(val4);
arr = np.array([[val1, val2, val3, val4]])
pred = model.predict(arr)
# 렌더링할 html 파일명, 전달할 변수
return render_template('after.html', data=pred)
# 05 직접 실행된 경우, 앱을 디버그 on 모드로 실행
if __name__ == "__main__":
app.run(debug=True)
사. start.html 소스 코드
<html>
<body bgcolor=#d4a3ae>
<center>
<h1> IRIS Species Predict </h1>
<form method="POST", action="{{url_for('home')}}">
<b> sepal_length(cm) : <input type="text", name='a', placeholder="enter 1">
sepal_width(cm) : <input type="text", name='b', placeholder="enter 2">
petal_length(cm) : <input type="text", name='c', placeholder="enter 3">
petal_width(cm) : <input type="text", name='d', placeholder="enter 4">
</b>
<input type="submit" , value='predict!' >
</form>
<img src='static\iris_flower2.png' alt="flower" width="500" height="400">
</center>
</body>
</html>
아. after.html 소스 코드
<html>
<body bgcolor=#a3cfb4>
<center>
<h1> PREDICTION : </h1>
{%if data == 0%}
<h1>Iris-setosa</h1>
<img src='static\iris_setosa.jpg'>
{%endif%}
{%if data == 1%}
<h1>Iris-versicolor</h1>
<img src='static\iris_versicolor.jpg'>
{%endif%}
{%if data == 2%}
<h1>Iris-virginica</h1>
<img src='static\iris_virginica.jpg'>
{%endif%}
<a href='/'>go back to home page</a>
</center>
</body>
</html>
flask에서 if 문을 사용
{%if (조건식) %}
--
{%endif%}
{%if (조건식) %}
--
{%endif%}
{%if (조건식) %}
--
{%endif%}
자. 실행
01. iris.py을 실행
02. flask_app.py을 실행
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 140-126-807
03. 웹페이지 URL을 웹 사이트에 입력
04 입력란에 값을 입력 후, predict!를 버튼을 선택하면 예상 결과가 나오게 됩니다.