From 8fa8d471af43f62c60ea13c2ae1274390e34768b Mon Sep 17 00:00:00 2001 From: WJJ1995 Date: Tue, 28 Sep 2021 05:59:09 +0800 Subject: [PATCH] Merge pull request #20290 from wjj19950828:add_paddle_humanseg_demo Add paddle humanseg demo * fixed onnx resize op bug * add humanseg demo for PaddlePaddle sample * update README.md and flake8 format * update func name * update README.md for enviroment setup * update README.md in the way install paddle2onnx * update README.md * update README.md * add paddleseg in requirements.txt * deal with comments * replace picture --- .../dnn_conversion/paddlepaddle/README.md | 69 +++++++++++-- .../paddlepaddle/data/result_test_human.jpg | Bin 0 -> 62199 bytes .../dnn_conversion/paddlepaddle/paddle_humanseg.py | 112 +++++++++++++++++++++ .../dnn_conversion/paddlepaddle/paddle_resnet50.py | 18 ++-- .../dnn_conversion/requirements.txt | 1 + 5 files changed, 183 insertions(+), 17 deletions(-) create mode 100644 samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/data/result_test_human.jpg create mode 100644 samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_humanseg.py diff --git a/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md b/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md index 7aba491..1b1a287 100644 --- a/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md +++ b/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md @@ -1,6 +1,6 @@ -# Run PaddlePaddle model by OpenCV +# Run PaddlePaddle model using OpenCV -This tutorial shows how to run PaddlePaddle model by opencv. +These two demonstrations show how to inference PaddlePaddle model using OpenCV. ## Environment Setup @@ -10,16 +10,69 @@ pip install paddlehub pip install paddle2onnx ``` -## Run PaddlePaddle model demo +## 1. Run PaddlePaddle ResNet50 using OpenCV -Run the example code as below, +### Run PaddlePaddle model demo + +Run the code sample as follows: ```shell python paddle_resnet50.py ``` -there are 3 part of this execution +There are three parts to the process: + +1. Export PaddlePaddle ResNet50 model to onnx format. +2. Use `cv2.dnn.readNetFromONNX` to load the model file. +3. Preprocess image file and do the inference. + +## 2. Run PaddleSeg Portrait Segmentation using OpenCV + +### Convert to ONNX Model + +#### 1. Get Paddle Inference model + +For more details, please refer to [PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.1/contrib/HumanSeg/README.md). + +```shell +wget https://x2paddle.bj.bcebos.com/inference/models/humanseg_hrnet18_small_v1.zip +unzip humanseg_hrnet18_small_v1.zip +``` + +Notes: + +* The exported model must have a fixed input shape, as dynamic is not supported at this moment. + +#### 2. Convert to ONNX model using paddle2onnx + +To convert the model, use the following command: + +``` +paddle2onnx --model_dir humanseg_hrnet18_small_v1 \ + --model_filename model.pdmodel \ + --params_filename model.pdiparams \ + --opset_version 11 \ + --save_file humanseg_hrnet18_tiny.onnx +``` + +The converted model can be found in the current directory by the name `humanseg_hrnet18_tiny.onnx` . + +### Run PaddleSeg Portrait Segmentation demo + +Run the code sample as follows: + +```shell +python paddle_humanseg.py +``` + +There are three parts to the process: + +1. Use `cv2.dnn.readNetFromONNX` to load the model file. +2. Preprocess image file and do inference. +3. Postprocess image file and visualize. + +The resulting file can be found at `data/result_test_human.jpg` . + +### Portrait segmentation visualization -- 1. Export PaddlePaddle ResNet50 model to onnx format; -- 2. Use `cv2.dnn.readNetFromONNX` load model file; -- 3. Preprocess image file and do inference. + diff --git a/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/data/result_test_human.jpg b/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/data/result_test_human.jpg new file mode 100644 index 0000000000000000000000000000000000000000..652b03f3b464ab432133061e780e7519c90c4ff7 GIT binary patch literal 62199 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

+*(@=Z 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 WC>&sJ&Iho-=cN=;TP=#Rx&PTnl3ZZ` literal 0 HcmV?d00001 diff --git a/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_humanseg.py b/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_humanseg.py new file mode 100644 index 0000000..e2ef62e --- /dev/null +++ b/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_humanseg.py @@ -0,0 +1,112 @@ +import os +import paddlehub.vision.transforms as T +import numpy as np +import cv2 as cv + + +def get_color_map_list(num_classes): + """ + Returns the color map for visualizing the segmentation mask, + which can support arbitrary number of classes. + + Args: + num_classes (int): Number of classes. + + Returns: + (list). The color map. + """ + + num_classes += 1 + color_map = num_classes * [0, 0, 0] + for i in range(0, num_classes): + j = 0 + lab = i + while lab: + color_map[i * 3] |= (((lab >> 0) & 1) << (7 - j)) + color_map[i * 3 + 1] |= (((lab >> 1) & 1) << (7 - j)) + color_map[i * 3 + 2] |= (((lab >> 2) & 1) << (7 - j)) + j += 1 + lab >>= 3 + color_map = color_map[3:] + return color_map + + +def visualize(image, result, save_dir=None, weight=0.6): + """ + Convert predict result to color image, and save added image. + + Args: + image (str): The path of origin image. + result (np.ndarray): The predict result of image. + save_dir (str): The directory for saving visual image. Default: None. + weight (float): The image weight of visual image, and the result weight is (1 - weight). Default: 0.6 + + Returns: + vis_result (np.ndarray): If `save_dir` is None, return the visualized result. + """ + + color_map = get_color_map_list(256) + color_map = [color_map[i:i + 3] for i in range(0, len(color_map), 3)] + color_map = np.array(color_map).astype("uint8") + # Use OpenCV LUT for color mapping + c1 = cv.LUT(result, color_map[:, 0]) + c2 = cv.LUT(result, color_map[:, 1]) + c3 = cv.LUT(result, color_map[:, 2]) + pseudo_img = np.dstack((c1, c2, c3)) + + im = cv.imread(image) + vis_result = cv.addWeighted(im, weight, pseudo_img, 1 - weight, 0) + + if save_dir is not None: + if not os.path.exists(save_dir): + os.makedirs(save_dir) + image_name = os.path.split(image)[-1] + out_path = os.path.join(save_dir, image_name) + cv.imwrite(out_path, vis_result) + else: + return vis_result + + +def preprocess(image_path): + ''' preprocess input image file to np.ndarray + + Args: + image_path(str): Path of input image file + + Returns: + ProcessedImage(numpy.ndarray): A numpy.ndarray + variable which shape is (1, 3, 192, 192) + ''' + transforms = T.Compose([ + T.Resize((192, 192)), + T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) + ], + to_rgb=True) + return np.expand_dims(transforms(image_path), axis=0) + + +if __name__ == '__main__': + img_path = "../../../../data/messi5.jpg" + # load PPSeg Model use cv.dnn + net = cv.dnn.readNetFromONNX('humanseg_hrnet18_tiny.onnx') + # read and preprocess image file + im = preprocess(img_path) + # inference + net.setInput(im) + result = net.forward(['save_infer_model/scale_0.tmp_1']) + # post process + image = cv.imread(img_path) + r, c, _ = image.shape + result = np.argmax(result[0], axis=1).astype(np.uint8) + result = cv.resize(result[0, :, :], + dsize=(c, r), + interpolation=cv.INTER_NEAREST) + + print("grid_image.shape is: ", result.shape) + folder_path = "data" + if not os.path.exists(folder_path): + os.makedirs(folder_path) + file_path = os.path.join(folder_path, '%s.jpg' % "result_test_human") + result_color = visualize(img_path, result) + cv.imwrite(file_path, result_color) + print('%s saved' % file_path) diff --git a/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_resnet50.py b/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_resnet50.py index b95ce91..90c0d26 100644 --- a/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_resnet50.py +++ b/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_resnet50.py @@ -16,15 +16,15 @@ def preprocess(image_path): variable which shape is (1, 3, 224, 224) ''' transforms = T.Compose([ - T.Resize((256, 256)), - T.CenterCrop(224), - T.Normalize(mean=[0.485, 0.456, 0.406], - std=[0.229, 0.224, 0.225])], - to_rgb=True) + T.Resize((256, 256)), + T.CenterCrop(224), + T.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225])], + to_rgb=True) return np.expand_dims(transforms(image_path), axis=0) -def export_onnx_mobilenetv2(save_path): +def export_onnx_resnet50(save_path): ''' export PaddlePaddle model to ONNX format Args: @@ -35,7 +35,7 @@ def export_onnx_mobilenetv2(save_path): ''' model = hub.Module(name="resnet50_vd_imagenet_ssld") input_spec = paddle.static.InputSpec( - [1, 3, 224, 224], "float32", "image") + [1, 3, 224, 224], "float32", "image") paddle.onnx.export(model, save_path, input_spec=[input_spec], opset_version=10) @@ -45,9 +45,9 @@ if __name__ == '__main__': save_path = './resnet50' image_file = './data/cat.jpg' labels = open('./data/labels.txt').read().strip().split('\n') - model = export_onnx_mobilenetv2(save_path) + model = export_onnx_resnet50(save_path) - # load mobilenetv2 use cv.dnn + # load resnet50 use cv.dnn net = cv.dnn.readNetFromONNX(save_path + '.onnx') # read and preprocess image file im = preprocess(image_file) diff --git a/samples/dnn/dnn_model_runner/dnn_conversion/requirements.txt b/samples/dnn/dnn_model_runner/dnn_conversion/requirements.txt index eb217e2..6887c2a 100644 --- a/samples/dnn/dnn_model_runner/dnn_conversion/requirements.txt +++ b/samples/dnn/dnn_model_runner/dnn_conversion/requirements.txt @@ -12,3 +12,4 @@ paddlepaddle>=2.0.0 paddlepaddle-gpu>=2.0.0 paddlehub>=2.1.0 paddle2onnx>=0.5.1 +paddleseg>=2.0.0 \ No newline at end of file -- 2.7.4