这是一个YOLOv5的云端部署代码,其存在的主要目的是为了解决将YOLOv5训练出来的权重或者官方权重简单快速的部署上云服务或者Docker中,并且可以通过POST请求在任意代码中调用(如Java、Python、Android…)。
- 环境要求:python3和YOLOv5官方指定环境
- 设备要求:Windows(GPU/CPU)、Linux(GPU/CPU)
. ├── Serving_model # 模型文件夹 │ └── commodity │ └── 1 # 版本 │ └── weights.pt # 权重 ├── clear.bat # Windows环境下清理服务缓存 ├── clear.sh # Linux环境下清理服务缓存 ├── config.yaml # 配置文件 ├── detector.py # YOLOv5的封装 ├── images # 测试图和POST案例 │ ├── bus.jpg │ ├── post.py # POST案例 │ └── zidane.jpg ├── models # YOLOv5文件夹 ├── server.py # 云端部署主Server启动文件 ├── static # 静态网页相关内容 │ ├── css │ │ └── overall.css │ ├── icon │ │ └── favicon.png │ └── js │ ├── jquery-1.11.1.min.js │ └── main.js ├── templates │ └── Index.html # 静态页面 └── utils # YOLOv5工具文件夹使用
- 面包多-【源码】YOLOv5云端API部署
- 修改配置文件config.yaml:
# 未解释内容不要做修改!!! HOST: localhost # 本地测试为localhost,云端部署为0.0.0.0 PORT: 8090 # 根据需求指定端口,默认8090 FOLDER: ['caches', 'results','results_json'] CACHE_FOLDER: caches RESULTS_FOLDER: results ALLOWED_EXTENSIONS: ['png', 'jpg', 'jpeg'] MYDEVICE: '0' # 使用的设备('0':代表使用GPU;'cpu':代表使用CPU) IMG_SIZE: 640 # 输入图片大小640 THRESHOLD: 0.6 # 置信度 DIR_PATH: Serving_model/commodity/
- 修改server.py:
# 第101到114行,确定某种场景下使用后,删除另外一种方式即可 ''' 方式一运行,调试情景下使用 app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持。 1.threaded : 多线程支持,默认为False,即不开启多线程; 2.processes:进程数量,默认为1. ''' app.run(host=cfg['HOST'], port=cfg['PORT'], debug=False, threaded=True, processes=1) ''' 方式二运行,部署情景下使用 ''' # server = pywsgi.WSGIServer((cfg['HOST'],cfg['PORT']),app) # server.serve_forever()
- 启动服务:
# 确认自己安装好python3环境,其他环境同YOLOv5官方指定环境 python server.py 输出 ============================================ Model Version:1,Use Model Weight:/weights.pt ============================================ YOLOv5 2022-2-9 torch 1.10.1+cu102 CUDA:0 (NVIDIA GeForce GTX 1050, 4096MiB) Fusing layers... Model Summary: 213 layers, 7225885 parameters, 0 gradients, 16.5 GFLOPs * Serving Flask app 'server' (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://localhost:8090/ (Press CTRL+C to quit)
-
服务启动后,在浏览器访问(与配置文件config.yaml中的HOST和POST保持一致访问):http://127.0.0.1:8090 即可
-
测试发送post请求:
# 进入images文件夹下,修改post.py即可
import requests
import json
url = 'http://127.0.0.1:8090/detect'
files = {'file': open('./bus.jpg', 'rb')}
r = requests.post(url, files=files)
print(r.text)
# 之后运行这个post.py文件
输出:
{
"img_info": {
"bus-04": {
"confidence": 0.849,
"label": "bus",
"xmax": 810,
"xmin": 13,
"ymax": 789,
"ymin": 223
},
"person-01": {
"confidence": 0.896,
"label": "person",
"xmax": 810,
"xmin": 672,
"ymax": 878,
"ymin": 395
},
"person-02": {
"confidence": 0.87,
"label": "person",
"xmax": 346,
"xmin": 221,
"ymax": 867,
"ymin": 408
},
"person-03": {
"confidence": 0.852,
"label": "person",
"xmax": 248,
"xmin": 49,
"ymax": 912,
"ymin": 390
}
},
"img_url": "static\caches\ba26d4fff86a4143a00daf058ee458eb.jpg",
"result_url": "static\results\ba26d4fff86a4143a00daf058ee458eb.jpg",
"status": 1,
"time": "1.6179s"
}
- 更换为你自己训练的模型:
请注意,我们的API服务默认支持YOLOv5 version6.1训练出来的权重,其他版本训练出来的权重,需要调整相应的文件,即modules和utils文件夹为对应版本即可!
将你自己训练的模型重新命名为:weights.pt,在Serving_modelcommodity文件夹下新建一个最新的数字文件夹(例如Serving_modelcommodity文件夹下有一个1文件夹,你可以新建一个2文件夹),将weights.pt放入到新建的这个数字文件夹。
这里我们的server.py里面会自动检测大数字的文件夹并且调用其权重。这里2比1大因此会优先调用2文件夹中的权重。
- 重复上述步骤4-6即可完成自己项目的本地部署和测试。
- 云端部署与本地部署无差异。
前面我们说到将YOLOv5做成了API服务,参数解释如下:
发送| 参数 | 解释 |
|---|---|
| file | 二进制读取的图片 |
| 参数 | 解释 |
|---|---|
| status | 1 - 成功检测到目标;0 - 未检测到目标 |
| img_url | 上传的图片在云端存储地址 |
| result_url | 模型检测绘制的图片的云端存储地址 |
| result_json | 模型检测信息的云端存储地址 |
| img_info | 返回多个物体的检测类别、置信度、xywh值 |
| time | 模型预测该张图片的时间 |



