Flask에서 이미지 분류 웹 앱 만들기 (Mobile Net)
개요
웹 애플리케이션 프레임워크인 Flask를 사용하여 브라우저에서 서버로 이미지를 전달하고 Mobile Net에서 클래스 분류를 수행하는 API를 만들었습니다.
이번에는 미세 조정을하지 않고 ImageNet의 학습 매개 변수를 사용합니다.
Mobile Net 논문
트리 구조
MobileNetApi
├── mobile_net_model.h5
├── save_model_mobile_net.ipynb
├── server.py
└── templates
├── flask_api_index.html
├── layout.html
└── result.html
Mobile Net 모델 저장
다음 코드를 실행하면 mobile_net_model.h5
라는 파일이 만들어집니다.
save_model.pyimport numpy as np
from keras.models import load_model
from keras.applications.mobilenet import MobileNet
# Mobile Net
model = MobileNet(weights="imagenet")
# モデルの保存、モデルをロードした後予測しかしないため、include_optimizer=Falseとする
model.save('mobile_net_model.h5', include_optimizer=False)
Sever 만들기
server.pyfrom flask import Flask, render_template, request, redirect, url_for, send_from_directory
import numpy as np
from keras.models import load_model
from keras.applications.mobilenet import MobileNet, preprocess_input, decode_predictions
from keras.preprocessing.image import img_to_array, load_img
app = Flask(__name__)
def img_pred(image):
# 保存したモデルをロード
model = load_model('mobile_net_model.h5')
# 読み込んだ画像を行列に変換
img_array = img_to_array(image)
# 3次元を4次元に変換、入力画像は1枚なのでsamples=1
img_dims = np.expand_dims(img_array, axis=0)
# Top2のクラスの予測
preds = model.predict(preprocess_input(img_dims))
results = decode_predictions(preds, top=2)[0]
# resultsを整形
result = [result[1] + str(result[2]) for result in results]
return result
@app.route('/')
def index():
return render_template('./flask_api_index.html')
@app.route('/result', methods=['POST'])
def result():
# submitした画像が存在したら処理する
if request.files['image']:
# 画像の読み込み
image_load = load_img(request.files['image'], target_size=(224,224))
# クラスの予測をする関数の実行
predict_Confidence = img_pred(image_load)
# render_template('./result.html')
return render_template('./result.html', title='予想クラス', predict_Confidence=predict_Confidence)
if __name__ == '__main__':
app.debug = True
app.run(host='localhost', port=5000)
HTML 만들기
layout.html
를 바탕으로 flask_api_index.html
와 result.html
를 작성해 갑니다.
layout.html<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>API Sample</title>
</head>
<body>
{% block content %}
<!-- ここに内容 -->
{% endblock %}
</body>
</html>
flask_api_index.html
는 localhost:5000
에 액세스했을 때 표시하는 HTML입니다.
flask_api_index.html{% extends "layout.html" %}
{% block content %}
<form action="/result" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/png, image/jpeg, image/jpg">
<button type="submit">Submit</button>
</form>
{% endblock %}
result.html
는 localhost:5000
에서 이미지를 선택하고 Submit을 누른 후 결과를 표시하는 HTML입니다.
result.html{% extends "layout.html" %}
{% block content %}
<h3>予想クラス</h3>
{{ predict_Confidence }}
{% endblock %}
서버를 세우고 실행
지금까지 가능하면 다음 코드를 실행하여 localhost:5000으로 이동합니다.
$ python3 server.py
이렇게 표시되어 넣으면 괜찮습니다.
플라스틱 병과 같은 물건의 이미지를 선택하고 submit을 누르십시오.http://localhost:5000/result
로 천이해, 예상 클래스의 Top2개가 표시되고 있으면 OK입니다.
기타 기사
Flask에서 기계 학습 API를 만들어 보았습니다.
VGG16을 Fine Tuning하여 2018년 상반기 브레이크 여배우·배우·연예인으로 분류해 보았다
Heroku에서 Python 앱을 배포해 보았습니다.
Reference
이 문제에 관하여(Flask에서 이미지 분류 웹 앱 만들기 (Mobile Net)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kagami-r0927/items/071dec59ff3cf52d9c93
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
MobileNetApi
├── mobile_net_model.h5
├── save_model_mobile_net.ipynb
├── server.py
└── templates
├── flask_api_index.html
├── layout.html
└── result.html
Mobile Net 모델 저장
다음 코드를 실행하면 mobile_net_model.h5
라는 파일이 만들어집니다.
save_model.pyimport numpy as np
from keras.models import load_model
from keras.applications.mobilenet import MobileNet
# Mobile Net
model = MobileNet(weights="imagenet")
# モデルの保存、モデルをロードした後予測しかしないため、include_optimizer=Falseとする
model.save('mobile_net_model.h5', include_optimizer=False)
Sever 만들기
server.pyfrom flask import Flask, render_template, request, redirect, url_for, send_from_directory
import numpy as np
from keras.models import load_model
from keras.applications.mobilenet import MobileNet, preprocess_input, decode_predictions
from keras.preprocessing.image import img_to_array, load_img
app = Flask(__name__)
def img_pred(image):
# 保存したモデルをロード
model = load_model('mobile_net_model.h5')
# 読み込んだ画像を行列に変換
img_array = img_to_array(image)
# 3次元を4次元に変換、入力画像は1枚なのでsamples=1
img_dims = np.expand_dims(img_array, axis=0)
# Top2のクラスの予測
preds = model.predict(preprocess_input(img_dims))
results = decode_predictions(preds, top=2)[0]
# resultsを整形
result = [result[1] + str(result[2]) for result in results]
return result
@app.route('/')
def index():
return render_template('./flask_api_index.html')
@app.route('/result', methods=['POST'])
def result():
# submitした画像が存在したら処理する
if request.files['image']:
# 画像の読み込み
image_load = load_img(request.files['image'], target_size=(224,224))
# クラスの予測をする関数の実行
predict_Confidence = img_pred(image_load)
# render_template('./result.html')
return render_template('./result.html', title='予想クラス', predict_Confidence=predict_Confidence)
if __name__ == '__main__':
app.debug = True
app.run(host='localhost', port=5000)
HTML 만들기
layout.html
를 바탕으로 flask_api_index.html
와 result.html
를 작성해 갑니다.
layout.html<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>API Sample</title>
</head>
<body>
{% block content %}
<!-- ここに内容 -->
{% endblock %}
</body>
</html>
flask_api_index.html
는 localhost:5000
에 액세스했을 때 표시하는 HTML입니다.
flask_api_index.html{% extends "layout.html" %}
{% block content %}
<form action="/result" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/png, image/jpeg, image/jpg">
<button type="submit">Submit</button>
</form>
{% endblock %}
result.html
는 localhost:5000
에서 이미지를 선택하고 Submit을 누른 후 결과를 표시하는 HTML입니다.
result.html{% extends "layout.html" %}
{% block content %}
<h3>予想クラス</h3>
{{ predict_Confidence }}
{% endblock %}
서버를 세우고 실행
지금까지 가능하면 다음 코드를 실행하여 localhost:5000으로 이동합니다.
$ python3 server.py
이렇게 표시되어 넣으면 괜찮습니다.
플라스틱 병과 같은 물건의 이미지를 선택하고 submit을 누르십시오.http://localhost:5000/result
로 천이해, 예상 클래스의 Top2개가 표시되고 있으면 OK입니다.
기타 기사
Flask에서 기계 학습 API를 만들어 보았습니다.
VGG16을 Fine Tuning하여 2018년 상반기 브레이크 여배우·배우·연예인으로 분류해 보았다
Heroku에서 Python 앱을 배포해 보았습니다.
Reference
이 문제에 관하여(Flask에서 이미지 분류 웹 앱 만들기 (Mobile Net)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kagami-r0927/items/071dec59ff3cf52d9c93
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import numpy as np
from keras.models import load_model
from keras.applications.mobilenet import MobileNet
# Mobile Net
model = MobileNet(weights="imagenet")
# モデルの保存、モデルをロードした後予測しかしないため、include_optimizer=Falseとする
model.save('mobile_net_model.h5', include_optimizer=False)
server.py
from flask import Flask, render_template, request, redirect, url_for, send_from_directory
import numpy as np
from keras.models import load_model
from keras.applications.mobilenet import MobileNet, preprocess_input, decode_predictions
from keras.preprocessing.image import img_to_array, load_img
app = Flask(__name__)
def img_pred(image):
# 保存したモデルをロード
model = load_model('mobile_net_model.h5')
# 読み込んだ画像を行列に変換
img_array = img_to_array(image)
# 3次元を4次元に変換、入力画像は1枚なのでsamples=1
img_dims = np.expand_dims(img_array, axis=0)
# Top2のクラスの予測
preds = model.predict(preprocess_input(img_dims))
results = decode_predictions(preds, top=2)[0]
# resultsを整形
result = [result[1] + str(result[2]) for result in results]
return result
@app.route('/')
def index():
return render_template('./flask_api_index.html')
@app.route('/result', methods=['POST'])
def result():
# submitした画像が存在したら処理する
if request.files['image']:
# 画像の読み込み
image_load = load_img(request.files['image'], target_size=(224,224))
# クラスの予測をする関数の実行
predict_Confidence = img_pred(image_load)
# render_template('./result.html')
return render_template('./result.html', title='予想クラス', predict_Confidence=predict_Confidence)
if __name__ == '__main__':
app.debug = True
app.run(host='localhost', port=5000)
HTML 만들기
layout.html
를 바탕으로 flask_api_index.html
와 result.html
를 작성해 갑니다.
layout.html<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>API Sample</title>
</head>
<body>
{% block content %}
<!-- ここに内容 -->
{% endblock %}
</body>
</html>
flask_api_index.html
는 localhost:5000
에 액세스했을 때 표시하는 HTML입니다.
flask_api_index.html{% extends "layout.html" %}
{% block content %}
<form action="/result" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/png, image/jpeg, image/jpg">
<button type="submit">Submit</button>
</form>
{% endblock %}
result.html
는 localhost:5000
에서 이미지를 선택하고 Submit을 누른 후 결과를 표시하는 HTML입니다.
result.html{% extends "layout.html" %}
{% block content %}
<h3>予想クラス</h3>
{{ predict_Confidence }}
{% endblock %}
서버를 세우고 실행
지금까지 가능하면 다음 코드를 실행하여 localhost:5000으로 이동합니다.
$ python3 server.py
이렇게 표시되어 넣으면 괜찮습니다.
플라스틱 병과 같은 물건의 이미지를 선택하고 submit을 누르십시오.http://localhost:5000/result
로 천이해, 예상 클래스의 Top2개가 표시되고 있으면 OK입니다.
기타 기사
Flask에서 기계 학습 API를 만들어 보았습니다.
VGG16을 Fine Tuning하여 2018년 상반기 브레이크 여배우·배우·연예인으로 분류해 보았다
Heroku에서 Python 앱을 배포해 보았습니다.
Reference
이 문제에 관하여(Flask에서 이미지 분류 웹 앱 만들기 (Mobile Net)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kagami-r0927/items/071dec59ff3cf52d9c93
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>API Sample</title>
</head>
<body>
{% block content %}
<!-- ここに内容 -->
{% endblock %}
</body>
</html>
{% extends "layout.html" %}
{% block content %}
<form action="/result" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/png, image/jpeg, image/jpg">
<button type="submit">Submit</button>
</form>
{% endblock %}
{% extends "layout.html" %}
{% block content %}
<h3>予想クラス</h3>
{{ predict_Confidence }}
{% endblock %}
지금까지 가능하면 다음 코드를 실행하여 localhost:5000으로 이동합니다.
$ python3 server.py
이렇게 표시되어 넣으면 괜찮습니다.
플라스틱 병과 같은 물건의 이미지를 선택하고 submit을 누르십시오.
http://localhost:5000/result
로 천이해, 예상 클래스의 Top2개가 표시되고 있으면 OK입니다.기타 기사
Flask에서 기계 학습 API를 만들어 보았습니다.
VGG16을 Fine Tuning하여 2018년 상반기 브레이크 여배우·배우·연예인으로 분류해 보았다
Heroku에서 Python 앱을 배포해 보았습니다.
Reference
이 문제에 관하여(Flask에서 이미지 분류 웹 앱 만들기 (Mobile Net)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kagami-r0927/items/071dec59ff3cf52d9c93
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Flask에서 이미지 분류 웹 앱 만들기 (Mobile Net)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kagami-r0927/items/071dec59ff3cf52d9c93텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)