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

更新於 發佈於 閱讀時間約 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
131會員
218內容數
本業是影像辨識軟體開發,閒暇時間進修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
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
作為一名機器學習碩博士生,你的生活可能充滿了訓練模型的長時間等待、GPU 的卡頓、失控的超參數調整,甚至無窮無盡的 Debug。這些日常的壓力,難免會影響你的情緒,而與伴侶的爭吵也變得在所難免。 但即便如此,親密關係的穩定仍然能為你在學術研究中提供巨大支持。而我發現,長期穩定的親密關係
🌟 監督學習演算法(Supervised Learning Algorithms) 1️⃣ 線性回歸(Linear Regression) 應用場景:數值型預測,例如房價預測。 優勢: 簡單易懂,適合初學者。 對於線性關係的數據擬合效果佳。 局限: 無法處理非線性資料。 對異常值敏
最新研究顯示,生物演化的過程比傳統觀點更具可預測性。諾丁漢大學的研究團隊在《美國國家科學院院刊》(PNAS)上發表成果,運用機器學習技術分析細菌基因組,揭示了基因之間的確定性交互作用。研究表明,某些基因在特定環境中會引發可預測的生物反應,挑戰了演化隨機性的傳統觀點。
Thumbnail
**機器學習在蛋白質結構預測中的作用:AlphaFold 案例** 在藥物開發過程中,了解蛋白質的結構至關重要,因為蛋白質的形狀決定了它如何與其他分子互動。傳統方法需要耗費大量時間和資源,通過實驗方式解析蛋白質結構。AlphaFold 作為一款深度學習 AI 算法,突破了這一瓶頸。 **
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在 AI說書 - 從0開始 - 114 建立了 Transformer 模型,並在 AI說書 - 從0開始 - 115 載入權重並執行 Tokenizing,現
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在 AI說書 - 從0開始 - 114 建立了 Transformer 模型。 現在我們來載入預訓練權重,預訓練的權重包含 Transformer 的智慧
Thumbnail
這是一篇介紹如何使用AI來生成貓貓圖片的文章,作者透過幾個軟體的使用經驗,分享了AI生成圖片的效果以及注意事項。文章內容豐富,並且有各種關鍵字和描述,可以吸引潛在讀者。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
streamlit與github連動程式庫,呈現即時預測手寫英文字母 整理了一下,先前學的機器學習利用Colab來訓練出能辨識手寫A~Z英文字母的模型,使用的模型是CNN(Convolutional Neural Network,CNN)模型 訓練好的模型,當然是要拿來應用,成果呈現
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
作為一名機器學習碩博士生,你的生活可能充滿了訓練模型的長時間等待、GPU 的卡頓、失控的超參數調整,甚至無窮無盡的 Debug。這些日常的壓力,難免會影響你的情緒,而與伴侶的爭吵也變得在所難免。 但即便如此,親密關係的穩定仍然能為你在學術研究中提供巨大支持。而我發現,長期穩定的親密關係
🌟 監督學習演算法(Supervised Learning Algorithms) 1️⃣ 線性回歸(Linear Regression) 應用場景:數值型預測,例如房價預測。 優勢: 簡單易懂,適合初學者。 對於線性關係的數據擬合效果佳。 局限: 無法處理非線性資料。 對異常值敏
最新研究顯示,生物演化的過程比傳統觀點更具可預測性。諾丁漢大學的研究團隊在《美國國家科學院院刊》(PNAS)上發表成果,運用機器學習技術分析細菌基因組,揭示了基因之間的確定性交互作用。研究表明,某些基因在特定環境中會引發可預測的生物反應,挑戰了演化隨機性的傳統觀點。
Thumbnail
**機器學習在蛋白質結構預測中的作用:AlphaFold 案例** 在藥物開發過程中,了解蛋白質的結構至關重要,因為蛋白質的形狀決定了它如何與其他分子互動。傳統方法需要耗費大量時間和資源,通過實驗方式解析蛋白質結構。AlphaFold 作為一款深度學習 AI 算法,突破了這一瓶頸。 **
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在 AI說書 - 從0開始 - 114 建立了 Transformer 模型,並在 AI說書 - 從0開始 - 115 載入權重並執行 Tokenizing,現
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在 AI說書 - 從0開始 - 114 建立了 Transformer 模型。 現在我們來載入預訓練權重,預訓練的權重包含 Transformer 的智慧
Thumbnail
這是一篇介紹如何使用AI來生成貓貓圖片的文章,作者透過幾個軟體的使用經驗,分享了AI生成圖片的效果以及注意事項。文章內容豐富,並且有各種關鍵字和描述,可以吸引潛在讀者。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
streamlit與github連動程式庫,呈現即時預測手寫英文字母 整理了一下,先前學的機器學習利用Colab來訓練出能辨識手寫A~Z英文字母的模型,使用的模型是CNN(Convolutional Neural Network,CNN)模型 訓練好的模型,當然是要拿來應用,成果呈現