Cara memasang jaringan neural ke situs web dengan cepat





Dalam materi ini, diusulkan, dengan sedikit usaha, untuk menghubungkan python 3.7 + labu + tensorflow 2.0 + keras + inklusi kecil js dan menampilkan interaktivitas tertentu pada halaman web. Pengguna, menggambar di kanvas, akan mengirim nomor untuk dikenali, dan model yang dilatih sebelumnya menggunakan arsitektur CNN akan mengenali gambar yang dihasilkan dan mengeluarkan hasilnya. Model ini dilatih pada kumpulan digit tulisan tangan MNIST yang terkenal, oleh karena itu, model hanya akan mengenali digit dari 0 hingga 9 inklusif. Windows 7 digunakan sebagai sistem di mana semua ini akan berputar.



Pengenalan kecil



Hal yang menyedihkan tentang buku pembelajaran mesin adalah bahwa kodenya menjadi usang segera setelah buku itu sendiri diterbitkan. Dan itu bagus jika penulis publikasi mendukung anaknya, memelihara dan memperbarui kode, tetapi seringkali semuanya terbatas pada apa yang mereka tulis - inilah persyaratan.txt, instal paket yang sudah ketinggalan zaman, dan semuanya akan berfungsi.



Itu terjadi kali ini juga. Membaca Pembelajaran Mendalam Python untuk Web secara Langsung oleh Anubhav Singh, Sayak Paul, semuanya berjalan dengan baik pada awalnya. Namun, setelah chapter pertama, liburan telah usai. Hal yang paling tidak menyenangkan adalah bahwa persyaratan yang disebutkan dalam persyaratan umumnya dipenuhi.



Pengembang paket tensorflow dan keras itu sendiri menambahkan bahan bakar ke api. Satu paket hanya berfungsi dengan paket tertentu lainnya dan, baik downgrade salah satunya atau rebana dukun.

Tapi itu belum semuanya. Ternyata beberapa paket juga bergantung pada arsitektur!



Jadi, jika tidak ada alternatif untuk besi, tensorflow 2.0 dipasang pada platform dengan Celeron j1900 dan, ternyata, tidak ada instruksi AVX2 di sana:





Dan opsi melalui pip install tensorflow tidak berfungsi.



Tapi tidak semuanya begitu sedih dengan keinginan dan Internet!



Varian dengan tensorflow 2.0 diimplementasikan melalui wheel - github.com/fo40225/tensorflow-windows-wheel/tree/master/2.0.0/py37/CPU/sse2 dan instalasi x86: vc_redist.x86.exe, x64: vc_redist.x64 .exe (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).



Keras telah diinstal dengan versi minimum yang "menjadi kompatibel" dengan tensorflow - Keras == 2.3.0.



karena itu



pip install tensorflow-2.0.0-cp37-cp37m-win_amd64.whl
      
      





dan



pip install keras==2.3.0
      
      





Aplikasi utama



Mari pertimbangkan kode program utama.



flask_app.py

#code work with scipy==1.6.1, tensorflow @ file:///D:/python64/tensorflow-2.0.0-cp37-cp37m-win_amd64.whl,
#Keras==2.3.0

from flask import Flask, render_template, request
import imageio
#https://imageio.readthedocs.io/en/stable/examples.html
#from scipy.misc import imread, imresize
#from matplotlib.pyplot import imread
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import model_from_json
from skimage import transform,io

json_file = open('model.json','r')
model_json = json_file.read()
json_file.close()
model = model_from_json(model_json)
model.load_weights("weights.h5")
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
#graph = tf.get_default_graph()
graph = tf.compat.v1.get_default_graph()

app = Flask(__name__)

@app.route('/')
def index():
    return render_template("index.html")
import re
import base64

def convertImage(imgData1):
    imgstr = re.search(r'base64,(.*)', str(imgData1)).group(1)
    with open('output.png', 'wb') as output:
        output.write(base64.b64decode(imgstr))

@app.route('/predict/', methods=['GET', 'POST'])
def predict():
    global model, graph
    
    imgData = request.get_data()
    convertImage(imgData)
    #print(imgData)
   
    #x = imread('output.png', mode='L')
    #x.shape
    #(280, 280)
    x = imageio.imread('output.png',pilmode='L')
    #x = imresize(x, (28, 28))
    #x = x.resize(x, (28, 28))
    x = transform.resize(x, (28,28), mode='symmetric', preserve_range=True)
    #(28, 28)
    #type(x)
    #<class 'numpy.ndarray'>

    x = x.reshape(1, 28, 28, 1)
    #(1, 28, 28, 1) 
    x = tf.cast(x, tf.float32)
    
    # perform the prediction
    out = model.predict(x)        
    #print(np.argmax(out, axis=1))
    # convert the response to a string
    response = np.argmax(out, axis=1)
    return str(response[0])

if __name__ == "__main__":
    # run the app locally on the given port
    app.run(host='0.0.0.0', port=80)
# optional if we want to run in debugging mode
    app.run(debug=True)

      
      









Paket yang diunggah:


from flask import Flask, render_template, request
import imageio
#https://imageio.readthedocs.io/en/stable/examples.html
#from scipy.misc import imread, imresize
#from matplotlib.pyplot import imread
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import model_from_json
from skimage import transform,io

      
      





Seperti yang saya baca, imresize sudah tidak digunakan lagi sejak scipy == 1.0. Tidak jelas bagaimana semuanya bekerja untuk penulis, mengingat buku tersebut relatif baru (2019). Dengan scipy modern == 1.6.1, versi kutu buku dari kode tidak berfungsi.



Kami memuat dari disk, mengompilasi model jaringan neural:




json_file = open('model.json','r')
model_json = json_file.read()
json_file.close()
model = model_from_json(model_json)
model.load_weights("weights.h5")
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
#graph = tf.get_default_graph()
graph = tf.compat.v1.get_default_graph()

      
      





Di sini kami menggantinya dengan tf.compat.v1.get_default_graph () karena ketidakcocokan.



Berikutnya adalah bagian server flask. "Menggambar" dari template halaman:




@app.route('/')
def index():
    return render_template("index.html")

      
      





Bagian yang mengubah gambar menjadi array numerik:




import re
import base64

def convertImage(imgData1):
    imgstr = re.search(r'base64,(.*)', str(imgData1)).group(1)
    with open('output.png', 'wb') as output:
        output.write(base64.b64decode(imgstr))

      
      





Fungsi prediksi utama:




def predict():
    global model, graph
    
    imgData = request.get_data()
    convertImage(imgData)
    #print(imgData)
   
    #x = imread('output.png', mode='L')
    #x.shape
    #(280, 280)
    x = imageio.imread('output.png',pilmode='L')
    #x = imresize(x, (28, 28))
    #x = x.resize(x, (28, 28))
    x = transform.resize(x, (28,28), mode='symmetric', preserve_range=True)
    #(28, 28)
    #type(x)
    #<class 'numpy.ndarray'>

    x = x.reshape(1, 28, 28, 1)
    #(1, 28, 28, 1) 
    x = tf.cast(x, tf.float32)
    
    # perform the prediction
    out = model.predict(x)        
    #print(np.argmax(out, axis=1))
    # convert the response to a string
    response = np.argmax(out, axis=1)
    return str(response[0])

      
      





Garis-garis itu diberi komentar, yang diganti dengan yang berfungsi, dan kesimpulan dari garis-garis terpisah juga ditinggalkan untuk kejelasan.



Bagaimana itu bekerja



Setelah memulai dengan perintah python flask_app.py , server flask lokal diluncurkan, yang menampilkan index.html diselingi dengan js.



Pengguna menggambar angka di kanvas, mengklik "prediksi". Gambar "terbang" ke server, di mana gambar itu disimpan dan diubah menjadi larik digital. Selanjutnya, CNN memasuki pertarungan, mengenali digit tersebut dan mengembalikan jawabannya dalam bentuk digit.



Jaringan tidak selalu memberikan jawaban yang benar, karena dipelajari hanya untuk 10 era. Ini dapat diamati jika Anda menggambar figur yang "kontroversial", yang dapat ditafsirkan dengan cara yang berbeda.



* Anda dapat memutar penggeser untuk menambah atau mengurangi ketebalan garis luar nomor untuk tujuan pengenalan.



Versi kedua dari program ini adalah melalui API, curl



Pengguna mengupload gambarnya dengan nomor untuk dikenali ke server dan mengklik "kirim":







Mari kita ganti index.js dengan yang berikut ini:



index.js:
$("form").submit(function(evt){
	evt.preventDefault();
	var formData = new FormData($(this)[0]);
	$.ajax({
		url: '/predict/',
		type: 'POST',
		data: formData,
		async: false,
		cache: false,
		contentType: false,
		enctype: 'multipart/form-data',
		processData: false,
		success: function (response) {
			$('#result').empty().append(response);
		}
	});
	return false;
});

      
      







Template halaman juga akan berubah:



index.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>MNIST CNN</title>
</head>
<body>
<h1>MNIST Handwritten Digits Prediction</h1>
<form>
<input type="file" name="img"></input>
<input type="submit"></input>
</form>
<hr>
<h3>Prediction: <span id="result"></span></h3>
<script
src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
<script src="{{ url_for('static',filename='index.js') }}"></script>
</body>
</html>

      
      







Program utama juga akan sedikit berubah:



flask_app2.py

#code work with scipy==1.6.1, tensorflow @ file:///D:/python64/tensorflow-2.0.0-cp37-cp37m-win_amd64.whl,
#Keras==2.3.0

from flask import Flask, render_template, request
import imageio
#https://imageio.readthedocs.io/en/stable/examples.html
#from scipy.misc import imread, imresize
#from matplotlib.pyplot import imread
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import model_from_json
from skimage import transform,io


json_file = open('model.json','r')
model_json = json_file.read()
json_file.close()
model = model_from_json(model_json)
model.load_weights("weights.h5")
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
#graph = tf.get_default_graph()
graph = tf.compat.v1.get_default_graph()

app = Flask(__name__)

@app.route('/')
def index():
    return render_template("index.html")

import re
import base64

def convertImage(imgData1):
    imgstr = re.search(r'base64,(.*)', str(imgData1)).group(1)
    with open('output.png', 'wb') as output:
        output.write(base64.b64decode(imgstr))

@app.route('/predict/', methods=['POST'])
def predict():
    global model, graph
    
    imgData = request.get_data()
    try:
        stringToImage(imgData)
    except:
        f = request.files['img']
        f.save('image.png')
       
    #x = imread('output.png', mode='L')
    #x.shape
    #(280, 280)
    x = imageio.imread('image.png',pilmode='L')
    #x = imresize(x, (28, 28))
    #x = x.resize(x, (28, 28))
    x = transform.resize(x, (28,28), mode='symmetric', preserve_range=True)
    #(28, 28)
    #type(x)
    #<class 'numpy.ndarray'>

    x = x.reshape(1, 28, 28, 1)
    #(1, 28, 28, 1) 
    x = tf.cast(x, tf.float32)
    
    # perform the prediction
    out = model.predict(x)        
    #print(np.argmax(out, axis=1))
    # convert the response to a string
    response = np.argmax(out, axis=1)
    return str(response[0])

if __name__ == "__main__":

    # run the app locally on the given port
    app.run(host='0.0.0.0', port=80)
# optional if we want to run in debugging mode
    app.run(debug=True)


      
      







Semuanya dimulai dengan cara yang sama - python flask_app2.py



Opsi curl (untuk windows)



Unduh curl



Di baris perintah windows, kirim perintah:




curl -X POST -F img=@1.png http://localhost/predict/

      
      





di mana 1.png adalah gambar dengan angka (atau dengan path ke sana).

Digit yang dikenali akan tiba sebagai tanggapan.



File untuk diunduh - unduh .



All Articles