之前的文章已经讲过怎么使用通过YOLOV5训练出来的模型,现在我们要把这个功能部署到服务器上,但是再这之前,我们要先把这个功能做成一个服务,因为本人学的是python所以就使用python常用的两个服务来进行部署。
这是flask的运行代码,按照之前的文章放好对应文件之后运行即可通过api调用图片识别api
from flask import Flask,request
import torch
import cv2
from library import DetectMultiBackend,LoadImages,Annotator,non_max_suppression,scale_coords,colors
import numpy as np
import base64
device = torch.device('cpu')
model = DetectMultiBackend("date/best.pt", device=device, dnn=False)
if model.pt:
model.model.float()
print("模型加载完成")
def detect_img(img0): #预测
device = torch.device('cpu')
stride, names = model.stride, model.names #读取模型的步长和模型的识别类别
dataset = LoadImages(img0=img0, img_size=[640, 640], stride=stride, auto=False) #对读取的图片进行格式化处理
# print(dataset)
for im, im0s in dataset:
im = (torch.from_numpy(im).to(device).float()/255)[None] #把图片数据转换成张量
pred = model(im, augment=False, visualize=False) #进行检测
det = non_max_suppression(pred, 0.25, 0.45, None, False, max_det=1000)[0] #对检测结果进行处理
im0 = im0s.copy()
annotator = Annotator(im0, line_width=0, example=str(names))
data = dict.fromkeys(names,0)
if len(det):
det[:, :4] = scale_coords(im.shape[2:], det[:, :4], im0.shape).round() #识别结果都在这里了
for *xyxy, conf, cls in reversed(det): #xyxy是识别结果的标注框的坐标,conf是识别结果的置信度,cls是识别结果对应的类别
c = int(cls)
data[names[c]]+=1
label = (f'{names[c][0]}{data[names[c]]}')
annotator.box_label(xyxy, label, color=colors(c, True)) #对图片进行标注,就是画框
im0 = annotator.result()
return data,im0
app = Flask(__name__)
@app.route('/yolov5/',methods = ['POST']) #设置API url 和请求类型
def hello_word():
imgdata = request.form['image'] #接收图片base64数据
img0 = base64.b64decode(imgdata) #把base64转换为图片数据
img1 = np.frombuffer(img0,np.uint8) #进行格式修正
img2 = cv2.imdecode(img1,cv2.COLOR_RGB2BGR) #opencv读取图片数据
count,im6 = detect_img(img2) #识别函数处理图片
return (str(count)) #回传图片识别结果
if __name__ == '__main__':
app.run()
调用api程序样例
import requests
import base64
with open("a1.jpg",'rb') as f:
base64_img = base64.b64encode(f.read())
imgdata = base64_img
data = {'image':imgdata}
# print(data['image'])
postq = requests.post("http://127.0.0.1:5000/yolov5/",data=data)
print(postq.text)
回传结果展示
这里在之前文章创建的DJango项目内直接进行增加功能api,先按类型如下文件目录放好对应文件。
E:.
└─guossb
│ library.py
│ manage.py
│ shibie.py //这个是新文件,是识别函数所在的文件,把识别函数封装起来,方便调用。
│
├─date
│ best.pt
│
├─guossb
│ │ asgi.py
│ │ settings.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│ │
│ └─__pycache__
│ settings.cpython-38.pyc
│ urls.cpython-38.pyc
│ wsgi.cpython-38.pyc
│ __init__.cpython-38.pyc
│
├─models
│ │ common.py
│ │ experimental.py
│ │ yolo.py
│ │
│ └─__pycache__
│ common.cpython-38.pyc
│ experimental.cpython-38.pyc
│ yolo.cpython-38.pyc
│
├─path
│ ai.jpg
│
├─uniappclient
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ __init__.cpython-38.pyc
│ │
│ └─__pycache__
│ admin.cpython-38.pyc
│ apps.cpython-38.pyc
│ library.cpython-38.pyc
│ models.cpython-38.pyc
│ views.cpython-38.pyc
│ __init__.cpython-38.pyc
│
├─utils
│ │ augmentations.py
│ │ autoanchor.py
│ │ datasets.py
│ │ downloads.py
│ │ general.py
│ │ metrics.py
│ │ plots.py
│ │ torch_utils.py
│ │
│ └─__pycache__
│ augmentations.cpython-38.pyc
│ autoanchor.cpython-38.pyc
│ datasets.cpython-38.pyc
│ downloads.cpython-38.pyc
│ general.cpython-38.pyc
│ metrics.cpython-38.pyc
│ plots.cpython-38.pyc
│ torch_utils.cpython-38.pyc
│
└─__pycache__
library.cpython-38.pyc
shibie.cpython-38.pyc
识别函数封装如下
import torch
from library import DetectMultiBackend,LoadImages,Annotator,non_max_suppression,scale_coords,colors
device = torch.device('cpu')
model = DetectMultiBackend("./date/best.pt", device=device, dnn=False)
if model.pt:
model.model.float()
print("模型加载完成")
def detect_img(img0): #预测
device = torch.device('cpu')
stride, names = model.stride, model.names #读取模型的步长和模型的识别类别
dataset = LoadImages(img0=img0, img_size=[640, 640], stride=stride, auto=False) #对读取的图片进行格式化处理
# print(dataset)
for im, im0s in dataset:
im = (torch.from_numpy(im).to(device).float()/255)[None] #把图片数据转换成张量
pred = model(im, augment=False, visualize=False) #进行检测
det = non_max_suppression(pred, 0.25, 0.45, None, False, max_det=1000)[0] #对检测结果进行处理
im0 = im0s.copy()
annotator = Annotator(im0, line_width=0, example=str(names))
data = dict.fromkeys(names,0)
if len(det):
det[:, :4] = scale_coords(im.shape[2:], det[:, :4], im0.shape).round() #识别结果都在这里了
for *xyxy, conf, cls in reversed(det): #xyxy是识别结果的标注框的坐标,conf是识别结果的置信度,cls是识别结果对应的类别
c = int(cls)
data[names[c]]+=1
label = (f'{names[c][0]}{data[names[c]]}')
annotator.box_label(xyxy, label, color=colors(c, True)) #对图片进行标注,就是画框
im0 = annotator.result()
return data,im0
然后我们在guossb\uniappclient\views.py的文件内新增一个api函数,目前是简单写一些证明功能的正常性,新增内容如下
from shibie import detect_img #导入识别函数
#单图片识别api
def duoiphone(request):
data = {}
imgdata = request.POST.get('image')
img0 = base64.b64decode(imgdata)
img1 = np.frombuffer(img0,np.uint8)
img2 = cv2.imdecode(img1,cv2.COLOR_RGB2BGR)
count,im6 = detect_img(img2)
data = count
return JsonResponse(data)
然后在guossb\guossb\urls.py内新增对应函数api路由。
from django.contrib import admin
from django.urls import path
import uniappclient.views as uniapp
urlpatterns = [
# path('admin/', admin.site.urls),
path('index/',uniapp.index),
path('getches/',uniapp.getces),
path('yolov5/',uniapp.duoiphone) #新增路由
]
之后运行DJango服务即可。使用和上面flask一致的测试代码即可,记得更改对应端口号。