diff --git a/modules/image/face_detection/pyramidbox_lite_mobile_mask/README.md b/modules/image/face_detection/pyramidbox_lite_mobile_mask/README.md index 1e73457e3b2809a03f988a51b53ba534b7830aa7..d8ab6a9b9068b0375328a989296490ddbd468011 100644 --- a/modules/image/face_detection/pyramidbox_lite_mobile_mask/README.md +++ b/modules/image/face_detection/pyramidbox_lite_mobile_mask/README.md @@ -179,6 +179,11 @@ # 打印预测结果 print(r.json()["results"]) ``` + +- ### gradio app 支持 + + 从 PaddleHub 2.3.1 开始支持使用链接 http://127.0.0.1:8866/gradio/pyramidbox_lite_mobile_mask 在浏览器中访问 pyramidbox_lite_mobile_mask 的 Gradio APP。 + ## 五、Paddle Lite部署 - ### 通过python执行以下代码,保存模型 - ```python @@ -209,6 +214,10 @@ 修复无法导出模型的问题 +* 1.5.0 + + 添加 Gradio APP 的支持 + - ```shell - $ hub install pyramidbox_lite_mobile_mask==1.4.0 + $ hub install pyramidbox_lite_mobile_mask==1.5.0 ``` diff --git a/modules/image/face_detection/pyramidbox_lite_mobile_mask/README_en.md b/modules/image/face_detection/pyramidbox_lite_mobile_mask/README_en.md index abe053f18b240f1b2f109c4cd99ea73cf34793e8..c6c25127c5d15db8d38fa0afd25c4302284996c7 100644 --- a/modules/image/face_detection/pyramidbox_lite_mobile_mask/README_en.md +++ b/modules/image/face_detection/pyramidbox_lite_mobile_mask/README_en.md @@ -154,6 +154,10 @@ # print prediction results print(r.json()["results"]) ``` + +- ### Gradio APP support + Starting with PaddleHub 2.3.1, the Gradio APP for pyramidbox_lite_mobile_mask is supported to be accessed in the browser using the link http://127.0.0.1:8866/gradio/pyramidbox_lite_mobile_mask. + ## V.Paddle Lite Deployment - ### Save model demo - ```python @@ -185,6 +189,10 @@ Fix a bug of save_inference_model +* 1.5.0 + + Add Gradio APP support. + - ```shell - $ hub install pyramidbox_lite_mobile_mask==1.4.0 + $ hub install pyramidbox_lite_mobile_mask==1.5.0 ``` diff --git a/modules/image/face_detection/pyramidbox_lite_mobile_mask/data_feed.py b/modules/image/face_detection/pyramidbox_lite_mobile_mask/data_feed.py index 608eb0d7d8bea89e3a41f785ddefe519ce538af6..8224947820b9aea9ae31ff71bb84302042b1e706 100644 --- a/modules/image/face_detection/pyramidbox_lite_mobile_mask/data_feed.py +++ b/modules/image/face_detection/pyramidbox_lite_mobile_mask/data_feed.py @@ -1,6 +1,6 @@ # coding=utf-8 -import os import math +import os import time from collections import OrderedDict @@ -144,12 +144,11 @@ def reader(face_detector, shrink, confs_threshold, images, paths, use_gpu, use_m scale_res = list() detect_faces = list() for scale in multi_scales: - _detect_res = face_detector.face_detection( - images=[element['org_im']], - use_gpu=use_gpu, - visualization=False, - shrink=scale, - confs_threshold=confs_threshold) + _detect_res = face_detector.face_detection(images=[element['org_im']], + use_gpu=use_gpu, + visualization=False, + shrink=scale, + confs_threshold=confs_threshold) _s = list() for _face in _detect_res[0]['data']: @@ -167,12 +166,11 @@ def reader(face_detector, shrink, confs_threshold, images, paths, use_gpu, use_m face = {'left': data[0], 'top': data[1], 'right': data[2], 'bottom': data[3], 'confidence': data[4]} detect_faces.append(face) else: - _detect_res = face_detector.face_detection( - images=[element['org_im']], - use_gpu=use_gpu, - visualization=False, - shrink=shrink, - confs_threshold=confs_threshold) + _detect_res = face_detector.face_detection(images=[element['org_im']], + use_gpu=use_gpu, + visualization=False, + shrink=shrink, + confs_threshold=confs_threshold) detect_faces = _detect_res[0]['data'] element['preprocessed'] = list() diff --git a/modules/image/face_detection/pyramidbox_lite_mobile_mask/module.py b/modules/image/face_detection/pyramidbox_lite_mobile_mask/module.py index f548ac00bbff17137d34948543245ebd591ae952..dfc536833074e1bf2cf2dd77d386cd5d805c2053 100644 --- a/modules/image/face_detection/pyramidbox_lite_mobile_mask/module.py +++ b/modules/image/face_detection/pyramidbox_lite_mobile_mask/module.py @@ -7,14 +7,13 @@ import ast import os import numpy as np -import paddle from paddle.inference import Config from paddle.inference import create_predictor + +import paddlehub as hub from .data_feed import reader from .processor import base64_to_cv2 from .processor import postprocess - -import paddlehub as hub from paddlehub.module.module import moduleinfo from paddlehub.module.module import runnable from paddlehub.module.module import serving @@ -27,8 +26,9 @@ from paddlehub.module.module import serving author_email="", summary= "Pyramidbox-Lite-Mobile-Mask is a high-performance face detection model used to detect whether people wear masks.", - version="1.4.0") + version="1.5.0") class PyramidBoxLiteMobileMask: + def __init__(self, face_detector_module=None): """ Args: @@ -46,8 +46,8 @@ class PyramidBoxLiteMobileMask: """ predictor config setting """ - model = self.default_pretrained_model_path+'.pdmodel' - params = self.default_pretrained_model_path+'.pdiparams' + model = self.default_pretrained_model_path + '.pdmodel' + params = self.default_pretrained_model_path + '.pdiparams' cpu_config = Config(model, params) cpu_config.disable_glog_info() cpu_config.disable_gpu() @@ -244,3 +244,28 @@ class PyramidBoxLiteMobileMask: type=ast.literal_eval, default=0.6, help="confidence threshold.") + + def create_gradio_app(self): + import gradio as gr + import tempfile + import os + from PIL import Image + + def inference(image, shrink, confs_threshold): + with tempfile.TemporaryDirectory() as temp_dir: + self.face_detection(paths=[image], + use_gpu=False, + visualization=True, + output_dir=temp_dir, + shrink=shrink, + confs_threshold=confs_threshold) + return Image.open(os.path.join(temp_dir, os.listdir(temp_dir)[0])) + + interface = gr.Interface(inference, [ + gr.inputs.Image(type="filepath"), + gr.Slider(0.0, 1.0, 0.5, step=0.01), + gr.Slider(0.0, 1.0, 0.6, step=0.01) + ], + gr.outputs.Image(type="ndarray"), + title='pyramidbox_lite_mobile_mask') + return interface diff --git a/modules/image/face_detection/pyramidbox_lite_mobile_mask/processor.py b/modules/image/face_detection/pyramidbox_lite_mobile_mask/processor.py index 8605749a901d49a1e63bbbd671c1ea66ec920374..45e72ce179f630507eee7ce89b334281d841f97b 100644 --- a/modules/image/face_detection/pyramidbox_lite_mobile_mask/processor.py +++ b/modules/image/face_detection/pyramidbox_lite_mobile_mask/processor.py @@ -3,13 +3,14 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +import base64 import os import time -import base64 import cv2 import numpy as np -from PIL import Image, ImageDraw +from PIL import Image +from PIL import ImageDraw __all__ = ['base64_to_cv2', 'postprocess'] @@ -86,9 +87,9 @@ def draw_bounding_box_on_image(save_im_path, output_data): box_fill = (255) text_fill = (0) - draw.rectangle( - xy=(bbox['left'], bbox['top'] - (textsize_height + 5), bbox['left'] + textsize_width + 10, bbox['top'] - 3), - fill=box_fill) + draw.rectangle(xy=(bbox['left'], bbox['top'] - (textsize_height + 5), bbox['left'] + textsize_width + 10, + bbox['top'] - 3), + fill=box_fill) draw.text(xy=(bbox['left'], bbox['top'] - 15), text=text, fill=text_fill) image.save(save_im_path) diff --git a/modules/image/face_detection/pyramidbox_lite_mobile_mask/test.py b/modules/image/face_detection/pyramidbox_lite_mobile_mask/test.py index 776a2ccf78dcaae9d9903a8184d23d5edd23a673..0bfbf0d63a741b96c8ee856240b5a6f0772136b3 100644 --- a/modules/image/face_detection/pyramidbox_lite_mobile_mask/test.py +++ b/modules/image/face_detection/pyramidbox_lite_mobile_mask/test.py @@ -4,13 +4,14 @@ import unittest import cv2 import requests -import paddlehub as hub +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' @@ -29,11 +30,7 @@ class TestHubModule(unittest.TestCase): shutil.rmtree('detection_result') def test_face_detection1(self): - results = self.module.face_detection( - paths=['tests/test.jpg'], - use_gpu=False, - visualization=False - ) + results = self.module.face_detection(paths=['tests/test.jpg'], use_gpu=False, visualization=False) bbox = results[0]['data'][0] label = bbox['label'] @@ -42,7 +39,7 @@ class TestHubModule(unittest.TestCase): right = bbox['right'] top = bbox['top'] bottom = bbox['bottom'] - + self.assertEqual(label, 'NO MASK') self.assertTrue(confidence > 0.5) self.assertTrue(1000 < left < 4000) @@ -51,11 +48,7 @@ class TestHubModule(unittest.TestCase): self.assertTrue(0 < bottom < 2000) def test_face_detection2(self): - results = self.module.face_detection( - images=[cv2.imread('tests/test.jpg')], - use_gpu=False, - visualization=False - ) + results = self.module.face_detection(images=[cv2.imread('tests/test.jpg')], use_gpu=False, visualization=False) bbox = results[0]['data'][0] label = bbox['label'] @@ -64,7 +57,7 @@ class TestHubModule(unittest.TestCase): right = bbox['right'] top = bbox['top'] bottom = bbox['bottom'] - + self.assertEqual(label, 'NO MASK') self.assertTrue(confidence > 0.5) self.assertTrue(1000 < left < 4000) @@ -73,11 +66,7 @@ class TestHubModule(unittest.TestCase): self.assertTrue(0 < bottom < 2000) def test_face_detection3(self): - results = self.module.face_detection( - images=[cv2.imread('tests/test.jpg')], - use_gpu=False, - visualization=True - ) + results = self.module.face_detection(images=[cv2.imread('tests/test.jpg')], use_gpu=False, visualization=True) bbox = results[0]['data'][0] label = bbox['label'] @@ -86,7 +75,7 @@ class TestHubModule(unittest.TestCase): right = bbox['right'] top = bbox['top'] bottom = bbox['bottom'] - + self.assertEqual(label, 'NO MASK') self.assertTrue(confidence > 0.5) self.assertTrue(1000 < left < 4000) @@ -95,11 +84,7 @@ class TestHubModule(unittest.TestCase): self.assertTrue(0 < bottom < 2000) def test_face_detection4(self): - results = self.module.face_detection( - images=[cv2.imread('tests/test.jpg')], - use_gpu=True, - visualization=False - ) + results = self.module.face_detection(images=[cv2.imread('tests/test.jpg')], use_gpu=True, visualization=False) bbox = results[0]['data'][0] label = bbox['label'] @@ -108,7 +93,7 @@ class TestHubModule(unittest.TestCase): right = bbox['right'] top = bbox['top'] bottom = bbox['bottom'] - + self.assertEqual(label, 'NO MASK') self.assertTrue(confidence > 0.5) self.assertTrue(1000 < left < 4000) @@ -117,18 +102,10 @@ class TestHubModule(unittest.TestCase): self.assertTrue(0 < bottom < 2000) def test_face_detection5(self): - self.assertRaises( - AssertionError, - self.module.face_detection, - paths=['no.jpg'] - ) + self.assertRaises(AssertionError, self.module.face_detection, paths=['no.jpg']) def test_face_detection6(self): - self.assertRaises( - AttributeError, - self.module.face_detection, - images=['test.jpg'] - ) + self.assertRaises(AttributeError, self.module.face_detection, images=['test.jpg']) def test_save_inference_model(self): self.module.save_inference_model('./inference/model')