#javascript #python #html #flask #heroku
#javascript #python #HTML #flask #heroku
Вопрос:
Я обучил простую модель распознавания цифр рукописного ввода с использованием Keras, где мы будем прогнозировать результаты на основе рисования и развертывать ее на сервере Heroku с помощью Flask. Он корректно работал на локальном сервере, но когда я развернул его на Heroku, я ничего не мог нарисовать. Может кто-нибудь, пожалуйста, найти, что я здесь делаю не так?
это файл интерфейса (main.html )
<html>
<head>
<style>
h1 {text-align: center;}
p {text-align: center;}
</style>
</head>
<form action="/draw" method="GET">
<fieldset>
<input name="Tweet" type ='text' style='display:none' id='a'/>
</fieldset>
<body onload="InitThis();">
<h1>Single digit recognizer using keras</h1>
<p> If you are getting wrong result then switch to large scale</p>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="JsCode.js"></script>
<script>
var mousePressed = false;
var lastX, lastY;
var ctx;
function InitThis() {
ctx = document.getElementById('myCanvas').getContext("2d");
$('#myCanvas').mousedown(function (e) {
mousePressed = true;
Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);
});
$('#myCanvas').mousemove(function (e) {
if (mousePressed) {
Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);
}
});
$('#myCanvas').mouseup(function (e) {
mousePressed = false;
});
$('#myCanvas').mouseleave(function (e) {
mousePressed = false;
});
}
var a1=0;
function Draw(x, y, isDown) {
if (isDown) {
ctx.beginPath();
ctx.strokeStyle = $('#selColor').val();
ctx.lineWidth = $('#selWidth').val();
ctx.lineJoin = "round";
ctx.moveTo(lastX, lastY);
ctx.lineTo(x, y);
ctx.closePath();
ctx.stroke();
a1 = document.getElementById('myCanvas').toDataURL('image/png');
document.querySelector('#a').value=a1;
}
lastX = x; lastY = y;
}
function clearArea() {
// Use the identity matrix while clearing the canvas
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
}
</script>
<div align="center">
<canvas id="myCanvas" width="200" height="200" style="border:2px solid black"></canvas>
<br /><br />
<button onclick="javascript:clearArea();return false;">Clear Area</button>
Line width : <select id="selWidth">
<option value="11" selected="selected">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
</select>
Color : <select id="selColor">
<option value="black">black</option>
<option value="blue" selected="selected">blue</option>
<option value="red">red</option>
<option value="green">green</option>
<option value="yellow">yellow</option>
<option value="gray">gray</option>
</select>
</div>
</body>
<div style="text-align:center">
<input type="submit" style="width: 300px; margin: 20 auto;" />
</div>
</form>
<br>
<div class="result" align="center">
{% if result %}
<p style="font-size:50px">{{ result }}</p>
{% endif %}
</div>
</html>
это внутренний файл (app.py )
import flask
from utils import *
import tensorflow as tf
# Use pickle to load in the pre-trained model
# Initialise the Flask app
app = flask.Flask(__name__, template_folder='templates')
# Set up the main route
l=['Zero','One','Two','Three','Four','Five','Six','Seven','Eight','Nine']
@app.route('/', methods=['GET', 'POST'])
def main():
return(flask.render_template('main.html'))
@app.route('/draw')
def draw1():
try:
a1 = flask.request.args.get('Tweet')
model=tf.keras.models.load_model('Model1.h5')
img=toImage(str(a1))
prediction=model.predict_classes(img)[0]
return flask.render_template('main.html',
result=l[prediction]
)
except Exception:
return flask.render_template('main.html',
result='Something went wrong please try again :)'
)
if __name__ == '__main__':
app.run()
утилиты.как преобразовать данные base64 в изображение
import base64
from PIL import Image
import io
import numpy as np
def toImage(s):
imgstring = s[22:]
imgdata = base64.b64decode(imgstring)
im = Image.open(io.BytesIO(imgdata))
im = im.resize((28,28))
im = im.convert('L')
im = np.array(im)/255
im=im.reshape(1,28,28,1)
return im
вот модель keras «‘ https://github.com/sachin327/draw/blob/main/Model1.h5 «‘
все необходимые файлы загружаются здесь «‘ https://github.com/sachin327/draw «‘
Комментарии:
1. Вы развернули / загрузили свой JsCode.js как хорошо?
2. @FedorPetrov да, в основном весь мой код (интерфейс) был написан в одном файле main.html (включая код javascript), и я развернул этот файл на Heroku с помощью flask. У меня нет дополнительного файла javascript.
3. Пытались ли вы использовать инструменты разработчика вашего браузера, чтобы узнать, какие запросы были запущены и какие сообщения об ошибках выдаются? The JsCode.js вопрос был в том, потому что у вас все еще есть это
<script type="text/javascript" src="JsCode.js"></script>
в вашем main.html . Если такого файла нет, однако вы включили код в сам HTML, то это, конечно, не должно вызывать проблем.