上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說
[機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇
如何連動github與stramlit可以參考一下這個文章解釋的蠻清楚的,我就不要班門弄斧了
# pip install streamlit
# pip install streamlit-drawable-canvas
import streamlit as st
from streamlit_drawable_canvas import st_canvas
from skimage import data, color, io
from skimage.transform import rescale, resize, downscale_local_mean
from skimage.color import rgb2gray, rgba2rgb
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.models import model_from_json
# 模型載入
model = tf.keras.models.load_model('model.h5')
st.title('Crab_A~Z辨識')
col1, col2 = st.columns(2)
with col1:
# Create a canvas component
canvas_result = st_canvas(
fill_color="rgba(0, 0, 0, 1)",
stroke_width=10,
stroke_color="rgba(0, 0, 0, 1)",
update_streamlit=True,
width=280,
height=280,
drawing_mode="freedraw",
key="canvas1",
)
with col2:
if st.button('辨識'):
# print(canvas_result.image_data.shape)
image1 = rgb2gray(rgba2rgb(canvas_result.image_data))
image_resized = resize(image1, (28, 28), anti_aliasing=True)
# print(image_resized)
X1 = image_resized.reshape(1,28,28) # / 255
X1 = np.abs(1-X1)
st.write("predict...")
predictions = np.argmax(model.predict(X1), axis=-1)
st.write('# ' + chr(ord('A')+predictions[0]))
st.image(image_resized)
pythonCopy code# pip install streamlit這裡使用Streamlit及其相應的繪圖庫。
# pip install streamlit-drawable-canvas
pythonCopy codeimport streamlit as st
from streamlit_drawable_canvas import st_canvas
from skimage import data, color, io
from skimage.transform import rescale, resize, downscale_local_mean
from skimage.color import rgb2gray, rgba2rgb
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.models import model_from_json
pythonCopy codemodel = tf.keras.models.load_model('model.h5')載入已經訓練好的模型。
pythonCopy codest.title('Crab_A~Z辨識')設定應用程式的標題。
pythonCopy codecol1, col2 = st.columns(2)在應用程式中創建兩個欄位,用於顯示手繪畫布和辨識結果。
pythonCopy codecanvas_result = st_canvas(這個畫布可以讓使用者自由繪製。
fill_color="rgba(0, 0, 0, 1)",
stroke_width=10,
stroke_color="rgba(0, 0, 0, 1)",
update_streamlit=True,
width=280,
height=280,
drawing_mode="freedraw",
key="canvas1",
)
pythonCopy codeif st.button('辨識'):當使用者點擊了辨識按鈕時執行以下操作:
pythonCopy codeimage1 = rgb2gray(rgba2rgb(canvas_result.image_data))
image_resized = resize(image1, (28, 28), anti_aliasing=True)
rgba2rgb(canvas_result.image_data):
canvas_result.image_
data包含手繪畫布上的像素資料。
rgba2rgb將RGBA格式(包含紅、綠、藍和透明度通道)的畫布轉換為RGB格式。
rgb2gray(...):
rgb2gray將RGB格式的圖像轉換為灰度圖像。
為了簡化模型的輸入,我們將手繪畫布上的彩色圖像轉換為灰度圖像,這樣每個像素只有一個灰度值。
resize(image1, (28, 28), anti_aliasing=True):
resize函數將灰度圖像調整大小為模型所期望的大小(28x28像素)。
anti_aliasing=True表示在調整大小過程中使用反鋸齒濾波,以平滑像素值,有助於提高預測的準確性。
9.預處理圖像資料,使其適應模型輸入要求:
pythonCopy codeX1 = image_resized.reshape(1, 28, 28)
X1 = np.abs(1 - X1)
reshape(1, 28, 28) :
重新形狀為一個包含單一樣本的三維數組
深度學習模型通常期望輸入是一批樣本的集合,即 (樣本數, 高度, 寬度, 通道數)
。在這裡,我們的樣本數為1,因為我們只有一張手繪的圖像。
X1 = np.abs(1 - X1)
:將像素值正規化為範圍在0到1之間,以符合深度學習模型對輸入數據的期望。
np.abs(1 - X1)
,將像素值反轉,使原本的黑色背景變為白色,有助於與模型的訓練數據一致。10.進行預測並顯示結果:
pythonCopy codepredictions = np.argmax(model.predict(X1), axis=-1)使用模型進行預測並顯示辨識結果,包括預測的字母和調整大小後的圖像。
st.write('# ' + chr(ord('A')+predictions[0]))
st.image(image_resized)
predictions = np.argmax(model.predict(X1), axis=-1)
:model.predict(X1)
使用深度學習模型對處理後的手繪圖像進行預測。np.argmax(..., axis=-1)
得到預測結果中概率最高的類別索引。會得到是一個字母的索引。st.write('# ' + chr(ord('A')+predictions[0]))
:#
組合,形成最終的預測結果。chr(ord('A')+predictions[0])
將索引轉換為字母。ord('A')+predictions[0]:
ord('A') 返回大寫字母 'A' 的 Unicode 編碼,也就是65。
predictions[0] 是模型預測的字母的索引。
將這兩者相加,就會得到預測字母的 Unicode 編碼。
chr(...):
chr 函數將 Unicode 編碼轉換為對應的字符(A~Z)。
在這裡,chr(ord('A')+predictions[0]) 將預測的字母索引轉換為對應的字母字符。
st.image(image_resized)
: