[機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_Streamlit Web應用程式篇

更新於 2024/01/06閱讀時間約 10 分鐘

前言

上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說

Streamlit網頁App_貓狗辨識 連結

程式碼Github連結

簡單WEB APP呈現

簡單WEB APP呈現


[機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇

如何連動github與stramlit可以參考一下這個文章解釋的蠻清楚的,我就不要班門弄斧了

Github上檔案說明

Github上檔案說明

Github上檔案說明


程式碼說明

# 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)
  1. 安裝相依套件:
    pythonCopy code# pip install streamlit
    # pip install streamlit-drawable-canvas
    這裡使用Streamlit及其相應的繪圖庫。
  2. 導入相關套件:
    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
  3. 載入預先訓練的模型:
    pythonCopy codemodel = tf.keras.models.load_model('model.h5')
    載入已經訓練好的模型。
  4. 設置Streamlit應用程式的標題:
    pythonCopy codest.title('Crab_A~Z辨識')
    設定應用程式的標題。
  5. 創建兩個欄位(Columns):
    pythonCopy codecol1, col2 = st.columns(2)
    在應用程式中創建兩個欄位,用於顯示手繪畫布和辨識結果。
  6. 在第一個欄位創建可繪畫的畫布:
    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",
    )
    這個畫布可以讓使用者自由繪製。
  7. 在第二個欄位檢查是否點擊了辨識按鈕:
    pythonCopy codeif st.button('辨識'):
    當使用者點擊了辨識按鈕時執行以下操作:
  8. 將手繪畫布的圖像轉換為灰度並調整大小:
    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]))

  • 這行程式碼使用預測的類別索引來顯示預測的字母。索引值被轉換為字母(A-Z)並與#組合,形成最終的預測結果。
  • 因為我們預測到的結果是相對應Train標記檔的索引(例如索引0代表A)但在Unicode 編碼65才代表表A,所以要轉換一下才能變成我們要顯示的英文字母
  • 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)

  • 這行程式碼顯示原始手繪圖像,讓使用者能夠看到他們繪製的字母。



若有問題歡迎提問,喜歡的話按下愛心 追蹤 給我點鼓勵 謝謝

avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
streamlit與github連動程式庫,呈現即時預測手寫英文字母 整理了一下,先前學的機器學習利用Colab來訓練出能辨識手寫A~Z英文字母的模型,使用的模型是CNN(Convolutional Neural Network,CNN)模型 訓練好的模型,當然是要拿來應用,成果呈現
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
streamlit與github連動程式庫,呈現即時預測手寫英文字母 整理了一下,先前學的機器學習利用Colab來訓練出能辨識手寫A~Z英文字母的模型,使用的模型是CNN(Convolutional Neural Network,CNN)模型 訓練好的模型,當然是要拿來應用,成果呈現
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
機器學習(Machine Learning,ML)已經在各個領域實現了令人印象深刻的成就,但同時也帶來了一系列重大的倫理挑戰。本文將深入探討這些挑戰,包括AI的偏見和公平性問題、隱私保護和數據安全,以及AI倫理的國際標準。 AI的偏見和公平性問題 1. 偏見的數據: ML模型的訓練數據可能包含偏
Thumbnail
在機器學習中,我們的目標是找到一種能夠最好地描述數據的模型。例如,在迴歸問題中,我們希望找到一種函數,該函數能以一種對我們的目標變數(例如:銷售量、股票價格等) 的最佳估計的方式,描述輸入特徵(例如:廣告支出、市場狀況等)。
Thumbnail
現在可以靠機器學習的演算法,幫助自己找到筆記中有價值的洞見了。近期 Obsidian 社群出現了一款非常有意思的插件 — Graph Analysis,它能依靠筆記之間的內部連結 (internal link) 計算相關性,讓我們在自己寫下的筆記中 “挖寶”。我發現這對於寫「人物筆記」非常有幫助,這
這篇文章主要是紀錄筆者在2022上半年尋找機器學習工程師(ML Engineer)的一些經驗和心得. 雖然網路上已經有非常多相關的資源和分享, 但鑑於在親身經歷的過程中仍舊學習到很多新的觀念和想法, 也受到非常多的幫助, 希望透過分享這些經驗能夠回饋給大家, 並或多或少的幫助有類似目標和想法的朋友.
Thumbnail
Google 一直致力於透過機器學習改善自家翻譯系統的準確度,利用人工智慧的力量提升機器翻譯品質,並於今年八月發表新機器學習模型 Universal Transformer。隨著機器學習模型不斷演進,AI 處理翻譯時的邏輯和策略也與真人譯者越來越相似。 原文連結
Thumbnail
兼回答觀眾來信問題 經過上一次的文章之後,棒棒的觀眾們依然有問題丟過來 有些觀眾的問題都滿認真的,也不好像其他節目一樣 在節目上講講就沒了,所以依然用文章的方式帶給大家一點東西。 我們先來看看觀眾疑問: 1. 是不是機器人預測的結果,都是依照revenue? 特徵是什麼? 特徵提取又是什麼?
Thumbnail
我之所以大膽的把股價預測稱之為「最強」,因為這本身就是一個可以變現的專案,並且可以同時累積數據分析及投資操作經驗,在投資與程式設計同時躍升為顯學的時代,把這兩條學習路徑融合在一起,似乎自然而然,也合情合理。當然,這條路的學習成本非常高,但翻山越嶺之後的美景也同樣讓人心神嚮往。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
機器學習(Machine Learning,ML)已經在各個領域實現了令人印象深刻的成就,但同時也帶來了一系列重大的倫理挑戰。本文將深入探討這些挑戰,包括AI的偏見和公平性問題、隱私保護和數據安全,以及AI倫理的國際標準。 AI的偏見和公平性問題 1. 偏見的數據: ML模型的訓練數據可能包含偏
Thumbnail
在機器學習中,我們的目標是找到一種能夠最好地描述數據的模型。例如,在迴歸問題中,我們希望找到一種函數,該函數能以一種對我們的目標變數(例如:銷售量、股票價格等) 的最佳估計的方式,描述輸入特徵(例如:廣告支出、市場狀況等)。
Thumbnail
現在可以靠機器學習的演算法,幫助自己找到筆記中有價值的洞見了。近期 Obsidian 社群出現了一款非常有意思的插件 — Graph Analysis,它能依靠筆記之間的內部連結 (internal link) 計算相關性,讓我們在自己寫下的筆記中 “挖寶”。我發現這對於寫「人物筆記」非常有幫助,這
這篇文章主要是紀錄筆者在2022上半年尋找機器學習工程師(ML Engineer)的一些經驗和心得. 雖然網路上已經有非常多相關的資源和分享, 但鑑於在親身經歷的過程中仍舊學習到很多新的觀念和想法, 也受到非常多的幫助, 希望透過分享這些經驗能夠回饋給大家, 並或多或少的幫助有類似目標和想法的朋友.
Thumbnail
Google 一直致力於透過機器學習改善自家翻譯系統的準確度,利用人工智慧的力量提升機器翻譯品質,並於今年八月發表新機器學習模型 Universal Transformer。隨著機器學習模型不斷演進,AI 處理翻譯時的邏輯和策略也與真人譯者越來越相似。 原文連結
Thumbnail
兼回答觀眾來信問題 經過上一次的文章之後,棒棒的觀眾們依然有問題丟過來 有些觀眾的問題都滿認真的,也不好像其他節目一樣 在節目上講講就沒了,所以依然用文章的方式帶給大家一點東西。 我們先來看看觀眾疑問: 1. 是不是機器人預測的結果,都是依照revenue? 特徵是什麼? 特徵提取又是什麼?
Thumbnail
我之所以大膽的把股價預測稱之為「最強」,因為這本身就是一個可以變現的專案,並且可以同時累積數據分析及投資操作經驗,在投資與程式設計同時躍升為顯學的時代,把這兩條學習路徑融合在一起,似乎自然而然,也合情合理。當然,這條路的學習成本非常高,但翻山越嶺之後的美景也同樣讓人心神嚮往。