2021-06-17 20:56:03 +08:00
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2020-11-10 17:19:50 +08:00
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
sys . path . insert ( 0 , " . " )
import time
import numpy as np
2020-12-30 14:43:00 +08:00
import paddle . nn as nn
2021-06-17 20:56:03 +08:00
from paddlehub . module . module import moduleinfo , serving
2020-11-10 17:19:50 +08:00
2021-06-17 20:56:03 +08:00
from hubserving . clas . params import get_default_confg
from python . predict_cls import ClsPredictor
from utils import config
from utils . encode_decode import b64_to_np
2020-11-10 17:19:50 +08:00
@moduleinfo (
name = " clas_system " ,
version = " 1.0.0 " ,
summary = " class system service " ,
author = " paddle-dev " ,
author_email = " paddle-dev@baidu.com " ,
type = " cv/class " )
2020-12-30 14:43:00 +08:00
class ClasSystem ( nn . Layer ) :
def __init__ ( self , use_gpu = None , enable_mkldnn = None ) :
2020-11-10 17:19:50 +08:00
"""
initialize with the necessary elements
"""
2021-06-17 20:56:03 +08:00
self . _config = self . _load_config (
use_gpu = use_gpu , enable_mkldnn = enable_mkldnn )
self . cls_predictor = ClsPredictor ( self . _config )
def _load_config ( self , use_gpu = None , enable_mkldnn = None ) :
cfg = get_default_confg ( )
cfg = config . AttrDict ( cfg )
config . create_attr_dict ( cfg )
2020-11-10 17:19:50 +08:00
if use_gpu is not None :
2021-06-17 20:56:03 +08:00
cfg . Global . use_gpu = use_gpu
2020-11-16 19:44:17 +08:00
if enable_mkldnn is not None :
2021-06-17 20:56:03 +08:00
cfg . Global . enable_mkldnn = enable_mkldnn
2020-11-10 17:19:50 +08:00
cfg . enable_benchmark = False
2021-06-17 20:56:03 +08:00
if cfg . Global . use_gpu :
2020-11-10 17:19:50 +08:00
try :
_places = os . environ [ " CUDA_VISIBLE_DEVICES " ]
int ( _places [ 0 ] )
2021-06-17 20:56:03 +08:00
print ( " Use GPU, GPU Memery: {} " . format ( cfg . Global . gpu_mem ) )
2020-11-10 17:19:50 +08:00
print ( " CUDA_VISIBLE_DEVICES: " , _places )
except :
raise RuntimeError (
" Environment Variable CUDA_VISIBLE_DEVICES is not set correctly. If you wanna use gpu, please set CUDA_VISIBLE_DEVICES via export CUDA_VISIBLE_DEVICES=cuda_device_id. "
)
else :
print ( " Use CPU " )
2020-11-16 19:44:17 +08:00
print ( " Enable MKL-DNN " ) if enable_mkldnn else None
2021-06-17 20:56:03 +08:00
return cfg
2020-11-10 17:19:50 +08:00
2021-06-17 20:56:03 +08:00
def predict ( self , inputs ) :
if not isinstance ( inputs , list ) :
raise Exception (
" The input data is inconsistent with expectations. " )
2020-11-10 17:19:50 +08:00
2021-03-26 18:52:50 +08:00
starttime = time . time ( )
2021-06-17 20:56:03 +08:00
outputs = self . cls_predictor . predict ( inputs )
2021-03-26 18:52:50 +08:00
elapse = time . time ( ) - starttime
2021-09-02 12:58:10 +08:00
return { " prediction " : outputs , " elapse " : elapse }
2020-11-10 17:19:50 +08:00
@serving
2021-06-17 20:56:03 +08:00
def serving_method ( self , images , revert_params ) :
2020-11-10 17:19:50 +08:00
"""
Run as a service .
"""
2021-03-26 18:52:50 +08:00
input_data = b64_to_np ( images , revert_params )
2021-06-17 20:56:03 +08:00
results = self . predict ( inputs = list ( input_data ) )
2020-11-10 17:19:50 +08:00
return results
2021-06-17 20:56:03 +08:00
if __name__ == " __main__ " :
import cv2
import paddlehub as hub
module = hub . Module ( name = " clas_system " )
img_path = " ./hubserving/ILSVRC2012_val_00006666.JPEG "
img = cv2 . imread ( img_path ) [ : , : , : : - 1 ]
img = cv2 . resize ( img , ( 224 , 224 ) ) . transpose ( ( 2 , 0 , 1 ) )
res = module . predict ( [ img . astype ( np . float32 ) ] )
print ( " The returned result of {} : {} " . format ( img_path , res ) )