未验证 提交 9f5454b7 编写于 作者: jm_12138's avatar jm_12138 提交者: GitHub

update pp-tinypose (#2188)

上级 497e3cea
...@@ -125,6 +125,9 @@ ...@@ -125,6 +125,9 @@
r = requests.post(url=url, headers=headers, data=json.dumps(data)) r = requests.post(url=url, headers=headers, data=json.dumps(data))
``` ```
- ### Gradio APP 支持
从 PaddleHub 2.3.1 开始支持使用链接 http://127.0.0.1:8866/gradio/pp-tinypose 在浏览器中访问 pp-tinypose 的 Gradio APP。
## 五、更新历史 ## 五、更新历史
* 1.0.0 * 1.0.0
...@@ -135,6 +138,10 @@ ...@@ -135,6 +138,10 @@
修复使用 ndarray 输入时无法保存可视化图片的问题 修复使用 ndarray 输入时无法保存可视化图片的问题
* 1.2.0
添加 Gradio APP 支持
- ```shell - ```shell
$ hub install pp-tinypose==1.1.0 $ hub install pp-tinypose==1.2.0
``` ```
...@@ -23,6 +23,9 @@ import yaml ...@@ -23,6 +23,9 @@ import yaml
from paddle.inference import Config from paddle.inference import Config
from paddle.inference import create_predictor from paddle.inference import create_predictor
from .keypoint_preprocess import EvalAffine
from .keypoint_preprocess import expand_crop
from .keypoint_preprocess import TopDownEvalAffine
from .preprocess import decode_image from .preprocess import decode_image
from .preprocess import LetterBoxResize from .preprocess import LetterBoxResize
from .preprocess import NormalizeImage from .preprocess import NormalizeImage
...@@ -32,9 +35,6 @@ from .preprocess import Permute ...@@ -32,9 +35,6 @@ from .preprocess import Permute
from .preprocess import preprocess from .preprocess import preprocess
from .preprocess import Resize from .preprocess import Resize
from .preprocess import WarpAffine 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 from .visualize import visualize_box
# Global dictionary # Global dictionary
......
...@@ -18,10 +18,10 @@ import cv2 ...@@ -18,10 +18,10 @@ import cv2
import numpy as np import numpy as np
import yaml import yaml
from .keypoint_preprocess import expand_crop from .infer import Detector
from .keypoint_postprocess import HRNetPostProcess from .keypoint_postprocess import HRNetPostProcess
from .keypoint_preprocess import expand_crop
from .visualize import visualize_pose from .visualize import visualize_pose
from .infer import Detector
# Global dictionary # Global dictionary
KEYPOINT_SUPPORT_MODELS = {'HigherHRNet': 'keypoint_bottomup', 'HRNet': 'keypoint_topdown'} KEYPOINT_SUPPORT_MODELS = {'HigherHRNet': 'keypoint_bottomup', 'HRNet': 'keypoint_topdown'}
......
...@@ -26,7 +26,6 @@ from .keypoint_infer import KeyPointDetector ...@@ -26,7 +26,6 @@ from .keypoint_infer import KeyPointDetector
from .preprocess import base64_to_cv2 from .preprocess import base64_to_cv2
from .preprocess import decode_image from .preprocess import decode_image
from .visualize import visualize_pose from .visualize import visualize_pose
from paddlehub.module.module import moduleinfo from paddlehub.module.module import moduleinfo
from paddlehub.module.module import runnable from paddlehub.module.module import runnable
from paddlehub.module.module import serving from paddlehub.module.module import serving
...@@ -38,7 +37,7 @@ from paddlehub.module.module import serving ...@@ -38,7 +37,7 @@ from paddlehub.module.module import serving
author="paddlepaddle", author="paddlepaddle",
author_email="", author_email="",
summary="PP-TinyPose is a real-time keypoint detection model optimized by PaddleDetecion for mobile devices.", summary="PP-TinyPose is a real-time keypoint detection model optimized by PaddleDetecion for mobile devices.",
version="1.1.0") version="1.2.0")
class PP_TinyPose: class PP_TinyPose:
""" """
PP-TinyPose Model. PP-TinyPose Model.
...@@ -136,3 +135,21 @@ class PP_TinyPose: ...@@ -136,3 +135,21 @@ class PP_TinyPose:
Add the command input options. Add the command input options.
""" """
self.arg_input_group.add_argument('--input_path', type=str, help="path to image.") self.arg_input_group.add_argument('--input_path', type=str, help="path to image.")
def create_gradio_app(self):
import gradio as gr
import tempfile
import os
from PIL import Image
def inference(image, use_gpu=False):
with tempfile.TemporaryDirectory() as temp_dir:
self.predict(img=image, use_gpu=use_gpu, visualization=True, save_path=temp_dir)
return Image.open(os.path.join(temp_dir, os.listdir(temp_dir)[0]))
interface = gr.Interface(
inference,
[gr.inputs.Image(type="filepath"), gr.Checkbox(label='use_gpu')],
gr.outputs.Image(type="ndarray"),
title='pp-tinypose')
return interface
...@@ -4,13 +4,14 @@ import unittest ...@@ -4,13 +4,14 @@ import unittest
import cv2 import cv2
import requests import requests
import paddlehub as hub
import paddlehub as hub
os.environ['CUDA_VISIBLE_DEVICES'] = '0' os.environ['CUDA_VISIBLE_DEVICES'] = '0'
class TestHubModule(unittest.TestCase): class TestHubModule(unittest.TestCase):
@classmethod @classmethod
def setUpClass(cls) -> None: def setUpClass(cls) -> None:
img_url = 'https://ai-studio-static-online.cdn.bcebos.com/7799a8ccc5f6471b9d56fb6eff94f82a08b70ca2c7594d3f99877e366c0a2619' img_url = 'https://ai-studio-static-online.cdn.bcebos.com/7799a8ccc5f6471b9d56fb6eff94f82a08b70ca2c7594d3f99877e366c0a2619'
...@@ -28,42 +29,26 @@ class TestHubModule(unittest.TestCase): ...@@ -28,42 +29,26 @@ class TestHubModule(unittest.TestCase):
shutil.rmtree('pp_tinypose_output') shutil.rmtree('pp_tinypose_output')
def test_predict1(self): def test_predict1(self):
results = self.module.predict( results = self.module.predict(img='tests/test.jpg', visualization=False)
img='tests/test.jpg',
visualization=False
)
kps = results[0][1] kps = results[0][1]
self.assertIsInstance(kps, list) self.assertIsInstance(kps, list)
def test_predict2(self): def test_predict2(self):
results = self.module.predict( results = self.module.predict(img=cv2.imread('tests/test.jpg'), visualization=False)
img=cv2.imread('tests/test.jpg'),
visualization=False
)
kps = results[0][1] kps = results[0][1]
self.assertIsInstance(kps, list) self.assertIsInstance(kps, list)
def test_predict3(self): def test_predict3(self):
results = self.module.predict( results = self.module.predict(img=cv2.imread('tests/test.jpg'), visualization=True)
img=cv2.imread('tests/test.jpg'),
visualization=True
)
kps = results[0][1] kps = results[0][1]
self.assertIsInstance(kps, list) self.assertIsInstance(kps, list)
def test_predict4(self): def test_predict4(self):
self.assertRaises( self.assertRaises(FileNotFoundError, self.module.predict, img='no.jpg')
FileNotFoundError,
self.module.predict,
img='no.jpg'
)
def test_predict5(self): def test_predict5(self):
self.assertRaises( self.assertRaises(TypeError, self.module.predict, img=['test.jpg'])
cv2.error,
self.module.predict,
img=['test.jpg']
)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()
\ No newline at end of file
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
# limitations under the License. # limitations under the License.
from __future__ import division from __future__ import division
import os
import math import math
import os
import cv2 import cv2
import numpy as np import numpy as np
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册