Eric12219180 2024-02-06 12:01 采纳率: 62.2%
浏览 3

想使用YOLOv7、Flask和RESTful API来创建一个物体检测的网页服务。

我需要创建一个基于Python 3.9的物体检测RESTful API推理服务。这包括两部分:一个服务端(server.py)和一个客户端程序(client.py)。客户端程序将1280x720大小的图片发送到服务器进行推理,并将推理结果返回给客户端。关键要求如下:

  1. 使用YOLOv7的预训练权重。
  2. 在没有外网连接的情况下运行,且确保硬件资源使用不异常增加(如内存使用量不会无限增长)。
  3. 使用Flask或FastAPI开发框架,注意处理网络图片传输的格式。
  4. 在本地机器上运行时,使用GPU(RTX 3060)进行图片推理,确保推理速度至少为9 FPS(包括网络响应时间)。

https://github.com/Michael-OvO/Yolov7-Flask
或是上面的git怎麼執行? 我執不了。可以用同個方法嗎?

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-06 12:17
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    首先,感谢您提供了详细的问题描述和要求。让我们一步步来解决您的问题,创建一个基于YOLOv7、Flask和RESTful API的物体检测网页服务。

    步骤1:环境设置

    1. 确保您的Python环境是3.9版本。
    2. 安装所需的依赖项,包括YOLOv7、Flask(或FastAPI)、PyTorch等。

    步骤2:YOLOv7预训练权重

    1. 下载YOLOv7的预训练权重文件(例如yolov7s.pt)。
    2. 将权重文件放到服务器的合适位置。

    步骤3:创建Flask应用

    server.py中创建Flask应用,处理图像推理请求和响应。

    from flask import Flask, request, jsonify
    import torch
    from yolov7.models.experimental import attempt_load
    from yolov7.utils.general import non_max_suppression, scale_coords
    from yolov7.utils.torch_utils import select_device
    import base64
    import cv2
    import numpy as np
    
    app = Flask(__name__)
    
    # Load YOLOv7 model
    weights_path = 'path/to/yolov7s.pt'  # 请替换为实际的权重文件路径
    device = select_device('0' if torch.cuda.is_available() else 'cpu')
    model = attempt_load(weights_path, map_location=device)
    model.eval()
    
    @app.route('/detect', methods=['POST'])
    def detect_objects():
        try:
            # 接收图片数据
            data = request.json['image']
            image_data = base64.b64decode(data)
    
            # 将接收的数据转换成图像
            nparr = np.fromstring(image_data, np.uint8)
            image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    
            # 图像推理
            img = torch.from_numpy(image).to(device)
            img = img.float()
            img /= 255.0
            img = img.unsqueeze(0)
    
            with torch.no_grad():
                results = model(img)
                results = non_max_suppression(results, conf_thres=0.5, iou_thres=0.5)
    
            # 处理推理结果
            if results[0] is not None:
                results[0][:, :4] = scale_coords(img.shape[2:], results[0][:, :4], image.shape).round()
    
            # 返回检测结果
            return jsonify(results[0].tolist())
    
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    步骤4:创建客户端程序

    client.py中创建一个客户端程序来向服务器发送图像并接收检测结果。

    import requests
    import base64
    import cv2
    
    # 读取图像
    image_path = 'path/to/your/image.jpg'  # 请替换为实际的图像路径
    with open(image_path, 'rb') as img_file:
        image_data = img_file.read()
    
    # 将图像数据编码为Base64
    encoded_image = base64.b64encode(image_data).decode('utf-8')
    
    # 构建请求数据
    data = {'image': encoded_image}
    
    # 发送POST请求
    url = 'http://localhost:5000/detect'  # 请根据您的Flask应用的运行地址修改
    response = requests.post(url, json=data)
    
    # 处理服务器的响应
    if response.status_code == 200:
        detection_results = response.json()
        print("检测结果:", detection_results)
    else:
        print("请求错误:", response.status_code)
    

    步骤5:性能优化

    为了确保在本地机器上使用GPU进行图片推理并达到9 FPS的要求,您可以考虑以下优化方式:

    • 使用GPU加速:确保PyTorch和CUDA配置正确,以便在GPU上进行推理。
    • 批处理推理:批量处理多个图像以提高吞吐量。
    • 使用高效的YOLOv7变体(例如yolov7s):减少模型大小以提高推理速度。
    • 使用FastAPI代替Flask:FastAPI通常比Flask更快,可以提高响应速度。

    请注意,实际性能可能会受到硬件、模型大小和图像复杂性的影响,您可能需要进行一些调整来满足性能要求。

    希望这个解决方案对您有帮助。如果有任何问题或需要进一步的帮助,请随时提问。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月6日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数