# Deploy a Deep Learning Model with Streamlit
Trong bài viết này nhóm tôi sẽ hướng dẫn cách tạo một app
để dự đoán đây là con chim nào với Streamlit và mô hình CNN
## Installation
Đầu tiên hãy install những thư viện cần thiết
- tensorflow
- numpy
- streamlit
## Xây dựng mô hình
Trước hết, bạn cần xây dựng mô hình Deep Learning model. Ở đây, nhóm tôi sử dụng mô hình Google Colab để train mô hình
### B1: import các thư viện
```python=
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.callbacks import *
import numpy as np
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import Model
from tensorflow.keras.applications.resnet50 import preprocess_input
np.random.seed(42)
import matplotlib.pyplot as plt
```
### B2: kết nối với drive của bạn và giải nén file
```python=
from google.colab import drive
drive.mount('/content/drive', force_remount=True)
!unzip "/content/drive/MyDrive/Project/bird.zip"
```
### B3: Lưu dữ liệu vào 3 tập train, valid, test
```python=
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(shear_range=0.1, zoom_range=0.1, horizontal_flip=True)
valid_datagen = ImageDataGenerator()
test_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory('/content/train', color_mode='rgb', target_size=(224,224), batch_size=128, save_format='jpg', class_mode='categorical', shuffle=True, subset='training',seed=42)
validation_generator = valid_datagen.flow_from_directory('/content/valid', color_mode='rgb', target_size=(224,224), batch_size=128, save_format='jpg', class_mode='categorical', shuffle=True, subset='training', seed=42)
test_generator = test_datagen.flow_from_directory('/content/test', mode='rgb', target_size=(224,224), batch_size=128, save_format='jpg', class_mode='categorical', shuffle=True, subset='training', seed=42)
```
### B4: Xây dựng và huấn luyện mô hình
Ở đây ta sử dụng kỹ thuật Transfer Learning và Fine-tuning với mô hình Resnet50 đã được train từ trước.
```python=
# Xây dựng mô hình
stop1 = EarlyStopping(monitor='val_accuracy', patience=10, restore_best_weights=True)
stop2 = EarlyStopping(monitor='val_accuracy', patience=10, restore_best_weights=False)
model_checkpoint= ModelCheckpoint(filepath='/content/drive/MyDrive/Project/weights_resnet_adam.hdf5', save_weights_only=True, monitor='val_accuracy', mode='max', save_best_only=True)
callbacks = [model_checkpoint_callback,earlystopping]
base_model = ResNet50(input_shape=(224,224,3),
include_top=False,
weights='imagenet')
base_model.trainable = False
base_model.summary()
global_average_layer = GlobalAveragePooling2D()
prediction_layer = Dense(260, activation='softmax')
inputs = Input(shape=(224, 224, 3))
x = preprocess_input(inputs)
x = base_model(x, training=False)
x = global_average_layer(x)
outputs = prediction_layer(x)
model = Model(inputs, outputs)
model.summary()
# Train những layer cuối
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(train_generator, validation_data=validation_generator, callbacks=callbacks,epochs=1000)
```
```python=
# Fine-tuning
base_model.trainable = True
print(len(base_model.layers))
for layer in base_model.layers[:100]:
layer.trainable = False
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(train_generator, validation_data=validation_generator, callbacks=[checkpoint_acc, stop2, lr], epochs=100)
```
### B5: Lưu lại mô hình, hàm tf.keras.models.load_model tải mô hình mà ta đã train trong google colab
```python=
model.save('/content/drive/MyDrive/Project/model_resnet50.hdf5')
```
## Xây dựng app đơn giản bằng streamlit
Trước khi tiếp tục, các bạn hãy tải và giải nén bộ dữ liệu trên [tại đây](https://www.kaggle.com/gpiosenka/100-bird-species).
Lưu ý: Bộ dữ liệu này có thể đã được cập nhật thêm tại thời điểm bạn đọc bài viết này, vì thể hãy tinh chỉnh một chút cho phù hợp nhé!
### B1: Download mô hình về máy
Ta down tập tin "model_resnet50.hdf5" vể máy để sử dụng. Sau đó trên máy tính, mở VS Code và thực hiện xây dựng mô hình lại như trên. Các bạn có thể sử dụng công cụ khác như PyCharm, Sublime Text, ...
```python=
import streamlit as st
import numpy as np
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import Model
from tensorflow.keras.layers import *
from tensorflow.keras.applications.resnet50 import preprocess_input
base_model = ResNet50(input_shape=(224,224,3),
include_top=False,
weights='imagenet')
base_model.trainable = True
global_average_layer = GlobalAveragePooling2D()
prediction_layer = Dense(260, activation='softmax')
inputs = Input(shape=(224, 224, 3))
x = preprocess_input(inputs)
x = base_model(x, training=False)
x = global_average_layer(x)
outputs = prediction_layer(x)
model = Model(inputs, outputs)
base_model.trainable = True
for layer in base_model.layers[:100]:
layer.trainable = False
model.load_weights('D:\\AI\\Birds\\weights_resnet_acc.hdf5')
```
### B2: Sử dụng thư viện Streamlit xây dựng app
Tôi sẽ gọi tập tin sau đây là $ui.py$
```python=
import streamlit as st
import numpy as np
from load_model import model
import os
import matplotlib.image as mpimg
from tensorflow.keras.applications.resnet50 import preprocess_input
model.load_weights('D:\\AI\\Project\\weights_resnet_acc.hdf5')
st.title('BIRDS CLASSIFICATION APP')
st.write('260 Species of Birds:')
birds_species = os.listdir('D:\\AI\\Project\\archived\\consolidated')
birds_species = sorted(birds_species)
diction = dict()
for i in range(10):
diction['collumn '+str(i)] = list()
for i in range(10):
for j in range(26):
diction['collumn '+str(i)].append(birds_species[(26*i+j)])
st.write(pd.DataFrame(diction))
opt = st.selectbox(options=birds_species, label='Choose a species to see')
img = mpimg.imread(f'D:\\AI\\Project\\archived\\test\\{opt}\\1.jpg')
st.image(img)
uploaded_img = st.file_uploader(label="Choose a image of a bird you want to know the names")
if uploaded_img != None:
img = mpimg.imread(uploaded_img)
img = preprocess_input(img)
img = img.reshape(1,224,224,3)
output = model.predict(img)
output = birds_species[output.argmax()]
st.write('*The image shows the: *')
if uploaded_img != None:
st.write(output)
```
Sau khi code xong, bạn hãy mở Command Prompt nhập dòng lệnh "streamlit run ..." với dấu "..." là đường dẫn của tập tin $ui.py$ trên máy tính của bạn.

Từ đó, Streamlit sẽ load một Web app đơn giản trên trình duyệt của bạn


Các bạn sẽ thấy 3 phần:
- Phần bảng liệt kê 260 loài chim mà mô hình đã được train
- Các bạn có thể chọn ở Select Box phía dưới để xem hình ảnh mẫu của từng loài.
- Phần còn lại là một ô chứa để cái bạn có thể duyệt tập tin hình ảnh và xem được kết quả của mô hình.