深度学习模型预测时间很慢

在做深度学习任务时,我是做图像目标检测,用tensorflow或者keras或者pytorch训练完模型,然后就是做预测,发现无论是用GPU还是CPU都非常慢,然后百度了好久都没有解决问题。

无论是不是配置低,如果我们要做成品,一定要部署。

我每个函数都去用time.time()去计算耗时,最后发现调用模型的时候耗时最多,也是罪魁祸首。
深度学习模型预测时间很慢_第1张图片

无论你是调用ssd或者yolo模型,在这里的调用都非常耗时。系统有初始化,每次你去预测一张图片,系统都要重新调用一次模型,初始化一次模型,加载一次模型,这样就很慢了,我们的思路应该是这样,模型一直在系统后台跑着,初始化着,然后直接去用模型去预测就快了。

我是用了flask去做接口然后调用模型的。查了资料,flask对轻量级不错,也是主流的框架。

下面示范flask调用yolo目标检测的代码:

1.创建一个 API.py

from flask import Flask,request,make_response
from PIL import Image
from io import BytesIO
from yolo import YOLO
import json
app = Flask(__name__)
 
# 加载模型
yolo = YOLO()
 
# 处理请求
@app.route('/yolo', methods=['POST'])
def hello():
    global yolo
    img = request.stream.read()
    f = BytesIO(img)
    image = Image.open(f)
    out_boxes, out_scores, out_classes = yolo.detect_image2(image)
    data = []
    for i, c in reversed(list(enumerate(out_classes))):
        item = {
        'predicted_class': yolo.class_names[c],
        #'box': out_boxes[i],
        'score': str(out_scores[i])
        }
        data.append(item)
 
 
    rsp = make_response(json.dumps(data))
    rsp.mimetype = 'application/json'
    rsp.headers['Connection'] = 'close'
    return rsp
if __name__ == '__main__':
    #app.debug = True
    app.run(processes=1,threaded=False)

yolo启动时初始化,常驻内存,这样识别速度就提高很多

2.在你自己工程的 yolo.py加上这个函数:

    def detect_image2(self, image):
        if self.model_image_size != (None, None):
            assert self.model_image_size[0]%32 == 0, 'Multiples of 32 required'
            assert self.model_image_size[1]%32 == 0, 'Multiples of 32 required'
            boxed_image = letterbox_image(image, tuple(reversed(self.model_image_size)))
        else:
            new_image_size = (image.width - (image.width % 32),
                              image.height - (image.height % 32))
            boxed_image = letterbox_image(image, new_image_size)
        image_data = np.array(boxed_image, dtype='float32')
 
        image_data /= 255.
        image_data = np.expand_dims(image_data, 0)  # Add batch dimension.
 
        out_boxes, out_scores, out_classes = self.sess.run(
            [self.boxes, self.scores, self.classes],
            feed_dict={
                self.yolo_model.input: image_data,
                self.input_image_shape: [image.size[1], image.size[0]],
                K.learning_phase(): 0
            })
        return out_boxes, out_scores, out_classes

3.用Python写一个调用API接口的 test.py:(这里也可以用其他语言去调用我们的API)

import requests
import os
import json
 
url = 'http://127.0.0.1:5000/yolo'
headers = {'Content-Type' : 'image/jpeg'}
 
files = {'media': open('1.jpg', 'rb')}#你要预测的图片
requests.post(url, files=files)
 
data = open('1.jpg','rb').read()
r = requests.post(url,data=data, headers=headers, verify=False)
print(r.text)

1.jpg就是你要预测的图片

其他模型或者调用视频大家举一反三就好了。

你可能感兴趣的:(工作,python,深度学习,人工智能,神经网络,tensorflow)