項目場景:
?因為參加一個比賽,需要把訓(xùn)練好的深度學(xué)習(xí)模型部署到web端,第一次做,在網(wǎng)上也搜索了很多教程,基本上沒有適合自己的,只有一個b站up主講的還不錯https://www.bilibili.com/video/BV1Qv41117SR/?spm_id_from=333.999.0.0&vd_source=6ca6a313467efae52a28428a64104c10https://www.bilibili.com/video/BV1Qv41117SR/?spm_id_from=333.999.0.0&vd_source=6ca6a313467efae52a28428a64104c10在前端的一部分html語言借鑒了這個up主,有興趣的可以去看看。在部署的時候遇到了很多坑,就想記錄一下,僅代表個人看法
項目場景:角膜疾病圖片識別算法(pytorch環(huán)境),用Flask輕量級框架部署到web端并部署到阿里云服務(wù)器進行測試。
流程:
1.寫預(yù)測函數(shù)
1.1將訓(xùn)練好的模型參數(shù)加載到模型中去
checkpoint_path = "/model_best.pth.tar" #訓(xùn)練好的模型參數(shù)(要注意保存模型的時候是保存了模型還是模型參數(shù),這里是模型參數(shù))
model = res50Encoder(attention_map_num, class_num) #加載模型
model.load_state_dict(torch.load(checkpoint_path,map_location='cpu')['state_dict'])#(將參數(shù)加載到模型中去)
model.eval() #pytorch框架會自動把BN和Dropout固定住,直接用訓(xùn)練好的值
1.2 數(shù)據(jù)預(yù)處理模塊
data_transform = transforms.Compose([
transforms.Resize((n, m)),
transforms.CenterCrop(num),
transforms.ToTensor(),
transforms.Normalize(a,b),
]) #根據(jù)自己的模型,寫出數(shù)據(jù)預(yù)處理模塊,n,m,num,a,b按照自己的模型填寫
1.3 加載數(shù)據(jù)(我是圖片的二進制格式)
img = Image.open(io.BytesIO(image_bytes)) #將圖片的二進制文件轉(zhuǎn)化
img = data_transform(img) #數(shù)據(jù)變換
img = img.float().unsqueeze(0) #數(shù)據(jù)調(diào)整維度
?1.4 數(shù)據(jù)標(biāo)簽,根據(jù)自己的模型數(shù)據(jù)集的標(biāo)簽定義
class_labels=['','',''] #自己往''填label
1.5 開始預(yù)測
with torch.no_grad():
attention_maps, _, output1, coarse_logits= model(img.cpu())
refined_input = mask2bbox(attention_maps, img.cpu())
_, _, output2, _= model(refined_input)
output = (output1 + output2) / 2
output = torch.softmax(output, dim=-1)
#根據(jù)output輸出標(biāo)簽值
_, pred = torch.max(output, 1)
pred_label = class_labels[pred.item()]
2. 利用Flask框架部署
直接看代碼吧,這是app.py?
#app.py
from flask import Flask, jsonify, request
from yuce import pred
from flask_cors import CORS
import flask
app = Flask(__name__)
CORS(app) #跨域問題
@app.route('/predict', methods=['POST'])
def predict():
if request.method == 'POST':
file = request.files['file']
print(file)
img_bytes = file.read()
class_name = pred(img_bytes) #預(yù)測函數(shù)pred()(第一個步驟寫的)
if(class_name ):
print("結(jié)果:"+class_name)
else:
print("error")
return jsonify({ 'class_name': class_name})
return jsonify({"your call is GET"}) #將化成標(biāo)簽json格式
@app.route("/",methods = ['POST','GET'])
def root():
return flask.render_template("upload.html") #前端交互界面
if __name__ == '__main__':
app.run(host="0.0.0.0",port=80,debug=True)
3.寫前端交互界面upload.html(借鑒b站up主,前面有提到)?
可自行去up主的GitHub下載https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/deploying_service/deploying_pytorchhttps://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/deploying_service/deploying_pytorch
4.在本地成功跑起來后,可以得到這樣一個界面?
?
?然后就可以自行上傳圖片進行預(yù)測
5.阿里云服務(wù)器部署
5.1首先要準(zhǔn)備一個阿里云服務(wù)器,新人有一個月的優(yōu)惠,但是只能租用cpu,所以如果你的模型是gpu請自行購買gpu服務(wù)器,當(dāng)然你也可以改變你的模型,用cpu跑(因為窮,所以我就把模型改成cpu跑,從第一步的代碼可以看出,當(dāng)然要小心輸入要一致,也要用.cpu)。然后我選擇的是ubuntu系統(tǒng)
5.2準(zhǔn)備好xshell7和xftp7兩個軟件,xshelll7是可以登錄你的ssh,然后用來跑代碼。xftp7是上傳文件,可以從本地把文件傳到服務(wù)器上去。
xshell7登錄:
?
?將自己的ssh填上去,然后用戶身份驗證進行登錄。
?xftp7登錄:和上圖差不多
?
?然后就可以在服務(wù)器上跑代碼,但是要注意安裝相對應(yīng)的庫,需要小心代碼中的路徑問題,當(dāng)服務(wù)器上面成功跑起來,就可以用公網(wǎng)IP訪。(再將公網(wǎng)IP部署到你的域名,就可以訪問網(wǎng)址,注意備案!!,不然會被封號)
問題描述+解決問題
部署過程中遇到很多困難
1.注意安裝jQuery庫,可以去up主的github上直接下載,注意安裝到static庫下面
2.注意你買的服務(wù)器類型,如果是cpu要修改輸入!??!
#(將參數(shù)加載到模型中去)
model.load_state_dict(torch.load(checkpoint_path,map_location='cpu')['state_dict'])
#注意img.cpu()
attention_maps, _, output1, coarse_logits= model(img.cpu())
refined_input = mask2bbox(attention_maps, img.cpu())
?3.部署到服務(wù)器上去可能會遇到無法響應(yīng)的情況,可能是端口沒有開啟,可以去阿里云的網(wǎng)絡(luò)安全組開啟端口,我的端口是80,可以在下圖中自己手動修改!!開啟后,打開要用公網(wǎng)ip?。?!
?
?如果還是無法訪問可以自行查看阿里云的幫助ECS實例的安全組規(guī)則未生效_云服務(wù)器 ECS-阿里云幫助中心文章來源:http://www.zghlxwxcb.cn/news/detail-467747.html
?小結(jié):
第一次自己部署深度模型,經(jīng)驗不足,僅供參考。文章來源地址http://www.zghlxwxcb.cn/news/detail-467747.html
到了這里,關(guān)于深度學(xué)習(xí)模型部署——Flask框架輕量級部署+阿里云服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!