From 02d7e5514b0da9a7ebabb004533b274056c954e2 Mon Sep 17 00:00:00 2001 From: jm12138 <2286040843@qq.com> Date: Fri, 14 Oct 2022 14:48:48 +0800 Subject: [PATCH] update stgan_bald (#2022) --- .../image/Image_gan/gan/stgan_bald/README.md | 7 +- .../Image_gan/gan/stgan_bald/README_en.md | 7 +- .../Image_gan/gan/stgan_bald/data_feed.py | 22 +++-- .../image/Image_gan/gan/stgan_bald/module.py | 76 +++++++++------- .../Image_gan/gan/stgan_bald/module/__model__ | Bin 358737 -> 0 bytes .../Image_gan/gan/stgan_bald/processor.py | 15 ++-- .../Image_gan/gan/stgan_bald/requirements.txt | 1 - .../image/Image_gan/gan/stgan_bald/test.py | 85 ++++++++++++++++++ 8 files changed, 163 insertions(+), 50 deletions(-) delete mode 100644 modules/image/Image_gan/gan/stgan_bald/module/__model__ delete mode 100644 modules/image/Image_gan/gan/stgan_bald/requirements.txt create mode 100644 modules/image/Image_gan/gan/stgan_bald/test.py diff --git a/modules/image/Image_gan/gan/stgan_bald/README.md b/modules/image/Image_gan/gan/stgan_bald/README.md index 1d504093..6480f05b 100644 --- a/modules/image/Image_gan/gan/stgan_bald/README.md +++ b/modules/image/Image_gan/gan/stgan_bald/README.md @@ -129,6 +129,11 @@ * 1.0.0 初始发布 + +* 1.1.0 + + 移除 Fluid API + - ```shell - $ hub install stgan_bald==1.0.0 + $ hub install stgan_bald==1.1.0 ``` diff --git a/modules/image/Image_gan/gan/stgan_bald/README_en.md b/modules/image/Image_gan/gan/stgan_bald/README_en.md index 7146b1f5..37503dcf 100644 --- a/modules/image/Image_gan/gan/stgan_bald/README_en.md +++ b/modules/image/Image_gan/gan/stgan_bald/README_en.md @@ -128,6 +128,11 @@ * 1.0.0 First release + +* 1.1.0 + + Remove Fluid API + - ```shell - $ hub install stgan_bald==1.0.0 + $ hub install stgan_bald==1.1.0 ``` diff --git a/modules/image/Image_gan/gan/stgan_bald/data_feed.py b/modules/image/Image_gan/gan/stgan_bald/data_feed.py index 5626f02e..c5d84c9d 100644 --- a/modules/image/Image_gan/gan/stgan_bald/data_feed.py +++ b/modules/image/Image_gan/gan/stgan_bald/data_feed.py @@ -3,10 +3,8 @@ import os import time from collections import OrderedDict -from PIL import Image, ImageOps -import numpy as np -from PIL import Image import cv2 +import numpy as np __all__ = ['reader'] @@ -26,27 +24,33 @@ def reader(images=None, paths=None, org_labels=None, target_labels=None): if paths: for i, im_path in enumerate(paths): each = OrderedDict() - assert os.path.isfile(im_path), "The {} isn't a valid file path.".format(im_path) + assert os.path.isfile( + im_path), "The {} isn't a valid file path.".format(im_path) im = cv2.imread(im_path) each['org_im'] = im each['org_im_path'] = im_path each['org_label'] = np.array(org_labels[i]).astype('float32') if not target_labels: - each['target_label'] = np.array(org_labels[i]).astype('float32') + each['target_label'] = np.array( + org_labels[i]).astype('float32') else: - each['target_label'] = np.array(target_labels[i]).astype('float32') + each['target_label'] = np.array( + target_labels[i]).astype('float32') component.append(each) if images is not None: assert type(images) is list, "images should be a list." for i, im in enumerate(images): each = OrderedDict() each['org_im'] = im - each['org_im_path'] = 'ndarray_time={}'.format(round(time.time(), 6) * 1e6) + each['org_im_path'] = 'ndarray_time={}'.format( + round(time.time(), 6) * 1e6) each['org_label'] = np.array(org_labels[i]).astype('float32') if not target_labels: - each['target_label'] = np.array(org_labels[i]).astype('float32') + each['target_label'] = np.array( + org_labels[i]).astype('float32') else: - each['target_label'] = np.array(target_labels[i]).astype('float32') + each['target_label'] = np.array( + target_labels[i]).astype('float32') component.append(each) for element in component: diff --git a/modules/image/Image_gan/gan/stgan_bald/module.py b/modules/image/Image_gan/gan/stgan_bald/module.py index 5d832857..1a017f6f 100644 --- a/modules/image/Image_gan/gan/stgan_bald/module.py +++ b/modules/image/Image_gan/gan/stgan_bald/module.py @@ -13,17 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -import ast import os -import argparse import copy +import paddle import numpy as np -import paddle.fluid as fluid -import paddlehub as hub -from paddle.fluid.core import PaddleTensor, AnalysisConfig, create_paddle_predictor -from paddlehub.module.module import moduleinfo, runnable, serving -from stgan_bald.data_feed import reader -from stgan_bald.processor import postprocess, base64_to_cv2, cv2_to_base64, check_dir +from paddle.inference import Config, create_predictor +from paddlehub.module.module import moduleinfo, serving +from .data_feed import reader +from .processor import postprocess, base64_to_cv2, cv2_to_base64 def check_attribute_conflict(label_batch): @@ -45,40 +42,43 @@ def check_attribute_conflict(label_batch): @moduleinfo( name="stgan_bald", - version="1.0.0", + version="1.1.0", summary="Baldness generator", author="Arrow, 七年期限,Mr.郑先生_", author_email="1084667371@qq.com,2733821739@qq.com", type="image/gan") -class StganBald(hub.Module): - def _initialize(self): - self.default_pretrained_model_path = os.path.join(self.directory, "module") +class StganBald: + def __init__(self): + self.default_pretrained_model_path = os.path.join( + self.directory, "module", "model") self._set_config() def _set_config(self): """ predictor config setting """ - self.model_file_path = os.path.join(self.default_pretrained_model_path, '__model__') - self.params_file_path = os.path.join(self.default_pretrained_model_path, '__params__') - cpu_config = AnalysisConfig(self.model_file_path, self.params_file_path) + 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() - self.cpu_predictor = create_paddle_predictor(cpu_config) + self.cpu_predictor = create_predictor(cpu_config) try: _places = os.environ["CUDA_VISIBLE_DEVICES"] int(_places[0]) use_gpu = True - self.place = fluid.CUDAPlace(0) + self.place = paddle.CUDAPlace(0) except: use_gpu = False - self.place = fluid.CPUPlace() + self.place = paddle.CPUPlace() + if use_gpu: - gpu_config = AnalysisConfig(self.model_file_path, self.params_file_path) + gpu_config = Config(model, params) gpu_config.disable_glog_info() - gpu_config.enable_use_gpu(memory_pool_init_size_mb=1000, device_id=0) - self.gpu_predictor = create_paddle_predictor(gpu_config) + gpu_config.enable_use_gpu( + memory_pool_init_size_mb=1000, device_id=0) + self.gpu_predictor = create_predictor(gpu_config) def bald(self, images=None, @@ -135,19 +135,29 @@ class StganBald(hub.Module): label_trg_tmp = copy.deepcopy(target_label_np) new_i = 0 label_trg_tmp[0][new_i] = 1.0 - label_trg_tmp[0][new_i] - label_trg_tmp = check_attribute_conflict(label_trg_tmp) + label_trg_tmp = check_attribute_conflict( + label_trg_tmp) change_num = j * 0.02 + 0.3 - label_org_tmp = list(map(lambda x: ((x * 2) - 1) * change_num, org_label_np)) - label_trg_tmp = list(map(lambda x: ((x * 2) - 1) * change_num, label_trg_tmp)) - - image = PaddleTensor(image_np.copy()) - org_label = PaddleTensor(np.array(label_org_tmp).astype('float32')) - target_label = PaddleTensor(np.array(label_trg_tmp).astype('float32')) - - output = self.gpu_predictor.run([ - image, target_label, org_label - ]) if use_gpu else self.cpu_predictor.run([image, org_label, target_label]) - outputs.append(output) + label_org_tmp = list( + map(lambda x: ((x * 2) - 1) * change_num, org_label_np)) + label_trg_tmp = list( + map(lambda x: ((x * 2) - 1) * change_num, label_trg_tmp)) + + predictor = self.gpu_predictor if use_gpu else self.cpu_predictor + input_names = predictor.get_input_names() + input_handle = predictor.get_input_handle(input_names[0]) + input_handle.copy_from_cpu(image_np.copy()) + input_handle = predictor.get_input_handle(input_names[1]) + input_handle.copy_from_cpu( + np.array(label_org_tmp).astype('float32')) + input_handle = predictor.get_input_handle(input_names[2]) + input_handle.copy_from_cpu( + np.array(label_trg_tmp).astype('float32')) + predictor.run() + output_names = predictor.get_output_names() + output_handle = predictor.get_output_handle( + output_names[0]) + outputs.append(output_handle) out = postprocess( data_out=outputs, diff --git a/modules/image/Image_gan/gan/stgan_bald/module/__model__ b/modules/image/Image_gan/gan/stgan_bald/module/__model__ deleted file mode 100644 index 605addef56cab766ff83f7c084eb7f815a777d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358737 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%0A1DVsWjFA9dUjh+M*5O{B&(+g9Uylo1U`i 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 diff --git a/modules/image/Image_gan/gan/stgan_bald/processor.py b/modules/image/Image_gan/gan/stgan_bald/processor.py index 7846df26..782751e7 100644 --- a/modules/image/Image_gan/gan/stgan_bald/processor.py +++ b/modules/image/Image_gan/gan/stgan_bald/processor.py @@ -1,11 +1,10 @@ # -*- coding:utf-8 -*- import os -import time import base64 import cv2 -from PIL import Image import numpy as np +from PIL import Image __all__ = ['cv2_to_base64', 'base64_to_cv2', 'postprocess'] @@ -22,7 +21,12 @@ def base64_to_cv2(b64str): return data -def postprocess(data_out, org_im, org_im_path, output_dir, visualization, thresh=120): +def postprocess(data_out, + org_im, + org_im_path, + output_dir, + visualization, + thresh=120): """ Postprocess output of network. one image at a time. @@ -41,7 +45,7 @@ def postprocess(data_out, org_im, org_im_path, output_dir, visualization, thresh result = dict() for i, img in enumerate(data_out): - img = np.squeeze(img[0].as_ndarray(), 0).transpose((1, 2, 0)) + img = np.squeeze(img.copy_to_cpu(), 0).transpose((1, 2, 0)) img = ((img + 1) * 127.5).astype(np.uint8) img = cv2.resize(img, (256, 341), cv2.INTER_CUBIC) fake_image = Image.fromarray(img) @@ -76,6 +80,7 @@ def get_save_image_name(org_im_path, output_dir, num): # save image path save_im_path = os.path.join(output_dir, im_prefix + ext) if os.path.exists(save_im_path): - save_im_path = os.path.join(output_dir, im_prefix + str(num) + ext) + save_im_path = os.path.join( + output_dir, im_prefix + str(num) + ext) return save_im_path diff --git a/modules/image/Image_gan/gan/stgan_bald/requirements.txt b/modules/image/Image_gan/gan/stgan_bald/requirements.txt deleted file mode 100644 index 00a00fcc..00000000 --- a/modules/image/Image_gan/gan/stgan_bald/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -paddlehub>=1.8.0 diff --git a/modules/image/Image_gan/gan/stgan_bald/test.py b/modules/image/Image_gan/gan/stgan_bald/test.py new file mode 100644 index 00000000..05ca0bac --- /dev/null +++ b/modules/image/Image_gan/gan/stgan_bald/test.py @@ -0,0 +1,85 @@ +import os +import shutil +import unittest + +import cv2 +import requests +import numpy as np +import paddlehub as hub + + +class TestHubModule(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + img_url = 'https://ai-studio-static-online.cdn.bcebos.com/68313e182f5e4ad9907e69dac9ece8fc50840d7ffbd24fa88396f009958f969a' + 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="stgan_bald") + + @classmethod + def tearDownClass(cls) -> None: + shutil.rmtree('tests') + shutil.rmtree('inference') + shutil.rmtree('bald_output') + + def test_bald1(self): + results = self.module.bald( + paths=['tests/test.jpg'] + ) + data_0 = results[0]['data_0'] + data_1 = results[0]['data_1'] + data_2 = results[0]['data_2'] + self.assertIsInstance(data_0, np.ndarray) + self.assertIsInstance(data_1, np.ndarray) + self.assertIsInstance(data_2, np.ndarray) + + def test_bald2(self): + results = self.module.bald( + images=[cv2.imread('tests/test.jpg')] + ) + data_0 = results[0]['data_0'] + data_1 = results[0]['data_1'] + data_2 = results[0]['data_2'] + self.assertIsInstance(data_0, np.ndarray) + self.assertIsInstance(data_1, np.ndarray) + self.assertIsInstance(data_2, np.ndarray) + + def test_bald3(self): + results = self.module.bald( + images=[cv2.imread('tests/test.jpg')], + visualization=False + ) + data_0 = results[0]['data_0'] + data_1 = results[0]['data_1'] + data_2 = results[0]['data_2'] + self.assertIsInstance(data_0, np.ndarray) + self.assertIsInstance(data_1, np.ndarray) + self.assertIsInstance(data_2, np.ndarray) + + def test_bald4(self): + self.assertRaises( + AssertionError, + self.module.bald, + paths=['no.jpg'] + ) + + def test_bald5(self): + self.assertRaises( + cv2.error, + self.module.bald, + images=['tests/test.jpg'] + ) + + def test_save_inference_model(self): + self.module.save_inference_model('./inference/model') + + self.assertTrue(os.path.exists('./inference/model.pdmodel')) + self.assertTrue(os.path.exists('./inference/model.pdiparams')) + + +if __name__ == "__main__": + unittest.main() -- GitLab