使用 Streamlit 和 Heroku 在 Web 上部署图像分类
介绍
在本指南中,您将学习如何使用 Streamlit 和 Heroku 在 Web 上部署图像分类器。图像分类器是一种计算机视觉算法,能够根据图像文件的内容将图像分配给特定的预定义类别。它用于使应用程序能够对图像数据执行分类和排序任务。
在本指南中,您将从 Google Teachable Machine 下载一个简单的二元分类器。本指南假设您具有中级 Python 知识。本指南的其他先决条件是:
Streamlit 的基础知识
机器学习中图像分类的基础知识
Google Teachable Machine 平台的基础知识
以下是一个真实场景:
想象一下,您是一家远程优先 AI/ML 初创公司的机器学习工程师。您是专门从事 AI 和 ML 的研发团队的一员。由于是远程优先,您不仅需要与团队成员分享您的图像分类应用想法,还需要与其他团队和公司员工分享,他们可能不了解 ML,但想测试您的解决方案的实用性。您还需要向公众推出您的图像分类解决方案。这意味着它应该简单、直观且易于访问,并且您应该知道如何部署 ML 解决方案。
环境设置
要准备好环境,请运行命令安装相关软件包
pip 安装 keras streamlit pillow numpy
有了这四个包,您就可以启动一个简单的图像分类器了。
使用 Google Teachable Machine 进行图像分类
Teachable Machine允许您在网络上训练分类器模型。您可以创建图像、音频或姿势项目。在本例中,请选择图像分类项目。在本指南中,您将使用Kaggle上的脑肿瘤检测数据集。点击链接下载数据集。
进入图像分类页面后,将第 1 类标记为脑肿瘤,第 2 类标记为无脑肿瘤。将图像上传到相应的类别。上传数据后,单击训练模型按钮并等待结果。
完成后,您将能够下载扩展名为.h5 的权重文件。您将使用它来完成分类任务。
基于 Streamlit 的图像分类器
在您的开发文件夹中,创建一个名为app.py 的文件。该文件包含负责在网页上显示内容的 Streamlit 代码。
要通过提供页眉、标题和描述来设置页面,请编写以下代码。
import streamlit as st
st.title("Image Classification with Google's Teachable Machine")
st.header("Brain Tumor MRI Classification Example")
st.text("Upload a brain MRI Image for image classification as tumor or no-tumor")
接下来,处理文件上传、Teachable Machine 分类器处理,最后显示结果。为确保代码整洁并遵循最佳实践,请创建一个单独的文件来处理实际分类。
图像分类代码
在包含app.py的同一文件夹中,创建一个名为img_classification.py的文件。这将保存您将在app.py文件中调用的分类函数,用于图像分类。
要执行分类,请将您下载的.h5格式的权重文件加载到 keras 模型中。
import keras
from PIL import Image, ImageOps
import numpy as np
def teachable_machine_classification(img, weights_file):
# Load the model
model = keras.models.load_model(weights_file)
# Create the array of the right shape to feed into the keras model
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
image = img
#image sizing
size = (224, 224)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
#turn the image into a numpy array
image_array = np.asarray(image)
# Normalize the image
normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
# Load the image into the array
data[0] = normalized_image_array
# run the inference
prediction = model.predict(data)
return np.argmax(prediction) # return position of the highest probability
Streamlit 文件处理和结果
这部分代码执行图像上传处理,从img_classification.py文件中的函数运行推理并显示结果。在app.py中的导入下方,添加此行以允许您使用分类函数。
from img_classification import teachable_machine_classification
以下代码将添加到您的app.py文件中。
uploaded_file = st.file_uploader("Choose a brain MRI ...", type="jpg")
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded MRI.', use_column_width=True)
st.write("")
st.write("Classifying...")
label = teachable_machine_classification(image, 'brain_tumor_classification.h5')
if label == 0:
st.write("The MRI scan has a brain tumor")
else:
st.write("The MRI scan is healthy")
要在本地主机上运行应用程序,请打开终端或 shell,导航到当前工作目录,然后运行命令
streamlit 运行应用程序.py
该应用程序将在本地运行,并通过 URL https://localhost:8501访问
Heroku 帐户设置
此时,您的应用已设置完毕并在本地运行。是时候分享它了。注册一个Heroku帐户,以便将出色的分类器部署到 Web。注册后,下载Heroku CLI。
部署解决方案
生成一个requirements.txt文件,其中包含所使用的库及其版本。您可以使用pipreqs命令。该文件应如下所示:
numpy==1.16.4
streamlit==0.52.1
pillow
keras
tensorflow==2.0.0b1
创建一个setup.sh文件和一个procfile文件。这些文件将指示 Heroku 如何设置应用程序并使其运行。在setup.sh文件中,写入以下代码,这将创建一个 streamlit 文件夹,其中包含 credentials.toml 和 config.toml 文件。
mkdir -p ~/.streamlit/
echo "\
[general]\n\
email = \"your@domain.com\"\n\
" > ~/.streamlit/credentials.toml
echo "\
[server]\n\
headless = true\n\
enableCORS=false\n\
port = $PORT\n\
" > ~/.streamlit/config.toml
接下来,procfile将是执行 setup.sh的那个。然后运行 Streamlit app.py文件 procfile 代码:
web: sh setup.sh && streamlit run app.py
使用命令git init启动一个空的 Git 存储库。
在终端中,导航到代码的工作目录,然后使用 CLI 命令heroku login登录 Heroku 。要部署,请运行命令heroku create。完成此命令后,Heroku 将为您的应用分配一个应用名称和 URL,以便您通过 Web 访问它。
最后,使用下面的 Git 命令将您的代码推送到您的 Heroku 实例。
git add .
git commit -m "commit message"
git push heroku master
要检查部署是否成功,请运行命令heroku ps scale:web=1。
结论
您现在已经学会了使用 Streamlit 构建界面和使用 Heroku 在 Web 上为应用程序提供服务,从而在 Web 上部署机器学习解决方案。这些技能对于现实世界的角色至关重要,例如 ML 工程师、ML devops、对 ML 感兴趣的软件工程师以及想要分享其工作的自由职业 ML 爱好者。要更深入地了解 Heroku,请考虑本教程。
您还可以通过研究基于云的 ML 部署解决方案(例如 Amazon AWS、Microsoft Azure、GCP 和 FloydHub)进一步巩固本指南中的技能。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~