# 部署深度學習模型:Flask API 服務端與客戶端通信實戰

部署深度學習模型:Flask API 服務端與客戶端通信實戰

在這篇文章中,我們將探討如何使用 Flask 框架部署一個深度學習模型,并通過客戶端與服務端進行通信。我們將通過一個實際的例子,展示如何構建服務端和客戶端,以及如何處理圖像預測請求。
在這里插入圖片描述

環境準備

首先,確保你已經安裝了以下庫:

  • Flask
  • PyTorch
  • torchvision
  • Pillow

如果尚未安裝,可以通過以下命令安裝:

pip install flask torch torchvision pillow

服務端代碼

服務端代碼的主要功能是加載預訓練的深度學習模型,接收客戶端發送的圖像數據,進行預測,并將結果返回給客戶端。

# 導入所需的庫
import io  # 用于處理二進制數據
import flask  # Flask框架,用于搭建Web服務
import torch  # PyTorch庫,用于深度學習模型的加載和推理
import torch.nn.functional as F  # PyTorch的神經網絡函數模塊,用于softmax等操作
from PIL import Image  # Python圖像處理庫,用于圖像的讀取和預處理
from torch import nn  # PyTorch的神經網絡模塊
from torchvision import transforms, models  # torchvision庫,用于圖像預處理和加載預訓練模型# 初始化Flask app
app = flask.Flask(__name__)  # 創建一個新的Flask應用程序實例
# __name__參數通常被傳遞給Flask應用程序來定位應用程序的根路徑,這樣Flask就可以知道在哪里找到模板、靜態文件等。
# 總體來說app = flask.Flask(__name__)是FLasK應用程序的起點。它初始化了一個新的FLasK應用程序實例。
model = None  # 初始化模型變量為None
use_gpu = False  # 初始化是否使用GPU的標志為False# 定義加載模型的函數
def load_model():# """Load the pre-trained model, you can use your model just as easily."""global model  # 聲明使用全局變量model# 加載resnet18網絡model = models.resnet18()  # 加載預訓練的resnet18模型num_ftrs = model.fc.in_features  # 獲取全連接層的輸入特征數量model.fc = nn.Sequential(nn.Linear(num_ftrs, 102))  # 修改全連接層,輸出為102個類別(根據具體任務修改類別數)# print(model)checkpoint = torch.load('best.pth')  # 加載訓練好的模型權重model.load_state_dict(checkpoint['state_dict'])  # 將權重加載到模型中# 將模型指定為測試格式model.eval()  # 將模型設置為評估模式# 是否使用gpuif use_gpu:model.cuda()  # 如果使用GPU,則將模型移動到GPU上# 定義數據預處理函數
def prepare_image(image, target_size):"""Do image preprocessing before prediction on any data.param image    :     original imageparam target_size     :     target image sizereturn     :     preprocessed image"""# 針對不同模型,image的格式不同,但需要統一到RGB格式if image.mode != 'RGB':image = image.convert('RGB')  # 如果圖像不是RGB格式,則轉換為RGB格式# Resize the input image and preprocess it.(按照所使用的模型將輸入圖片的尺寸修改)image = transforms.Resize(target_size)(image)  # 調整圖像大小為目標尺寸image = transforms.ToTensor()(image)  # 將圖像轉換為Tensor# Convert to Torch. Tensor and normalize. mean與stdimage = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image)  # 對圖像進行標準化處理# Add batch size axis 增加一個維度,用于按batch測試image = image[None]  # 增加一個維度if use_gpu:image = image.cuda()  # 如果使用GPU,則將圖像移動到GPU上return torch.tensor(image)  # 返回預處理后的圖像Tensor# 定義一個裝飾器,用于將指定的URL路徑與一個函數關聯起來,并指定該函數響應的HTTP方法
@app.route('/predict', methods=['POST'])
def predict():  # 當客戶端發送請求時# 做一個標志,剛開始無圖像傳入時為false,傳入圖像時為truedata = {'success': False}  # 初始化返回數據字典,初始值為Falseif flask.request.method == 'POST':  # 如果收到POST請求if flask.request.files.get('image'):  # 判斷是否有圖像文件image = flask.request.files['image'].read()  # 將收到的圖像進行讀取,內容為二進制image = Image.open(io.BytesIO(image))  # 將二進制圖像數據轉換為PIL圖像對象# 利用上面的預處理函數將讀入的圖像進行預處理image = prepare_image(image, target_size=(224, 224))  # 對圖像進行預處理,目標尺寸為224x224preds = F.softmax(model(image), dim=1)  # 得到各個類別的概率results = torch.topk(preds.cpu().data, k=3, dim=1)  # 概率最大的前3個結果# torch.topk用于返回輸入張量中每行最大的k個元素及其對應的索引results = (results[0].cpu().numpy(), results[1].cpu().numpy())  # 將結果轉換為numpy數組# 將data字典增加一個key,value,其中value為list格式data['prediction'] = list()  # 初始化預測結果列表for prob, label in zip(results[0][0], results[1][0]):  # 遍歷概率和標簽# Label name = idx2labellstr(label)]r = {'label': str(label), 'probability': float(prob)}  # 創建一個字典,包含標簽和概率# 將預測結果添加至data字典data['prediction'].append(r)  # 將預測結果添加到列表中# Indicate that the request was a success.data['success'] = True  # 將請求成功的標志設置為Truereturn flask.jsonify(data)  # 返回預測結果的JSON格式數據# 主程序入口
if __name__ == '__main__':  # 判斷是否是主程序運行print('Loading PyTorch model and Flask starting server ...')  # 打印加載模型和啟動服務器的信息print('Please wait until server has fully started')  # 提示用戶等待服務器啟動完成load_model()  # 先加載模型# 再開啟服務app.run(port='5012')  # 啟動Flask應用,監聽5012端口

客戶端代碼

客戶端代碼負責發送圖像數據到服務端,并接收預測結果。

import requests  # 導入requests庫,用于發送HTTP請求# 定義Flask服務的URL地址
flask_url = 'http://127.0.0.1:5012/predict'  # Flask服務的地址,運行在本地主機的5012端口# 定義一個函數,用于發送圖像到Flask服務并獲取預測結果
def predict_result(image_path):# 打開圖像文件并讀取其內容image = open(image_path, 'rb').read()  # 以二進制模式打開圖像文件并讀取內容payload = {'image': image}  # 將圖像內容封裝為一個字典,作為請求的文件數據# 使用requests庫發送POST請求到Flask服務r = requests.post(flask_url, files=payload).json()  # 發送POST請求,并將返回的JSON數據解析為字典# 檢查請求是否成功if r['success']:# 如果請求成功,遍歷預測結果并打印for (i, result) in enumerate(r['prediction']):print('{}. 預測類別為{}的概率:{}'.format(i + 1, result['label'], result['probability']))else:# 如果請求失敗,打印失敗信息print('request failed')# 主程序入口
if __name__ == '__main__':# 定義要預測的圖像路徑image_path = r'D:\Users\妄生\PycharmProjects\人工智能\深度學習\模型部署\flower_data\flower_data\val_filelist\image_00059.jpg'# 調用predict_result函數,對指定圖像進行預測predict_result(image_path)

運行與測試

  1. 啟動服務端:
    在這里插入圖片描述

  2. 啟動客戶端:
    在這里插入圖片描述

網絡問題處理

如果在運行過程中遇到網絡問題,例如無法訪問 http://127.0.0.1:5012/predict,這可能是由于以下原因:

  • 服務端未正確啟動或端口被占用。
  • 本地網絡配置問題。

解決方法:

  • 確保服務端正確啟動,并監聽在正確的端口上。
  • 檢查防火墻或安全軟件設置,確保沒有阻止訪問該端口。
  • 嘗試重新啟動服務端或計算機。

總結

通過這篇文章,我們展示了如何使用 Flask 部署一個深度學習模型,并通過客戶端與服務端進行通信。我們詳細解釋了服務端和客戶端的代碼,并提供了運行和測試的步驟。希望這能幫助你理解如何將深度學習模型部署為 Web 服務,并處理可能遇到的網絡問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79052.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

物理服務器緊急救援:CentOS系統密碼重置全流程實戰指南

前言 在企業IT運維實踐中,物理服務器密碼丟失是典型的"低概率高風險"事件。某金融科技公司曾因核心服務器密碼遺失導致業務中斷36小時,直接損失超過800萬元。這起真實案例揭示了系統密碼管理的關鍵性——當承載重要業務的物理服務器遭遇密碼丟…

【學習心得】好用算力平臺推薦OpenBayes“貝式計算”

好用是有定義的,我之前用過AutoDL和DAMODEL(丹摩智算),我這里就不扯哪些我覺得不關鍵的因素。先不廢話直接給出導航鏈接以及CSDN上的官方主頁: OpenBayes官方網站https://openbayes.com/ OpenBayes官方CSDN賬號主頁h…

政務瀏覽器 一站式首頁功能配置說明

一、政務瀏覽器自定義首頁目的和意義 政務綜合窗口,通常需要打開諸多的業務系統進行受理和查詢;反復的錄入系統地址或者在收藏夾查找系統入口,影響辦事效率。政務瀏覽器為該場景設計了一款可定制的“首頁”。 “首頁”可以根據需要&#xff0…

linux nginx配置訪問目錄,訪問文件直接下載,linux配置nginx直鏈下載

很簡單的一個配置,不指定為啥,別人寫的都好麻煩,而且很多配置了也不行,明明就是幾句話的事啊,唉。 話不多說,直接上配置 worker_processes 1; events {worker_connections 1024; } http {include …

驅動開發硬核特訓 · Day 28(上篇):pinctrl 子系統詳解與實戰分析

📚 技術平臺:嵌入式Jerry(B站) 一、引言 在嵌入式系統中,SoC 芯片的引腳通常具有多種功能,如 GPIO、UART、I2C、SPI 等。為了在不同的應用場景中靈活配置引腳功能,Linux 內核引入了 pinctrl&am…

圖漾相機——Sample_V2示例程序(待補充)

文章目錄 1.SDK支持的平臺類型1.1 Windows 平臺1.2 Linux平臺 2.Sample_V2編譯流程2.1 Windows環境2.2 Linux環境編譯 3.Sample_V2示例程序測試3.1 ListDevice_v23.2 DepthStream_v23.3 ExposureTimeSetting_v23.4 ForceDeviceIP_v23.5 GetCalibData_v23.6 NetStatistic_v23.7 …

Google-chrome版本升級后sogou輸入法不工作了

背景: 筆記本Thinkpad E450,操作系統Ubuntu 24.04.2 LTS,Chrome瀏覽器版本135.0.7049.114-1,Edge瀏覽器版本131.0.2903.99-1,輸入法Sogou版本4.2.1.145 現象: - **正常場景**:Edge中可通過Ctrl…

7系列 之 OSERDESE2

背景 《ug471_7Series_SelectIO.pdf》介紹了Xilinx 7 系列 SelectIO 的輸入/輸出特性及邏輯資源的相關內容。 第 1 章《SelectIO Resources》介紹了輸出驅動器和輸入接收器的電氣特性,并通過大量實例解析了各類標準接口的實現。 第 2 章《SelectIO Logic Resource…

Ansible 流程控制

條件語句(判斷) 當滿足什么條件時,就執行那些tasks when 當...時ansible獲取主機名 # 主機名中,不包含.沒有區別 ansible_hostname # 包含.只顯示第一個.前面的名字 ansible_fqdn # 包含.顯示完整的主機名不管是shell還是各大編程語言中&#xf…

git命令積累(個人學習)

如何將docx文件不上傳? 創建或編輯 .gitignore 文件 打開 .gitignore 文件,添加以下內容來忽略所有 .docx 文件: *.docx清除已追蹤的 .docx 文件 git rm --cached "*.docx"這將從 Git 倉庫中刪除 .docx 文件,但不會刪…

springboot應用大批量導出excel產生oom處理措施實踐(適用于poieasyexcel)

一、背景: 在某些信息管理場景中,存在大批量導出需求,例如一次性導出10~100w行excel數據,如果不做特殊的處理,很容易導致Out Of Memory,特別是堆內存溢出。 oom復現 例如修改IDEA運行配置,VM…

谷歌在即將舉行的I/O大會之前,意外泄露了其全新設計語言“Material 3 Expressive”的細節

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

深入理解負載均衡:傳輸層與應用層的原理與實戰

目錄 前言1. 傳輸層(Layer 4)負載均衡1.1 工作層級與核心機制1.2 實現方式詳解1.3 優缺點分析1.4 典型實現工具 2. 應用層(Layer 7)負載均衡2.1 工作層級與核心機制2.2 實現方式解析2.3 優缺點分析2.4 常用實現工具 3. Layer 4 與…

PyTorch 版本、torchvision 版本和 Python 版本的對應關系

PyTorch 版本、torchvision 版本和 Python 版本的對應關系 在深度學習領域,PyTorch 及其配套庫 torchvision 的使用極為廣泛。但不同版本的 PyTorch、torchvision 與 Python 之間存在嚴格的對應關系,若版本搭配不當,會導致代碼運行出錯…

【hadoop】Hbase java api 案例

代碼實現: HBaseConnection.java package com.peizheng.bigdata;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client…

榮耀A8互動娛樂組件部署實錄(第3部分:控制端結構與房間通信協議)

作者:曾在 WebSocket 超時里泡了七天七夜的苦命人 一、控制端總體架構概述 榮耀A8控制端主要承擔的是“運營支點”功能,也就是開發與運營之間的橋梁。它既不直接參與玩家行為,又控制著玩家的行為邏輯和游戲規則觸發機制。控制端的主要職責包…

Vue3路由模式為history,使用nginx部署上線后刷新404的問題

一、問題 在使用nginx部署vue3的項目后,發現正常時可以訪問的,但是一旦刷新,就是出現404的情況 二、解決方法 1.vite.config.js配置 在vite.config.js中加入以下配置 export default defineConfig(({ mode }) > {const isProduction …

企業級UI測試的“雙保險”:TestComplete的智能對象識別與詳細報告功能

企業級UI測試真是讓人頭疼!界面元素變來變去,測試腳本動不動就報錯,測試工作根本沒法順利推進。而且,測試結果的管理和共享也麻煩得很,團隊協作效率大打折扣。別急!TestComplete的智能對象識別和詳細測試報…

SpringBoot的自動配置和起步依賴原理

關于Spring Boot的自動配置和起步依賴,我想結合最新的實現機制來展開說明。先說自動配置——這是Spring Boot最核心的"約定優于配置"思想的落地體現。舉個例子,當我們創建一個新的Spring Boot項目時,只要在pom.xml里添加了spring-b…

《MATLAB實戰訓練營:從入門到工業級應用》高階挑戰篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB實戰訓練營:從入門到工業級應用》高階挑戰篇-5G通信速成:MATLAB毫米波信道建模仿真指南 🚀📡 大家好!今天我將帶大家進入5G通信的奇妙世界,我們一起探索5G通信中最激動人心的部分之一——毫米波信…