diff --git a/deploy/python/ppshitu_v2/configs/test_config.yml b/deploy/python/ppshitu_v2/configs/test_config.yml index 16f32fd47f314859ed20ca443b8fb29ab5bafe49..e230bb1deb8d067fda8c17d9a9a2142ba9eed050 100644 --- a/deploy/python/ppshitu_v2/configs/test_config.yml +++ b/deploy/python/ppshitu_v2/configs/test_config.yml @@ -1,12 +1,10 @@ -Global: - Engine: POPEngine - infer_imgs: "../../images/wangzai.jpg" - -AlgoModule: - - Module: - preprocess: - name: ImageProcessor - processors: +Modules: + - name: Detector + type: AlgoMod + processors: + - name: ImageProcessor + type: preprocessor + ops: - ResizeImage: size: [640, 640] interpolation: 2 @@ -17,14 +15,16 @@ AlgoModule: order: hwc - ToCHWImage: - GetShapeInfo: - order: chw + configs: + order: chw - ToBatch: - predictor: + - name: PaddlePredictor + type: predictor inference_model_dir: ./models/ppyolov2_r50vd_dcn_mainbody_v1.0_infer/ - input_names: + input_names: output_names: - postprocess: - name: DetPostProcessor + - name: DetPostPro + type: postprocessor threshold: 0.2 max_det_results: 1 label_list: diff --git a/deploy/python/ppshitu_v2/engine/pop_engine.py b/deploy/python/ppshitu_v2/engine/pop_engine.py index ba9e11534d912d0170f01b24c88b188b5fb4603b..ba7c85c4c2508a4f982f1201c9cbd200d27f58b4 100644 --- a/deploy/python/ppshitu_v2/engine/pop_engine.py +++ b/deploy/python/ppshitu_v2/engine/pop_engine.py @@ -1,16 +1,18 @@ +import importlib + from processor.algo_mod import AlgoMod class POPEngine: def __init__(self, config): self.algo_list = [] - # last_algo_type = "start" - for algo_config in config["AlgoModule"]: - # algo_config["last_algo_type"] = last_algo_type - self.algo_list.append(AlgoMod(algo_config["Module"])) - # last_algo_type = algo_config["type"] + current_mod = importlib.import_module(__name__) + for mod_config in config["Modules"]: + mod_type = mod_config.get("type") + mod = getattr(current_mod, mod_type)(mod_config) + self.algo_list.append(mod) - def process(self, x): + def process(self, input_data): for algo_module in self.algo_list: - x = algo_module.process(x) - return x + input_data = algo_module.process(input_data) + return input_data diff --git a/deploy/python/ppshitu_v2/examples/predict.py b/deploy/python/ppshitu_v2/examples/predict.py index 793f8b7eebc6c1516c99850f45d9a05a3ec70971..0379808dc1ae52ce8d55280fcb8d34a9fd6111e6 100644 --- a/deploy/python/ppshitu_v2/examples/predict.py +++ b/deploy/python/ppshitu_v2/examples/predict.py @@ -7,7 +7,6 @@ import cv2 from engine import build_engine from utils import config -from utils.get_image_list import get_image_list def main(): @@ -16,13 +15,11 @@ def main(): args.config, overrides=args.override, show=False) config_dict.profiler_options = args.profiler_options engine = build_engine(config_dict) - - image_list = get_image_list(config_dict["Global"]["infer_imgs"]) - for idx, image_file in enumerate(image_list): - img = cv2.imread(image_file)[:, :, ::-1] - input_data = {"input_image": img} - output = engine.process(input_data) - print(output) + image_file = "../../images/wangzai.jpg" + img = cv2.imread(image_file)[:, :, ::-1] + input_data = {"input_image": img} + output = engine.process(input_data) + print(output) if __name__ == '__main__': diff --git a/deploy/python/ppshitu_v2/processor/__init__.py b/deploy/python/ppshitu_v2/processor/__init__.py index ed029aa1916293a981d950ec55cf2a99c59f410d..a4ea7885ae12c0846af27868b375edbc8ca3729b 100644 --- a/deploy/python/ppshitu_v2/processor/__init__.py +++ b/deploy/python/ppshitu_v2/processor/__init__.py @@ -1,20 +1 @@ -from abc import ABC, abstractmethod - -from processor.algo_mod import searcher -from processor.algo_mod.predictors import build_predictor - -# def build_processor(config): -# print(config) -# processor_type = config.get("processor_type") -# processor_mod = locals()[processor_type] -# processor_name = config.get("processor_name") -# return getattr(processor_mod, processor_name) - -# class BaseProcessor(ABC): -# @abstractmethod -# def __init__(self, config): -# pass - -# @abstractmethod -# def process(self, input_data): -# pass +from .algo_mod import AlgoMod diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/__init__.py b/deploy/python/ppshitu_v2/processor/algo_mod/__init__.py index fa2952f0ad5b47a4480ed7275c7a5e1517bbc2d0..c4672b9eebd98c5fbdebe4b79df9e12db716aaae 100644 --- a/deploy/python/ppshitu_v2/processor/algo_mod/__init__.py +++ b/deploy/python/ppshitu_v2/processor/algo_mod/__init__.py @@ -1,23 +1,26 @@ -from processor.algo_mod.data_processor import ImageProcessor -from processor.algo_mod.post_processor.det import DetPostProcessor -from processor.algo_mod.predictors import build_predictor +from .postprocessor import build_postprocessor +from .preprocessor import build_preprocessor +from .predictor import build_predictor +from ..base_processor import BaseProcessor -def build_processor(config): - # processor_type = config.get("processor_type") - # processor_mod = locals()[processor_type] - processor_name = config.get("name") - return eval(processor_name)(config) - -class AlgoMod(object): +class AlgoMod(BaseProcessor): def __init__(self, config): - self.pre_processor = build_processor(config["preprocess"]) - self.predictor = build_predictor(config["predictor"]) - self.post_processor = build_processor(config["postprocess"]) + self.processors = [] + for processor_config in config["processors"]: + processor_type = processor_config.get("type") + if processor_type == "preprocessor": + processor = build_preprocessor(processor_config) + elif processor_type == "predictor": + processor = build_predictor(processor_config) + elif processor_type == "postprocessor": + processor = build_postprocessor(processor_config) + else: + raise NotImplemented("processor type {} unknown.".format(processor_type)) + self.processors.append(processor) def process(self, input_data): - input_data = self.pre_processor.process(input_data) - input_data = self.predictor.process(input_data) - input_data = self.post_processor.process(input_data) + for processor in self.processors: + input_data = processor.process(input_data) return input_data diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/__init__.py b/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/__init__.py deleted file mode 100644 index 42fc6ea3647a7d24a04ceda6b0f7b2b9889b94a5..0000000000000000000000000000000000000000 --- a/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from processor.algo_mod.data_processor.image_processor import ImageProcessor -from processor.algo_mod.data_processor.bbox_cropper import BBoxCropper diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/bbox_cropper.py b/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/bbox_cropper.py deleted file mode 100644 index 21a472d4e8bbf0c633931ff141bd7802863419a4..0000000000000000000000000000000000000000 --- a/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/bbox_cropper.py +++ /dev/null @@ -1,9 +0,0 @@ -from processor.algo_mod.data_processor.image_processor import BaseProcessor - - -class BBoxCropper(BaseProcessor): - def __init__(self, config): - pass - - def process(self, input_data): - pass diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/post_processor/__init__.py b/deploy/python/ppshitu_v2/processor/algo_mod/post_processor/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/postprocessor/__init__.py b/deploy/python/ppshitu_v2/processor/algo_mod/postprocessor/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..89500a7d4b8668ea0c849f16e18c95f69108bf0e --- /dev/null +++ b/deploy/python/ppshitu_v2/processor/algo_mod/postprocessor/__init__.py @@ -0,0 +1,9 @@ +import importlib + +from .det import DetPostPro + + +def build_postprocessor(config): + processor_mod = importlib.import_module(__name__) + processor_name = config.get("name") + return getattr(processor_mod, processor_name)(config) diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/post_processor/det.py b/deploy/python/ppshitu_v2/processor/algo_mod/postprocessor/det.py similarity index 77% rename from deploy/python/ppshitu_v2/processor/algo_mod/post_processor/det.py rename to deploy/python/ppshitu_v2/processor/algo_mod/postprocessor/det.py index c46987c554ddf02f59e4d9d308cf02d9c59274a3..c69a9cf1762b7c526b3021ee877801e7aab7eb56 100644 --- a/deploy/python/ppshitu_v2/processor/algo_mod/post_processor/det.py +++ b/deploy/python/ppshitu_v2/processor/algo_mod/postprocessor/det.py @@ -1,19 +1,21 @@ from functools import reduce - import numpy as np +from utils import logger +from ...base_processor import BaseProcessor + -class DetPostProcessor(object): +class DetPostPro(BaseProcessor): def __init__(self, config): - super().__init__() self.threshold = config["threshold"] self.label_list = config["label_list"] self.max_det_results = config["max_det_results"] - def process(self, pred): - np_boxes = pred["save_infer_model/scale_0.tmp_1"] + def process(self, input_data): + pred = input_data["pred"] + np_boxes = pred[list(pred.keys())[0]] if reduce(lambda x, y: x * y, np_boxes.shape) < 6: - print('[WARNNING] No object detected.') + logger.warning('[Detector] No object detected.') np_boxes = np.array([]) keep_indexes = np_boxes[:, 1].argsort()[::-1][:self.max_det_results] diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/predictor/__init__.py b/deploy/python/ppshitu_v2/processor/algo_mod/predictor/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2913771b32ac0f43b66ad1dad0815b58d9a4544f --- /dev/null +++ b/deploy/python/ppshitu_v2/processor/algo_mod/predictor/__init__.py @@ -0,0 +1,10 @@ +import importlib + +from processor.algo_mod.predictor.paddle_predictor import PaddlePredictor +from processor.algo_mod.predictor.onnx_predictor import ONNXPredictor + + +def build_predictor(config): + processor_mod = importlib.import_module(__name__) + processor_name = config.get("name") + return getattr(processor_mod, processor_name)(config) diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/predictor/onnx_predictor.py b/deploy/python/ppshitu_v2/processor/algo_mod/predictor/onnx_predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..d86dfc3ffd31251ab25972a7c59579964c76447a --- /dev/null +++ b/deploy/python/ppshitu_v2/processor/algo_mod/predictor/onnx_predictor.py @@ -0,0 +1,8 @@ +from ...base_processor import BaseProcessor + + +class ONNXPredictor(BaseProcessor): + def __init__(self, config): + pass + def process(self, input_data): + raise NotImplemented("ONNXPredictor Not supported yet") diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/predictors/paddle_predictor.py b/deploy/python/ppshitu_v2/processor/algo_mod/predictor/paddle_predictor.py similarity index 94% rename from deploy/python/ppshitu_v2/processor/algo_mod/predictors/paddle_predictor.py rename to deploy/python/ppshitu_v2/processor/algo_mod/predictor/paddle_predictor.py index ca56967157a7d06d1b65098381d128e6f8f3294c..b4a248616c6fcdbb19c77366eace2d89c846d869 100644 --- a/deploy/python/ppshitu_v2/processor/algo_mod/predictors/paddle_predictor.py +++ b/deploy/python/ppshitu_v2/processor/algo_mod/predictor/paddle_predictor.py @@ -1,14 +1,13 @@ import os import platform - from paddle.inference import create_predictor from paddle.inference import Config as PaddleConfig +from ...base_processor import BaseProcessor + -class Predictor(object): +class PaddlePredictor(BaseProcessor): def __init__(self, config): - super().__init__() - # HALF precission predict only work when using tensorrt if config.get("use_fp16", False): assert config.get("use_tensorrt", False) is True @@ -61,5 +60,5 @@ class Predictor(object): for output_name in output_names: output = self.predictor.get_output_handle(output_name) output_data[output_name] = output.copy_to_cpu() - - return output_data + input_data["pred"] = output_data + return input_data diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/predictors/__init__.py b/deploy/python/ppshitu_v2/processor/algo_mod/predictors/__init__.py deleted file mode 100644 index 369326ad7858b17c4e5a15d40dbd0165ad132060..0000000000000000000000000000000000000000 --- a/deploy/python/ppshitu_v2/processor/algo_mod/predictors/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from processor.algo_mod.predictors.paddle_predictor import Predictor as paddle_predictor -from processor.algo_mod.predictors.onnx_predictor import Predictor as onnx_predictor - - -def build_predictor(config): - # if use paddle backend - if True: - return paddle_predictor(config) - # if use onnx backend - else: - return onnx_predictor(config) \ No newline at end of file diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/predictors/onnx_predictor.py b/deploy/python/ppshitu_v2/processor/algo_mod/predictors/onnx_predictor.py deleted file mode 100644 index 9bc86c7db22dd569cb779b679a91d556613629cb..0000000000000000000000000000000000000000 --- a/deploy/python/ppshitu_v2/processor/algo_mod/predictors/onnx_predictor.py +++ /dev/null @@ -1,3 +0,0 @@ -class Predictor(object): - def __init__(self, config): - super().__init__() diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/preprocessor/__init__.py b/deploy/python/ppshitu_v2/processor/algo_mod/preprocessor/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ffc9efde853bf32b8fe997d4c7b8402c9354dce1 --- /dev/null +++ b/deploy/python/ppshitu_v2/processor/algo_mod/preprocessor/__init__.py @@ -0,0 +1,9 @@ +import importlib + +from processor.algo_mod.preprocessor.image_processor import ImageProcessor + + +def build_preprocessor(config): + processor_mod = importlib.import_module(__name__) + processor_name = config.get("name") + return getattr(processor_mod, processor_name)(config) diff --git a/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/image_processor.py b/deploy/python/ppshitu_v2/processor/algo_mod/preprocessor/image_processor.py similarity index 86% rename from deploy/python/ppshitu_v2/processor/algo_mod/data_processor/image_processor.py rename to deploy/python/ppshitu_v2/processor/algo_mod/preprocessor/image_processor.py index 5355f6fc1fb46f83a4a49e35e0526dd286e875de..9c3aa864be811f60091f8f68e63b65916203c123 100644 --- a/deploy/python/ppshitu_v2/processor/algo_mod/data_processor/image_processor.py +++ b/deploy/python/ppshitu_v2/processor/algo_mod/preprocessor/image_processor.py @@ -3,32 +3,20 @@ import cv2 import numpy as np import importlib from PIL import Image -import paddle from utils import logger -# from processor import BaseProcessor +from processor.base_processor import BaseProcessor -from abc import ABC, abstractmethod - -class BaseProcessor(ABC): - @abstractmethod - def __init__(self, *args, **kwargs): - pass - - @abstractmethod - def process(self, input_data): - pass - - -class ImageProcessor(object): +class ImageProcessor(BaseProcessor): def __init__(self, config): self.processors = [] - for processor_config in config.get("processors"): + mod = importlib.import_module(__name__) + for processor_config in config.get("ops"): name = list(processor_config)[0] param = {} if processor_config[name] is None else processor_config[ name] - op = eval(name)(**param) + op = getattr(mod, name)(**param) self.processors.append(op) def process(self, input_data): @@ -39,13 +27,13 @@ class ImageProcessor(object): input_data = processor.process(input_data) else: image = processor(image) + input_data["image"] = image return input_data class GetShapeInfo(BaseProcessor): - def __init__(self, order="hwc"): - super().__init__() - self.order = order + def __init__(self, configs): + self.order = configs.get("order") def process(self, input_data): input_image = input_data["input_image"] @@ -69,43 +57,22 @@ class GetShapeInfo(BaseProcessor): ], dtype=np.float32) input_data['input_shape'] = np.array(image.shape[:2], dtype=np.float32) - print(image.shape[0]) return input_data -# class ToTensor(BaseProcessor): -# def __init__(self): -# super().__init__() - -# def process(self, input_data): -# image = input_data["image"] -# input_data["input_tensor"] = paddle.to_tensor(image) -# return input_data - - -class ToBatch(BaseProcessor): - def __init__(self): - super().__init__() - - def process(self, input_data): - image = input_data["image"] - input_data["image"] = image[np.newaxis, :, :, :] - return input_data +class ToBatch: + def __call__(self, img): + img = img[np.newaxis, :, :, :] + return img class ToRGB: - def __init__(self): - pass - def __call__(self, img): img = img[:, :, ::-1] return img class ToCHWImage: - def __init__(self): - pass - def __call__(self, img, img_info=None): img = img.transpose((2, 0, 1)) return img diff --git a/deploy/python/ppshitu_v2/processor/base_processor.py b/deploy/python/ppshitu_v2/processor/base_processor.py new file mode 100644 index 0000000000000000000000000000000000000000..50e4c8a2aba963b8fdb0a2cad2c54d4551b0b36e --- /dev/null +++ b/deploy/python/ppshitu_v2/processor/base_processor.py @@ -0,0 +1,11 @@ +from abc import ABC, abstractmethod + + +class BaseProcessor(ABC): + @abstractmethod + def __init__(self, config): + pass + + @abstractmethod + def process(self, input_data): + pass