通过API调用图片识别功能

通过API调用图片识别功能

之前的文章已经讲过怎么使用通过YOLOV5训练出来的模型,现在我们要把这个功能部署到服务器上,但是再这之前,我们要先把这个功能做成一个服务,因为本人学的是python所以就使用python常用的两个服务来进行部署。

Flask

这是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

这里在之前文章创建的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一致的测试代码即可,记得更改对应端口号。

你可能感兴趣的:(flask,python,后端,django)