用电信固定IP做网站,网页设计网站多少钱,wordpress安装到阿里云主机,wordpress 标签 取消本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点#xff0c;其次详细阐述了Flask项目的部署流程#xff0c;涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮…本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点其次详细阐述了Flask项目的部署流程涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮助读者掌握Flask项目的部署方法解决在部署过程中可能遇到的问题确保项目能够稳定高效地运行。
一、Flask简介
Flask是一个轻量级的Web应用框架由Python语言编写。它是基于Werkzeug WSGI工具包和Jinja2模板引擎的并且采用BSD许可证。Flask的设计哲学是“微核”也就是说其核心保持简洁功能通过扩展实现。这使得Flask非常灵活能够满足从小型单一页面应用到大型复杂项目的不同需求。
Flask的主要特点包括
轻量级和灵活Flask仅提供核心功能开发者可以根据需要引入各种扩展。易于学习和使用Flask的API设计非常简洁明了即使是初学者也能快速上手。强大的扩展能力Flask的生态系统中有许多可用的扩展可以轻松添加数据库、表单验证、用户认证等功能。社区支持Flask拥有活跃的社区大量的教程和文档可以帮助开发者解决问题。 二、Flask项目部署流程
1. 准备工作
在开始部署Flask项目之前需要完成以下准备工作
① 服务器安装Anaconda
Anaconda是一个用于科学计算的Python发行版支持多种数据科学包的快速安装。它还包含了Conda这是一种包管理器和环境管理器能够轻松创建和管理不同的Python环境。
首先下载并安装Anaconda。可以从Anaconda官网下载适用于Windows的安装包。安装过程非常简单按照提示进行即可。
② Anaconda创建Python环境
安装完成后使用Conda创建一个新的Python环境。这可以帮助你隔离项目的依赖确保环境的一致性。打开终端或命令提示符输入以下命令创建一个名为opencv的环境并指定Python版本
conda create -n opencv python3.8创建完成后激活这个环境
conda activate opencv③ Anaconda环境安装相关包
在激活的环境中安装Flask、Flask-CORS、TensorFlow、scikit-learn和OpenCV等必要的包
conda install flask flask-cors tensorflow scikit-learn opencv这些包包含了构建和运行Flask应用及其依赖的所有工具。
2. 创建Flask应用
在本地编写并测试Flask应用代码。以下是一个简单的Flask应用示例它使用TensorFlow的MobileNetV2模型进行图像分类和相似度计算
from flask import Flask, request, jsonify
from flask_cors import CORS
import numpy as np
import cv2
from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
from sklearn.metrics.pairwise import cosine_similarityapp Flask(__name__)
CORS(app)# 加载预训练的MobileNetV2模型
model MobileNetV2(weightsimagenet, include_topTrue)def classify_image(img):img cv2.resize(img, (224, 224)) # MobileNetV2的输入尺寸为224x224x image.img_to_array(img)x np.expand_dims(x, axis0)x preprocess_input(x)preds model.predict(x)return decode_predictions(preds, top1)[0][0][1], model.predict(x) # 返回类别名称和特征向量def calculate_similarity(feature1, feature2):return cosine_similarity(feature1, feature2)[0][0]app.route(/compare, methods[POST])
def compare_images():file1 request.files[image1]file2 request.files[image2]npimg1 np.frombuffer(file1.read(), np.uint8)npimg2 np.frombuffer(file2.read(), np.uint8)img1 cv2.imdecode(npimg1, cv2.IMREAD_COLOR)img2 cv2.imdecode(npimg2, cv2.IMREAD_COLOR)# 分类和特征提取class1, feature1 classify_image(img1)class2, feature2 classify_image(img2)if class1 ! class2:similarity 0.0risk_level 低intervention 否else:similarity calculate_similarity(feature1, feature2)risk_level 高 if similarity 0.8 else 中 if similarity 0.5 else 低intervention 是 if similarity 0.8 else 否return jsonify({similarity: f{similarity * 100:.2f}%,risk_level: risk_level,intervention: intervention,class1: class1,class2: class2})if __name__ __main__:app.run(debugTrue)在确保代码在本地运行正常。
3、本地运行Flask服务器
在本地Anaconda中启动opencv环境的终端运行以下命令启动Flask服务器
python app.py服务器启动后将会监听在本地的5000端口。
① 页面前端代码实现
创建一个HTML文件(test.html)实现图片上传和结果展示功能全部代码如下
!DOCTYPE html
html langzh-CN
headmeta charsetUTF-8title图片对比/titlestylebody {font-family: Arial, sans-serif;display: flex;flex-direction: column;align-items: center;margin: 0;padding: 20px;}.container {display: flex;justify-content: space-between;width: 80%;margin-bottom: 20px;}.image-box {width: 45%;border: 2px dashed #ccc;padding: 10px;text-align: center;position: relative;}.image-box img {max-width: 100%;max-height: 200px;display: none;}.image-box input {display: none;}.upload-btn {cursor: pointer;color: #007BFF;text-decoration: underline;}.loading-bar {width: 80%;height: 20px;background-color: #f3f3f3;border: 1px solid #ccc;margin-top: 10px;display: none;position: relative;}.loading-bar div {width: 0;height: 100%;background-color: #4caf50;position: absolute;animation: loading 5s linear forwards;}keyframes loading {to {width: 100%;}}.result {display: none;margin-top: 20px;}/style
/head
bodyh1图片对比/h1div classcontainerdiv classimage-box idbox1label forupload1 classupload-btn上传图片/labelinput typefile idupload1 acceptimage/*img idimage1 alt左边文本抓取图片/divdiv classimage-box idbox2label forupload2 classupload-btn上传图片/labelinput typefile idupload2 acceptimage/*img idimage2 alt右边文本数据库图片/div/divbutton idcompare-btn人工智能对比/buttondiv classloading-bar idloading-bardiv/div/divdiv classresult idresultp相似百分比: span idsimilarity0%/span/pp相似度: span idrisk-level低/span/pp相同个体推测: span idintervention否/span/pp图1种类: span idclass1-/span/pp图2种类: span idclass2-/span/p/divscriptdocument.getElementById(upload1).addEventListener(change, function(event) {loadImage(event.target.files[0], image1, box1);});document.getElementById(upload2).addEventListener(change, function(event) {loadImage(event.target.files[0], image2, box2);});function loadImage(file, imgId, boxId) {const reader new FileReader();reader.onload function(e) {const img document.getElementById(imgId);img.src e.target.result;img.style.display block;document.querySelector(#${boxId} .upload-btn).style.display none;}reader.readAsDataURL(file);}document.getElementById(compare-btn).addEventListener(click, function() {const loadingBar document.getElementById(loading-bar);const result document.getElementById(result);const image1 document.getElementById(upload1).files[0];const image2 document.getElementById(upload2).files[0];if (!image1 || !image2) {alert(请上传两张图片进行对比);return;}const formData new FormData();formData.append(image1, image1);formData.append(image2, image2);loadingBar.style.display block;result.style.display none;fetch(http://localhost:5000/compare, {method: POST,body: formData}).then(response response.json()).then(data {loadingBar.style.display none;result.style.display block;document.getElementById(similarity).innerText data.similarity;document.getElementById(risk-level).innerText data.risk_level;document.getElementById(intervention).innerText data.intervention;document.getElementById(class1).innerText data.class1;document.getElementById(class2).innerText data.class2;}).catch(error {loadingBar.style.display none;alert(对比过程中发生错误请重试);console.error(Error:, error);});});/script
/body
/html② 运行网页
双击运行刚刚创建的test.html文件效果如图 上传左右图片比较两只相同品种的狗的相似度
可以看到系统识别出了两只狗的种类相同相似比也高达75.2%但因为没有达到我们设置的80%的阈值所以判断非同一个体。当然这里的80%非常牵强实际操作中难免误差较大。由于本文算法使用的是MobileNetV2预训练模型并没有根据实际应用场景大量训练和调参所以如果投入应用仍需重新训练并根据实际效果定义阈值。
确认本地运行正常接下来就可以进行部署了。
4. 安装Waitress服务器
Waitress是一个Python WSGI服务器适用于在生产环境中部署Flask应用。它简单易用适合部署中小型应用。使用pip安装Waitress
pip install waitress5. 修改代码以使用Waitress
将Flask应用代码保存为 compare.py并确保在本地测试通过。然后创建一个批处理文件 start.cmd内容如下
echo off
python -m waitress --listen*:8000 compare:app
pause确保 compare.py 文件中的Flask应用对象名为 app例如
from flask import Flask, request, jsonify
from flask_cors import CORS
import numpy as np
import cv2
from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
from sklearn.metrics.pairwise import cosine_similarityapp Flask(__name__)
CORS(app)# 加载预训练的MobileNetV2模型
model MobileNetV2(weightsimagenet, include_topTrue)def classify_image(img):img cv2.resize(img, (224, 224)) # MobileNetV2的输入尺寸为224x224x image.img_to_array(img)x np.expand_dims(x, axis0)x preprocess_input(x)preds model.predict(x)return decode_predictions(preds, top1)[0][0][1], model.predict(x) # 返回类别名称和特征向量def calculate_similarity(feature1, feature2):return cosine_similarity(feature1, feature2)[0][0]app.route(/compare, methods[POST])
def compare_images():file1 request.files[image1]file2 request.files[image2]npimg1 np.frombuffer(file1.read(), np.uint8)npimg2 np.frombuffer(file2.read(), np.uint8)img1 cv2.imdecode(npimg1, cv2.IMREAD_COLOR)img2 cv2.imdecode(npimg2, cv2.IMREAD_COLOR)# 分类和特征提取class1, feature1 classify_image(img1)class2, feature2 classify_image(img2)if class1 ! class2:similarity 0.0risk_level 低intervention 否else:similarity calculate_similarity(feature1, feature2)risk_level 高 if similarity 0.8 else 中 if similarity 0.5 else 低intervention 是 if similarity 0.8 else 否return jsonify({similarity: f{similarity * 100:.2f}%,risk_level: risk_level,intervention: intervention,class1: class1,class2: class2})
6. 运行启动
配置WSGI启动
python -m waitress --listen*:5000 compare:app你可以通过访问 http://localhost:5000 来测试你的应用。
然后给5000端口配置安全组/防火墙实现通过公网访问。 三、Flask项目部署总结
本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。从安装和配置Anaconda环境到编写和测试Flask应用再到安装和配置WSGI服务器我们覆盖了部署过程中的每一个步骤。这些步骤帮助确保你的Flask应用能够稳定高效地运行并且在生产环境中易于维护和扩展。
通过遵循这些步骤你可以确保你的Flask应用在各种环境中都能够正常运行避免了在部署过程中可能遇到的许多常见问题。同时这种方式也为你提供了一种标准化的部署流程使得以后部署新的Flask项目变得更加简单和高效。希望本文对你的Flask开发和部署之旅有所帮助。