from sklearn.datasets import fetch_openml from sklearn.model_selection import train_test_split import numpy as np import streamlit as st import tensorflow as tf import numpy as np import keras import matplotlib.pyplot as plt import pandas as pd from PIL import Image import streamlit as st from streamlit_drawable_canvas import st_canvas import cv2 import torch from skorch import NeuralNetClassifier from torch import nn import torch.nn.functional as F import matplotlib.pyplot as plt mnist = fetch_openml('mnist_784', as_frame=False, cache=False) X = mnist.data.astype('float32') y = mnist.target.astype('int64') X /= 255.0 #device = 'cuda' if torch.cuda.is_available() else 'cpu' XCnn = X.reshape(-1, 1, 28, 28) XCnn_train, XCnn_test, y_train, y_test = train_test_split(XCnn, y, test_size=0.25, random_state=42) from PIL import Image import torchvision.transforms as transforms class Cnn(nn.Module): def __init__(self, dropout=0.5): super(Cnn, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3) self.conv2 = nn.Conv2d(32, 64, kernel_size=3) self.conv2_drop = nn.Dropout2d(p=dropout) self.fc1 = nn.Linear(1600, 100) # 1600 = number channels * width * height self.fc2 = nn.Linear(100, 10) self.fc1_drop = nn.Dropout(p=dropout) def forward(self, x): x = torch.relu(F.max_pool2d(self.conv1(x), 2)) x = torch.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) # flatten over channel, height and width = 1600 x = x.view(-1, x.size(1) * x.size(2) * x.size(3)) x = torch.relu(self.fc1_drop(self.fc1(x))) x = torch.softmax(self.fc2(x), dim=-1) return x torch.manual_seed(0) # # Create an instance of your model # model = NeuralNetClassifier( # Cnn, # max_epochs=10, # lr=0.002, # optimizer=torch.optim.Adam, # device=device, import streamlit as st import torch from PIL import Image import cv2 import numpy as np #device = 'cuda' if torch.cuda.is_available() else 'cpu' XCnn = X.reshape(-1, 1, 28, 28) XCnn_train, XCnn_test, y_train, y_test = train_test_split(XCnn, y, test_size=0.25, random_state=42) from PIL import Image import torchvision.transforms as transforms class Cnn(nn.Module): def __init__(self, dropout=0.5): super(Cnn, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3) self.conv2 = nn.Conv2d(32, 64, kernel_size=3) self.conv2_drop = nn.Dropout2d(p=dropout) self.fc1 = nn.Linear(1600, 100) # 1600 = number channels * width * height self.fc2 = nn.Linear(100, 10) self.fc1_drop = nn.Dropout(p=dropout) def forward(self, x): x = torch.relu(F.max_pool2d(self.conv1(x), 2)) x = torch.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) # flatten over channel, height and width = 1600 x = x.view(-1, x.size(1) * x.size(2) * x.size(3)) x = torch.relu(self.fc1_drop(self.fc1(x))) x = torch.softmax(self.fc2(x), dim=-1) return x torch.manual_seed(0) # # Create an instance of your model # model = NeuralNetClassifier( # Cnn, # max_epochs=10, # lr=0.002, # optimizer=torch.optim.Adam, # device=device, # ) model=Cnn() # Specify the path to the saved model weights model_weights_path = 'model_weights.pth' # Load the model weights model.load_state_dict(torch.load(model_weights_path,map_location=torch.device('cpu'))) # Set the model to evaluation mode for inference model.eval() # Create a NeuralNetClassifier using the loaded model cnn = NeuralNetClassifier( module=model, max_epochs=0, # Set max_epochs to 0 to avoid additional training lr=0.002, # You can set this to the learning rate used during training optimizer=torch.optim.Adam, # You can set the optimizer used during training device='cpu' # You can specify the device ('cpu' for CPU, 'cuda' for GPU, etc.) ) cnn.fit(XCnn_train, y_train) stroke_width = st.sidebar.slider("Stroke width: ", 1, 35, 32) stroke_color = st.sidebar.color_picker("Stroke color hex: ") bg_color = st.sidebar.color_picker("Background color hex: ", "#eee") bg_image = st.sidebar.file_uploader("Background image:", type=["png", "jpg"]) drawing_mode = st.sidebar.selectbox( "Drawing tool:", ("freedraw", "line", "rect", "circle", "transform", "polygon") ) realtime_update = st.sidebar.checkbox("Update in realtime", True) # Create a canvas component canvas_result = st_canvas( fill_color="rgba(255, 165, 0, 0.3)", # Fixed fill color with some opacity stroke_width=stroke_width, stroke_color=stroke_color, background_color=bg_color, background_image=Image.open(bg_image) if bg_image else None, update_streamlit=realtime_update, height=300, drawing_mode=drawing_mode, display_toolbar=st.sidebar.checkbox("Display toolbar", True), key="full_app", ) # Do something interesting with the image data and paths # Do something interesting with the image data and paths if canvas_result.image_data is not None: #st.image(canvas_result.image_data) image = canvas_result.image_data image1 = image.copy() image1 = image1.astype('uint8') image1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) image1 = cv2.resize(image1,(28,28)) st.image(image1) image1.resize(1,1,28,28) st.title(np.argmax(cnn.predict(image1))) if canvas_result.json_data is not None: st.dataframe(pd.json_normalize(canvas_result.json_data["objects"]))