diff --git a/modules/image/keypoint_detection/pp-tinypose/README.md b/modules/image/keypoint_detection/pp-tinypose/README.md index 8b904cbce95787e88cc504723f83f55da92b1cc5..c817a4c48361ed5c2bfa394385d8f174bd753188 100644 --- a/modules/image/keypoint_detection/pp-tinypose/README.md +++ b/modules/image/keypoint_detection/pp-tinypose/README.md @@ -59,7 +59,7 @@ ``` - 通过命令行方式实现关键点检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst) -- ### 2、代码示例 +- ### 2、预测代码示例 - ```python import paddlehub as hub @@ -131,6 +131,10 @@ 初始发布 +* 1.1.0 + + 修复使用 ndarray 输入时无法保存可视化图片的问题 + - ```shell - $ hub install pp-tinypose==1.0.0 + $ hub install pp-tinypose==1.1.0 ``` diff --git a/modules/image/keypoint_detection/pp-tinypose/__init__.py b/modules/image/keypoint_detection/pp-tinypose/__init__.py index 305c722c9f16257b848351a9a910027de88fac73..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/modules/image/keypoint_detection/pp-tinypose/__init__.py +++ b/modules/image/keypoint_detection/pp-tinypose/__init__.py @@ -1,19 +0,0 @@ -# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. -# -# 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 glob -import os -import sys - -CUR_DIR = os.path.dirname(os.path.abspath(__file__)) -sys.path.append(CUR_DIR) diff --git a/modules/image/keypoint_detection/pp-tinypose/det_keypoint_unite_infer.py b/modules/image/keypoint_detection/pp-tinypose/det_keypoint_unite_infer.py index 7160d86b399ce3570b2204c005f610dda13b8511..c47d05de737731220b0aa21147fbd34fd1eb3707 100644 --- a/modules/image/keypoint_detection/pp-tinypose/det_keypoint_unite_infer.py +++ b/modules/image/keypoint_detection/pp-tinypose/det_keypoint_unite_infer.py @@ -11,21 +11,9 @@ # 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 json -import math -import os - -import cv2 import numpy as np -import paddle -import yaml -from infer import Detector -from infer import PredictConfig -from keypoint_infer import KeyPointDetector -from keypoint_infer import PredictConfig_KeyPoint -from keypoint_postprocess import translate_to_ori_images -from preprocess import decode_image -from visualize import visualize_pose + +from .keypoint_postprocess import translate_to_ori_images KEYPOINT_SUPPORT_MODELS = {'HigherHRNet': 'keypoint_bottomup', 'HRNet': 'keypoint_topdown'} diff --git a/modules/image/keypoint_detection/pp-tinypose/infer.py b/modules/image/keypoint_detection/pp-tinypose/infer.py index d9b838ba5ae0ee46bd5c009c65c8a945ce1ce0af..0c93e93b5ede83bba67acfd929bbf05cda895281 100644 --- a/modules/image/keypoint_detection/pp-tinypose/infer.py +++ b/modules/image/keypoint_detection/pp-tinypose/infer.py @@ -15,29 +15,27 @@ import glob import json import math import os -import sys -from functools import reduce from pathlib import Path import cv2 import numpy as np -import paddle import yaml -from keypoint_preprocess import EvalAffine -from keypoint_preprocess import expand_crop -from keypoint_preprocess import TopDownEvalAffine from paddle.inference import Config from paddle.inference import create_predictor -from preprocess import decode_image -from preprocess import LetterBoxResize -from preprocess import NormalizeImage -from preprocess import Pad -from preprocess import PadStride -from preprocess import Permute -from preprocess import preprocess -from preprocess import Resize -from preprocess import WarpAffine -from visualize import visualize_box + +from .preprocess import decode_image +from .preprocess import LetterBoxResize +from .preprocess import NormalizeImage +from .preprocess import Pad +from .preprocess import PadStride +from .preprocess import Permute +from .preprocess import preprocess +from .preprocess import Resize +from .preprocess import WarpAffine +from .keypoint_preprocess import EvalAffine +from .keypoint_preprocess import expand_crop +from .keypoint_preprocess import TopDownEvalAffine +from .visualize import visualize_box # Global dictionary SUPPORT_MODELS = { diff --git a/modules/image/keypoint_detection/pp-tinypose/keypoint_infer.py b/modules/image/keypoint_detection/pp-tinypose/keypoint_infer.py index 7ce8fb2abc51e8dc3b585a55220c86bb42e32d66..c5ac4d81de81f42f6eb02d57aafe1cc585d6afa0 100644 --- a/modules/image/keypoint_detection/pp-tinypose/keypoint_infer.py +++ b/modules/image/keypoint_detection/pp-tinypose/keypoint_infer.py @@ -11,29 +11,17 @@ # 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 glob import math import os -import sys -import time -from functools import reduce import cv2 import numpy as np -import paddle import yaml -from PIL import Image -# add deploy path of PadleDetection to sys.path -parent_path = os.path.abspath(os.path.join(__file__, *(['..']))) -sys.path.insert(0, parent_path) -from preprocess import preprocess, NormalizeImage, Permute -from keypoint_preprocess import EvalAffine, TopDownEvalAffine, expand_crop -from keypoint_postprocess import HRNetPostProcess -from visualize import visualize_pose -from paddle.inference import Config -from paddle.inference import create_predictor -from infer import Detector +from .keypoint_preprocess import expand_crop +from .keypoint_postprocess import HRNetPostProcess +from .visualize import visualize_pose +from .infer import Detector # Global dictionary KEYPOINT_SUPPORT_MODELS = {'HigherHRNet': 'keypoint_bottomup', 'HRNet': 'keypoint_topdown'} diff --git a/modules/image/keypoint_detection/pp-tinypose/keypoint_postprocess.py b/modules/image/keypoint_detection/pp-tinypose/keypoint_postprocess.py index 64d479f619d52e59b919b5aa8173a7dbd4c49016..b2be481a3892e2a2541f8901ea55d6836f9f5cad 100644 --- a/modules/image/keypoint_detection/pp-tinypose/keypoint_postprocess.py +++ b/modules/image/keypoint_detection/pp-tinypose/keypoint_postprocess.py @@ -12,16 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. import math -from collections import abc -from collections import defaultdict import cv2 import numpy as np -import paddle -import paddle.nn as nn -from keypoint_preprocess import get_affine_mat_kernel -from keypoint_preprocess import get_affine_transform -from scipy.optimize import linear_sum_assignment + +from .keypoint_preprocess import get_affine_transform class HRNetPostProcess(object): diff --git a/modules/image/keypoint_detection/pp-tinypose/module.py b/modules/image/keypoint_detection/pp-tinypose/module.py index c0aa6fd88ec77ab8ccd36c6f8d192a269e9e293f..15a79ab3d884383aad9a3abc8a4d7f255014155b 100644 --- a/modules/image/keypoint_detection/pp-tinypose/module.py +++ b/modules/image/keypoint_detection/pp-tinypose/module.py @@ -13,21 +13,19 @@ # limitations under the License. import argparse import json -import math import os import time from typing import Union import cv2 import numpy as np -import paddle -import yaml -from det_keypoint_unite_infer import predict_with_given_det -from infer import Detector -from keypoint_infer import KeyPointDetector -from preprocess import base64_to_cv2 -from preprocess import decode_image -from visualize import visualize_pose + +from .det_keypoint_unite_infer import predict_with_given_det +from .infer import Detector +from .keypoint_infer import KeyPointDetector +from .preprocess import base64_to_cv2 +from .preprocess import decode_image +from .visualize import visualize_pose from paddlehub.module.module import moduleinfo from paddlehub.module.module import runnable @@ -40,7 +38,7 @@ from paddlehub.module.module import serving author="paddlepaddle", author_email="", summary="PP-TinyPose is a real-time keypoint detection model optimized by PaddleDetecion for mobile devices.", - version="1.0.0") + version="1.1.0") class PP_TinyPose: """ PP-TinyPose Model. @@ -74,12 +72,14 @@ class PP_TinyPose: results = self.detector.filter_box(results, 0.5) if results['boxes_num'] > 0: keypoint_res = predict_with_given_det(image, results, self.topdown_keypoint_detector, 1, False) - save_name = img if isinstance(img, str) else (str(time.time()) + '.png') + save_name = img if isinstance(img, str) else os.path.join(save_path, (str(time.time()) + '.png')) store_res.append( [save_name, keypoint_res['bbox'], [keypoint_res['keypoint'][0], keypoint_res['keypoint'][1]]]) if not os.path.exists(save_path): os.makedirs(save_path) if self.visualization: + if isinstance(img, np.ndarray): + cv2.imwrite(save_name, img) visualize_pose(save_name, keypoint_res, visual_thresh=0.5, save_dir=save_path) return store_res diff --git a/modules/image/keypoint_detection/pp-tinypose/preprocess.py b/modules/image/keypoint_detection/pp-tinypose/preprocess.py index a0d44c45d55d9161862285d5d45a0d4d993402dd..addaa256737f94ac1e898e177c47e8d977c0e097 100644 --- a/modules/image/keypoint_detection/pp-tinypose/preprocess.py +++ b/modules/image/keypoint_detection/pp-tinypose/preprocess.py @@ -15,7 +15,8 @@ import base64 import cv2 import numpy as np -from keypoint_preprocess import get_affine_transform + +from .keypoint_preprocess import get_affine_transform def decode_image(im_file, im_info): diff --git a/modules/image/keypoint_detection/pp-tinypose/test.py b/modules/image/keypoint_detection/pp-tinypose/test.py new file mode 100644 index 0000000000000000000000000000000000000000..3d37a328e2d310b26a8a6079f4293d242fd08721 --- /dev/null +++ b/modules/image/keypoint_detection/pp-tinypose/test.py @@ -0,0 +1,69 @@ +import os +import shutil +import unittest + +import cv2 +import requests +import paddlehub as hub + + +os.environ['CUDA_VISIBLE_DEVICES'] = '0' + + +class TestHubModule(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + img_url = 'https://ai-studio-static-online.cdn.bcebos.com/7799a8ccc5f6471b9d56fb6eff94f82a08b70ca2c7594d3f99877e366c0a2619' + if not os.path.exists('tests'): + os.makedirs('tests') + response = requests.get(img_url) + assert response.status_code == 200, 'Network Error.' + with open('tests/test.jpg', 'wb') as f: + f.write(response.content) + cls.module = hub.Module(name="pp-tinypose") + + @classmethod + def tearDownClass(cls) -> None: + shutil.rmtree('tests') + shutil.rmtree('pp_tinypose_output') + + def test_predict1(self): + results = self.module.predict( + img='tests/test.jpg', + visualization=False + ) + kps = results[0][1] + self.assertIsInstance(kps, list) + + def test_predict2(self): + results = self.module.predict( + img=cv2.imread('tests/test.jpg'), + visualization=False + ) + kps = results[0][1] + self.assertIsInstance(kps, list) + + def test_predict3(self): + results = self.module.predict( + img=cv2.imread('tests/test.jpg'), + visualization=True + ) + kps = results[0][1] + self.assertIsInstance(kps, list) + + def test_predict4(self): + self.assertRaises( + FileNotFoundError, + self.module.predict, + img='no.jpg' + ) + + def test_predict5(self): + self.assertRaises( + cv2.error, + self.module.predict, + img=['test.jpg'] + ) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/modules/image/keypoint_detection/pp-tinypose/visualize.py b/modules/image/keypoint_detection/pp-tinypose/visualize.py index 18da3cbf6a4626bb1698484cd7d6cd632e7ad091..27dfcaa6ddc6f75832e488ef3b4edcceea909ae8 100644 --- a/modules/image/keypoint_detection/pp-tinypose/visualize.py +++ b/modules/image/keypoint_detection/pp-tinypose/visualize.py @@ -14,6 +14,7 @@ from __future__ import division import os +import math import cv2 import numpy as np @@ -22,7 +23,6 @@ from PIL import ImageDraw from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True -import math def visualize_box(im, results, labels, threshold=0.5):