yolo v8 + flask部署到云服务器,以及问题记录

环境安装

1、运行项目报错:no python application found, check your startup logs for errors

在云服务器pytorch版本安装错了,安装了GPU版本,需要安装CPU版本

bash 复制代码
# CPU only 使用下面这段代码避免出现第二个错误
pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cpu

2、运行项目报错:RuntimeError: operator torchvision::nms does not exist

检查发现pytorch中torchvision版本不匹配:

卸载重装对应匹配版本:

bash 复制代码
# CPU only
pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cpu

3、后端python文件编写,涉及到读写文件、模型预测、以及获取结果分析,转换yolo预测结果为指定的json格式数据。

python 复制代码
import os
import numpy as np
import torch.hub
#导入Yolov8,需要提前安装ultralytics库
from ultralytics import YOLO
from flask import Flask
#运用Python的flask类实现与前台信息的交互
from flask import request
from flask import send_file
import base64
import cv2
import time
import json
from pathlib import Path

app = Flask(__name__)
# 调用训练好的模型
model = YOLO('./best.pt')
@app.route('/', methods=['GET', 'POST'])
def uploads():
    # 拿到变量img对应的图片
    img = request.files.get('img')
    if img:
        # 重命名
        name = 'img.jpg'
        # 保存
        img.save(os.path.join('./img', name))
        fileName = "./img/"+name
        # results = model.predict('./img/img.jpg',save=True)#调用模型进行判断 save_txt=True
        results = model.predict(fileName,save=True,save_txt=True)
        # 类名字典
        names = results[0].names
        listData = []
        for key in names:
            # print(key, names[key])
            data = {'name': names[key],"value": 0}
            listData.append(data)
        # 读取数据分析内容
        # print(listData)
        content = getContent(results,listData)
        # print(content)
        # 5. 返回结果
        data = {
            "errCode":0,
            "msg":"success",
            "data":content,
            "img":results[0].path
        }
        return json.dumps(data)

    else:
        data = {"errCode":1,"msg":"cannot find file!"}
        return json.dumps(data)

# 获取结果文本内容
def getContent(results,listData):
    # 获取文件保存的路径
    save_path = Path(results[0].save_dir)
    content = []
    # 获取label标签文件
    for r in results:
        im_name = Path(r.path).stem
        labels = save_path / f"labels/{im_name}.txt"
    # 读取标签文件中的内容
    txt_file = labels
    with open(txt_file, 'r') as file:
        # content = file.read()
        lines = file.readlines()
        print(lines)
    for line in lines:
        index = int(line.split()[0])
        print("每行---", index)
        if index<len(listData) and listData[index]:
            # print(listData[index]["name"],listData[index]["value"])
            listData[index]["value"] +=1
        
    # 返回结果
    return listData
if __name__ == '__main__':
    app.run()

前端接收到返回数据:

4、flask上传的图片文件无法访问的问题

根据上述返回数据中,预测目标后的结果图片地址:https://***.com/runs/detect/predict/***.jpg,这个路径无法被访问,需要单独配置:

python 复制代码
# 配置路径访问
from flask import send_from_directory

# .....

# 文件访问 runs/detect/predict*/
@app.route('/runs/<path:path>')
def send_image(path):
    # print(path,'------path')
    # print(send_from_directory('runs/', path))
    return send_from_directory('runs/', path)
python 复制代码
import os
import numpy as np
import torch.hub
#导入Yolov8,需要提前安装ultralytics库
from ultralytics import YOLO
from flask import Flask
#运用Python的flask类实现与前台信息的交互
from flask import request
from flask import send_file
import base64
import cv2
import time
import json
from pathlib import Path
# 配置路径访问
from flask import send_from_directory

app = Flask(__name__)
# 验证请求
verifyCode = "89jjkdsw909324jjkjds9f8sdf"

# 文件访问 runs/detect/predict*/
@app.route('/runs/<path:path>')
def send_image(path):
    # print(path,'------path')
    # print(send_from_directory('runs/', path))
    return send_from_directory('runs/', path)

# 调用训练好的模型
model = YOLO('./best.pt')
@app.route('/', methods=['GET', 'POST'])
def uploads():
    # 获取前端上传code,判断是否合法请求
    postData = request.form if request.form else request.json
    # print(postData.get("code"))
    verifyRes = verify(postData.get("code"))
    # 是否非法请求
    if verifyRes == False:
        data = {"errCode":1, "msg": "illegal request!"}
        return json.dumps(data)
        
    # 拿到变量img对应的图片
    img = request.files.get('img')
    if img:
        # 重命名
        name = str(time.time())+'.jpg'
        # 保存
        img.save(os.path.join('./img', name))
        fileName = "./img/"+name
        # results = model.predict('./img/img.jpg',save=True)#调用模型进行判断 save_txt=True
        results = model.predict(fileName,save=True,save_txt=True)
        # 类名字典
        names = results[0].names
        listData = []
        for key in names:
            # print(key, names[key])
            data = {'name': names[key],"value": 0}
            listData.append(data)
        # 读取数据分析内容
        # print(listData)
        content = getContent(results,listData)
        # print(content)
        # 5. 返回结果
        data = {
            "errCode": 0,
            "msg": "success",
            "data": content,
            "img": results[0].save_dir+"/"+name
        }
        return json.dumps(data)

    else:
        data = {"errCode":1,"msg":"cannot find file!"}
        return json.dumps(data)

# 验证code合法性
def verify(code):
    return code == verifyCode

# 获取结果文本内容
def getContent(results,listData):
    # 获取文件保存的路径
    save_path = Path(results[0].save_dir)
    content = []
    # 获取label标签文件
    for r in results:
        im_name = Path(r.path).stem
        labels = save_path / f"labels/{im_name}.txt"
    # 读取标签文件中的内容
    txt_file = labels
    with open(txt_file, 'r') as file:
        # content = file.read()
        lines = file.readlines()
        # print(lines)
    for line in lines:
        index = int(line.split()[0])
        # print("每行---", index)
        if index<len(listData) and listData[index]:
            # print(listData[index]["name"],listData[index]["value"])
            listData[index]["value"] +=1
        
    # 返回结果
    return listData
if __name__ == '__main__':
    app.run()

参考文档:预测 -Ultralytics YOLO 文档

相关推荐
用户83562907805116 分钟前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_17 分钟前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
CoovallyAIHub3 小时前
开源的消逝与新生:从 TensorFlow 的落幕到开源生态的蜕变
pytorch·深度学习·llm
数据智能老司机7 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机8 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机8 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机8 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i8 小时前
drf初步梳理
python·django
每日AI新事件8 小时前
python的异步函数
python
这里有鱼汤9 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python