Skip to content

Commit

Permalink
add hubserving
Browse files Browse the repository at this point in the history
  • Loading branch information
WenmuZhou committed Dec 1, 2020
1 parent 9fd1630 commit cb7afb8
Show file tree
Hide file tree
Showing 13 changed files with 617 additions and 92 deletions.
Empty file.
15 changes: 15 additions & 0 deletions deploy/hubserving/ocr_cls/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"modules_info": {
"ocr_cls": {
"init_args": {
"version": "1.0.0",
"use_gpu": true
},
"predict_args": {
}
}
},
"port": 8866,
"use_multiprocess": false,
"workers": 2
}
121 changes: 121 additions & 0 deletions deploy/hubserving/ocr_cls/module.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import sys
sys.path.insert(0, ".")

from paddlehub.common.logger import logger
from paddlehub.module.module import moduleinfo, runnable, serving
import cv2
import paddlehub as hub

from tools.infer.utility import base64_to_cv2
from tools.infer.predict_cls import TextClassifier


@moduleinfo(
name="ocr_cls",
version="1.0.0",
summary="ocr recognition service",
author="paddle-dev",
author_email="[email protected]",
type="cv/text_recognition")
class OCRCls(hub.Module):
def _initialize(self, use_gpu=False, enable_mkldnn=False):
"""
initialize with the necessary elements
"""
from ocr_cls.params import read_params
cfg = read_params()

cfg.use_gpu = use_gpu
if use_gpu:
try:
_places = os.environ["CUDA_VISIBLE_DEVICES"]
int(_places[0])
print("use gpu: ", use_gpu)
print("CUDA_VISIBLE_DEVICES: ", _places)
cfg.gpu_mem = 8000
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."
)
cfg.ir_optim = True
cfg.enable_mkldnn = enable_mkldnn

self.text_classifier = TextClassifier(cfg)

def read_images(self, paths=[]):
images = []
for img_path in paths:
assert os.path.isfile(
img_path), "The {} isn't a valid file.".format(img_path)
img = cv2.imread(img_path)
if img is None:
logger.info("error in loading image:{}".format(img_path))
continue
images.append(img)
return images

def predict(self, images=[], paths=[]):
"""
Get the text angle in the predicted images.
Args:
images (list(numpy.ndarray)): images data, shape of each is [H, W, C]. If images not paths
paths (list[str]): The paths of images. If paths not images
Returns:
res (list): The result of text detection box and save path of images.
"""

if images != [] and isinstance(images, list) and paths == []:
predicted_data = images
elif images == [] and isinstance(paths, list) and paths != []:
predicted_data = self.read_images(paths)
else:
raise TypeError("The input data is inconsistent with expectations.")

assert predicted_data != [], "There is not any image to be predicted. Please check the input data."

img_list = []
for img in predicted_data:
if img is None:
continue
img_list.append(img)

rec_res_final = []
try:
img_list, cls_res, predict_time = self.text_classifier(img_list)
for dno in range(len(cls_res)):
angle, score = cls_res[dno]
rec_res_final.append({
'angle': angle,
'confidence': float(score),
})
except Exception as e:
print(e)
return [[]]

return [rec_res_final]

@serving
def serving_method(self, images, **kwargs):
"""
Run as a service.
"""
images_decode = [base64_to_cv2(image) for image in images]
results = self.predict(images_decode, **kwargs)
return results


if __name__ == '__main__':
ocr = OCRCls()
image_path = [
'./doc/imgs_words/ch/word_1.jpg',
'./doc/imgs_words/ch/word_2.jpg',
'./doc/imgs_words/ch/word_3.jpg',
]
res = ocr.predict(paths=image_path)
print(res)
24 changes: 24 additions & 0 deletions deploy/hubserving/ocr_cls/params.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function


class Config(object):
pass


def read_params():
cfg = Config()

#params for text classifier
cfg.cls_model_dir = "./inference/ch_ppocr_mobile_v1.1_cls_infer/"
cfg.cls_image_shape = "3, 48, 192"
cfg.label_list = ['0', '180']
cfg.cls_batch_num = 30
cfg.cls_thresh = 0.9

cfg.use_zero_copy_run = False
cfg.use_pdserving = False

return cfg
2 changes: 1 addition & 1 deletion deploy/hubserving/ocr_det/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
}
}
},
"port": 8866,
"port": 8865,
"use_multiprocess": false,
"workers": 2
}
28 changes: 9 additions & 19 deletions deploy/hubserving/ocr_det/module.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,14 @@
from __future__ import division
from __future__ import print_function

import argparse
import ast
import copy
import math
import os
import time
import sys
sys.path.insert(0, ".")

from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor
from paddlehub.common.logger import logger
from paddlehub.module.module import moduleinfo, runnable, serving
from PIL import Image
import cv2
import numpy as np
import paddle.fluid as fluid
import paddlehub as hub

from tools.infer.utility import base64_to_cv2
Expand Down Expand Up @@ -67,9 +61,7 @@ def read_images(self, paths=[]):
images.append(img)
return images

def predict(self,
images=[],
paths=[]):
def predict(self, images=[], paths=[]):
"""
Get the text box in the predicted images.
Args:
Expand All @@ -87,7 +79,7 @@ def predict(self,
raise TypeError("The input data is inconsistent with expectations.")

assert predicted_data != [], "There is not any image to be predicted. Please check the input data."

all_results = []
for img in predicted_data:
if img is None:
Expand All @@ -99,11 +91,9 @@ def predict(self,

rec_res_final = []
for dno in range(len(dt_boxes)):
rec_res_final.append(
{
'text_region': dt_boxes[dno].astype(np.int).tolist()
}
)
rec_res_final.append({
'text_region': dt_boxes[dno].astype(np.int).tolist()
})
all_results.append(rec_res_final)
return all_results

Expand All @@ -116,12 +106,12 @@ def serving_method(self, images, **kwargs):
results = self.predict(images_decode, **kwargs)
return results


if __name__ == '__main__':
ocr = OCRDet()
image_path = [
'./doc/imgs/11.jpg',
'./doc/imgs/12.jpg',
]
res = ocr.predict(paths=image_path)
print(res)
print(res)
14 changes: 8 additions & 6 deletions deploy/hubserving/ocr_det/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,17 @@ class Config(object):

def read_params():
cfg = Config()

#params for text detector
cfg.det_algorithm = "DB"
cfg.det_model_dir = "./inference/ch_det_mv3_db/"
cfg.det_max_side_len = 960
cfg.det_model_dir = "./inference/ch_ppocr_mobile_v1.1_det_infer/"
cfg.det_limit_side_len = 960
cfg.det_limit_type = 'max'

#DB parmas
cfg.det_db_thresh =0.3
cfg.det_db_box_thresh =0.5
cfg.det_db_unclip_ratio =2.0
cfg.det_db_thresh = 0.3
cfg.det_db_box_thresh = 0.5
cfg.det_db_unclip_ratio = 2.0

# #EAST parmas
# cfg.det_east_score_thresh = 0.8
Expand All @@ -37,5 +38,6 @@ def read_params():
# cfg.use_space_char = True

cfg.use_zero_copy_run = False
cfg.use_pdserving = False

return cfg
34 changes: 11 additions & 23 deletions deploy/hubserving/ocr_rec/module.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,13 @@
from __future__ import division
from __future__ import print_function

import argparse
import ast
import copy
import math
import os
import time
import sys
sys.path.insert(0, ".")

from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor
from paddlehub.common.logger import logger
from paddlehub.module.module import moduleinfo, runnable, serving
from PIL import Image
import cv2
import numpy as np
import paddle.fluid as fluid
import paddlehub as hub

from tools.infer.utility import base64_to_cv2
Expand Down Expand Up @@ -67,9 +60,7 @@ def read_images(self, paths=[]):
images.append(img)
return images

def predict(self,
images=[],
paths=[]):
def predict(self, images=[], paths=[]):
"""
Get the text box in the predicted images.
Args:
Expand All @@ -87,31 +78,28 @@ def predict(self,
raise TypeError("The input data is inconsistent with expectations.")

assert predicted_data != [], "There is not any image to be predicted. Please check the input data."

img_list = []
for img in predicted_data:
if img is None:
continue
img_list.append(img)

rec_res_final = []
try:
rec_res, predict_time = self.text_recognizer(img_list)
for dno in range(len(rec_res)):
text, score = rec_res[dno]
rec_res_final.append(
{
'text': text,
'confidence': float(score),
}
)
rec_res_final.append({
'text': text,
'confidence': float(score),
})
except Exception as e:
print(e)
return [[]]

return [rec_res_final]


@serving
def serving_method(self, images, **kwargs):
"""
Expand All @@ -121,7 +109,7 @@ def serving_method(self, images, **kwargs):
results = self.predict(images_decode, **kwargs)
return results


if __name__ == '__main__':
ocr = OCRRec()
image_path = [
Expand All @@ -130,4 +118,4 @@ def serving_method(self, images, **kwargs):
'./doc/imgs_words/ch/word_3.jpg',
]
res = ocr.predict(paths=image_path)
print(res)
print(res)
18 changes: 2 additions & 16 deletions deploy/hubserving/ocr_rec/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,10 @@ class Config(object):

def read_params():
cfg = Config()

# #params for text detector
# cfg.det_algorithm = "DB"
# cfg.det_model_dir = "./inference/ch_det_mv3_db/"
# cfg.det_max_side_len = 960

# #DB parmas
# cfg.det_db_thresh =0.3
# cfg.det_db_box_thresh =0.5
# cfg.det_db_unclip_ratio =2.0

# #EAST parmas
# cfg.det_east_score_thresh = 0.8
# cfg.det_east_cover_thresh = 0.1
# cfg.det_east_nms_thresh = 0.2

#params for text recognizer
cfg.rec_algorithm = "CRNN"
cfg.rec_model_dir = "./inference/ch_rec_mv3_crnn/"
cfg.rec_model_dir = "./inference/ch_ppocr_mobile_v1.1_rec_infer/"

cfg.rec_image_shape = "3, 32, 320"
cfg.rec_char_type = 'ch'
Expand All @@ -39,5 +24,6 @@ def read_params():
cfg.use_space_char = True

cfg.use_zero_copy_run = False
cfg.use_pdserving = False

return cfg
Loading

0 comments on commit cb7afb8

Please sign in to comment.