网站部署程序-如何在三天内构建和部署机器学习 Web 应用程序 - Durian Classification

在本文中,我将引导您构建一个 Web 应用程序来对香蕉进行分类。 您可以在这里查看相关信息()。

如果你不知道香蕉是什么,让我向你解释一下。

它是一种玉石般的、气味扑鼻的(如右图)、外观耀眼的香蕉(在美国我们称之为蔬菜之王),这意味着难闻的气味让人要么厌恶它,要么非常喜欢它(显然,我是前者)。 如果你觉得它闻起来很香,它的味道可能会更好。

问题陈述

是的,这个项目的动力始于我对香蕉的热爱。 您一定想知道,我们到底在分类什么?

您会注意到香蕉有很多种,具有不同的气味、质地和颜色。 在这个项目中,我们将对四种不同类型的香蕉进行分类,即:

下表总结了这种香蕉的不同之处:

香蕉有很多品种,但我认为这种香蕉的细微差别可能会让我们的模型无法学习。

数据采集

每个项目都从数据收集开始。 由于我们将部署的模型用于个人和教育目的网站部署程序,因此我们将从 Google 获取图像。 如果您将图像用于其他目的,请检查版权。

我们将使用这个 API() 来获取图像。

只需按照存储库上的说明安装该软件包即可。 在说明的第 3 步中,我们将为特定用例运行此命令(将路径替换为 chromedriver):

python3 bing_scraper.py --url 'https://www.bing.com/images/search?q=mao+shan+wang' --limit 100 --download --chromedriver

在这里,我们将下载图像的数量限制为 100,因为具体的“茅山王”图像并不多。 我们重复上述步骤3次,寻找其他品种的香蕉。 请注意,由于我们更改了 API 中的搜索 URL,因此查询中的空格将替换为“+”(即 mao+fú+wang、red+prawn+durian 等)。

事实上,您可以对任何要分类的图像执行此步骤。

数据清理

在我们的用例中,由于没有香蕉的公共图像,因此下载的许多图像可能与正确的香蕉品种不匹配(例如,搜索“maofúwang”可能会找到通用的“未标记”榴莲)。

为此,我需要自动检测所有下载的图像以确保图像的质量网站部署程序,尽管拥有高质量(即正确标记)的数据比大量数据更好,对吧?

此步骤确实需要一些领域知识,并且可能需要一些时间。 (然而,数据清理是机器学习流程中的基本步骤,反映了数据科学家和人工智能工程师的现实。)

删除数据后,还剩下55张D24、39张金凤凰、59张茅山王和68张大闸蟹图像。

训练香蕉分类器

我选择使用TensorFlow框架,相信大多数从业者都已经熟悉了(其实Pytorch也可以随便用)。 由于我们的图像很少,我们肯定必须使用预先训练的模型并在我们的数据集上对其进行微调。

首先,确保您具有以下文件夹结构,这是稍后使用 flow_from_directory 所必需的。

train|-- d24|-- golden-phoenix|-- mao-shan-wang|-- red-prawnvalid|-- d24|-- golden-phoenix|-- mao-shan-wang|-- red-prawn

让我们开始构建分类器!

# Import relevant libraries we will be usingimport numpy as np
from tensorflow.keras.initializers import glorot_uniformfrom tensorflow.keras.regularizers import l2from tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.keras.applications import Xceptionfrom tensorflow.keras.layers import ( Flatten, Dense, AveragePooling2D, Dropout)from tensorflow.keras.optimizers import SGDfrom tensorflow.keras.preprocessing import imagefrom tensorflow.keras import Modelfrom tensorflow.keras.preprocessing.image import img_to_arrayfrom tensorflow.keras.callbacks import ( EarlyStopping, ModelCheckpoint, LearningRateScheduler)

如上所示,我们将使用的基本模型是 Xception,让我们实例化它并添加一些完全连接的层。 由于我们有很多图像,因此我们将使用较小的批量大小 8。我们还需要小心过度拟合我们的大数据集。

SHAPE = 224BATCH_SIZE = 8
model = Xception( input_shape=(SHAPE, SHAPE, 3), include_top=False, weights='imagenet')
x = model.outputx = AveragePooling2D(pool_size=(2, 2))(x)x = Dense(32, activation='relu')(x)x = Dropout(0.1)(x)x = Flatten()(x)x = Dense(4, activation='softmax', kernel_regularizer=l2(.0005))(x)
model = Model(inputs=model.inputs, outputs=x)
opt = SGD(lr=0.0001, momentum=.9)model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

之后,让我们使用 TensorFlow 的 ImageDataGenerator 及其 flow_from_directory 创建一个图像生成器对象。 由于我们没有足够的训练图像,因此图像改进比以往任何时候都更加重要。

train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=15, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True)
valid_datagen = ImageDataGenerator( rescale=1./255, rotation_range=0, width_shift_range=0.0, height_shift_range=0.0, horizontal_flip=False)
train_generator = train_datagen.flow_from_directory( 'train/', target_size=(SHAPE, SHAPE), shuffle=True, batch_size=BATCH_SIZE, class_mode='categorical',)
valid_generator = valid_datagen.flow_from_directory( 'valid/', target_size=(SHAPE, SHAPE), shuffle=True, batch_size=BATCH_SIZE, class_mode='categorical',)
>>> Found 178 images belonging to 4 classes.>>> Found 42 images belonging to 4 classes.

让我们在我们的模型 .fit() 之前定义一些反弹函数。

earlystop = EarlyStopping(monitor='val_loss', patience=4, verbose=1)
checkpoint = ModelCheckpoint( "model-weights/xception_checkpoint.h5", monitor="val_loss", mode="min", save_best_only=True, verbose=1)

我们的模型终于开始训练了!

history = model.fit_generator( train_generator, epochs=30, callbacks=[earlystop, checkpoint], validation_data=valid_generator)
# Save our model for inferencemodel.save("model-weights/xception.h5")

不幸的是,由于我们拥有的图像数量有限,我们的模型在验证集上没有达到特别好的准确性。 不过,模型微调不是本文的重点,因此我们不会对其进行过多讨论。

选择我们的网络框架

在这个项目中,我选择使用streamlit(),因为它允许机器学习应用程序的超快速可视化,但可以轻松地用Python编写。 一旦构建完成,剩下要做的就是部署它。

首先,导出所需的库并指定模型权重的路径。 另外,由于我们使用了 flow_from_directory,TensorFlow 按字母顺序分配类编号。 为此,D24 将是 0 级,依此类推。

import numpy as np
from PIL import Imagefrom tensorflow.keras.models import load_modelfrom tensorflow.keras.preprocessing.image import img_to_arrayfrom tensorflow.keras.preprocessing import imageimport streamlit as st
PATH = "model-weights/"WEIGHTS = "xception.h5"CLASS_DICT = { 0: 'D24', 1: 'JIN FENG', 2: 'MAO SHAN WANG', 3: 'RED PRAWN'}

接下来,我们创建一个函数将上传的图像转换为模型将使用的格式。 我们使用PIL中的Image类,因为上传的图像是BytesIO格式。

def load_img(input_image, shape): img = Image.open(input_image).convert('RGB') img = img.resize((shape, shape)) img = image.img_to_array(img) return np.reshape(img, [1, shape, shape, 3])/255

Streamlit的工作方式是,每次修改用户指定的参数时,脚本都会从上到下重新运行(因此它是一个交互式UI),因此它提供了st.cache形式的缓存装饰器来缓存加载的对象。

缓存通常用于数据加载步骤或任何需要长时间评估/处理的步骤。 请记住,我们使用allow_output_variation=True参数,因为默认情况下这是False,如果输出对象发生任何变化,应用程序将被重新加载。

在我们的例子中,模型对象在每次预测中都会发生变化,因此我们将allow_output_variation参数设置为True。 我们想要缓存模型的原因是因为我们不想每次用户选择不同的图像时都加载它(即只加载模型一次)。

@st.cache(allow_output_mutation=True)def load_own_model(weights): return load_model(weights)

最后,我们只需要在 UI 中添加一些代码:

if __name__ == "__main__": result = st.empty() uploaded_img = st.file_uploader(label='upload your image:') if uploaded_img: st.image(uploaded_img, caption="your sexy durian pic", width=350) result.info("please wait for your results") model = load_own_model(PATH + WEIGHTS) pred_img = load_img(uploaded_img, 224) pred = CLASS_DICT[np.argmax(model.predict(pred_img))] result.success("The breed of durian is " + pred)

我们用 Python 创建的 Web 应用程序不需要很多行代码。 您可以通过在命令行输入以下命令来确保它(假设它将称为应用程序副本)可以在本地运行:

streamlit run app.py

将我们的模型部署到 Heroku

就个人而言,部署不是我最喜欢的部分,如果 Web 应用程序不在 Web 上,那么它还有什么意义呢? 让我们开始吧。

您可以通过多种方法为您的 Web 应用程序提供服务,并且您可以使用许多云服务提供商来托管它。 在这些情况下,我选择使用 Heroku 主要是因为我之前没有尝试过。

哪些是 Heroku?

Heroku 是一个云平台即服务(PaaS),支持多种编程语言,允许开发人员完全在云端构建、运行和操作应用程序。 下面这篇文章解释的非常清楚。

部署在 Heroku 上

为了部署应用程序,我们总是需要某种版本控制来确保我们的应用程序运行在不同的服务器上而不是本地计算机上。 因此,许多人使用 Docker 容器,指定所需的可运行应用程序和包。

使用 Heroku 进行部署类似于同时使用 Docker 容器和 Web 托管服务,它使用 Git 作为部署应用程序的主要手段。 我们没有将所有必需的文件打包到 Docker 容器中,而是创建一个用于版本控制的 git 存储库,之后我们可以使用熟悉的 gitpush 并使用 heroku 远程。

Heroku 随后以 dynos 的形式使用了相同的容器技术。 每个应用程序都放置在测功机(或容器)中,并且每个应用程序消耗“测功小时”。

每个 Heroku 帐户都有一定数量的可用空闲时间,消耗的小时数取决于应用程序的活动/流量。 如果您的应用程序不需要大量流量,那么免费套餐就足够了。

还值得注意的是,当Heroku收到应用程序源时,它会启动应用程序的创建(例如在requirements.txt中创建必要的资产等),并将其组装成slug。

术语解释:slug 是一组源代码、获取的依赖项、语言运行时和已编译的系统输出(准备执行)。

要在 Heroku 上部署,我们需要以下文件:

(1)setup.sh

mkdir -p ~/.streamlit/
echo "[server]nheadless = truenport = $PORTnenableCORS = falsenn" > ~/.streamlit/config.toml

(2)程序文件

web: sh setup.sh && streamlit run app.py

(3)需求.txt

numpy==1.18.1spacy==2.2.4pandas==1.0.1Pillow==7.1.2streamlit==0.61.0tensorflow-cpu==2.2.0

我们的文件夹目录应该如下所示:

app.pyProcfileREADME.mdrequirements.txtsetup.shmodel-weights|-- xception.h5

如果您从未创建过 Github 存储库,请按照以下简单步骤操作:

创建一个新的存储库

复制白框中的网址

在终端上,运行以下命令:

# Clone the repository into our local machinegit clone
# Enter the directory we just clonedcd

将之前创建的文件复制到此文件夹中,并在终端中运行以下命令:

# Add all the files we just copied over to be committedgit add .
# Commit the files, along with a commit messagegit commit -m "deploy app"
# Push to master branch on our github repogit push origin master

我们快到了! 这是最后一步。

(1)创建Heroku账户并验证

(2)在这里安装HerokuCLI()

(3) 通过终端登录您的 Heroku 帐户。 将打开一个浏览器窗口供您进行身份验证。

heroku login

(4) 创建Heroku应用程序

heroku create

完成此步骤后,您将能够在终端中看到指向您的项目的链接。

(5) 将gitrepo推送到Heroku遥控器。 在我们的 github 存储库的同一目录中,运行以下命令:

git push heroku master

我们完成了! 创建完成后,您应该可以在上一个链接中看到已部署的应用程序!

参考链接:

☆完☆

如果您听到这句话,就说明您喜欢这篇文章,请转发点赞。 在陌陌上搜索“uncle_pn”。 欢迎添加陌陌的编辑“mthler”。 每天都会在同学圈更新一篇优质博文。

↓扫描二维码添加编辑器↓

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 网站程序 网站部署程序-如何在三天内构建和部署机器学习 Web 应用程序 - Durian Classification https://www.wkzy.net/game/199248.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务