PaddlePaddle / PaddleHub

Awesome pre-trained models toolkit based on PaddlePaddle. (400+ models including Image, Text, Audio, Video and Cross-Modal with Easy Inference & Serving)【安全加固,暂停交互,请耐心等待】
https://www.paddlepaddle.org.cn/hub
Apache License 2.0
12.67k stars 2.08k forks source link

多个模型封装在一个API进行部署的问题 #1563

Open ztc125521 opened 3 years ago

ztc125521 commented 3 years ago

目前有一个检测模型和一个识别模型,如何把两个模型级联起来然后通过paddle hub的sever服务部署

haoyuying commented 3 years ago

可以自己写一个hub module将两个模型封装在一个函数里,同时这个module实现serving功能,就能通过调用新写的模型的serving来实现两个功能。比如说之前封装了四个module的另一个例子:

import base64
import cv2

import numpy as np
import paddlehub as hub
from paddlehub.module.module import moduleinfo, serving, Module

def cv2_to_base64(image):
    data = cv2.imencode('.jpg', image)[1]
    return base64.b64encode(data.tostring()).decode('utf8')

def base64_to_cv2(b64str):
    data = base64.b64decode(b64str.encode('utf8'))
    data = np.fromstring(data, np.uint8)
    data = cv2.imdecode(data, cv2.IMREAD_COLOR)
    return data

@moduleinfo(name="animegan",
            type="CV/image_editing",
            author="paddlepaddle",
            author_email="",
            summary="animegan is a style transfer model .",
            version="1.0.0")
class AnimeGanModel(Module):

    def _initialize(self, use_gpu=True):
        self.use_gpu = use_gpu
        self.hayao_60 = hub.Module(name='animegan_v1_hayao_60', use_gpu=self.use_gpu)
        self.hayao_64 = hub.Module(name='animegan_v2_hayao_64', use_gpu=self.use_gpu)
        self.shinkai_33 = hub.Module(name='animegan_v2_shinkai_33', use_gpu=self.use_gpu)
        self.paprika_74 = hub.Module(name='animegan_v2_paprika_74', use_gpu=self.use_gpu)

    def style_transfer(self, input):

        hayao_60 = self.hayao_60.style_transfer(images=input)[0]
        hayao_64 = self.hayao_64.style_transfer(images=input)[0]
        shikai_33 = self.shinkai_33.style_transfer(images=input)[0]
        paprica_74 = self.paprika_74.style_transfer(images=input)[0]
        result = [hayao_60, hayao_64, shikai_33, paprica_74]
        return result

    @serving
    def serving_method(self, images):
        """
        Run as a service.
        """
        images_decode = [base64_to_cv2(image) for image in images]
        results = self.style_transfer(images_decode)
        data = {}
        data['hayao_60'] = cv2_to_base64(results[0])
        data['hayao_64'] = cv2_to_base64(results[1])
        data['shikai_33'] = cv2_to_base64(results[2])
        data['paprica_74'] = cv2_to_base64(results[3])

        return data