From 3a7f6e8019dde71d8918a7fc2019a41fd29ff41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=83=E5=B9=B4=E6=9C=9F=E9=99=90?= <50902619+1084667371@users.noreply.github.com> Date: Tue, 23 Mar 2021 16:39:22 +0800 Subject: [PATCH] Upload New Modules about Food (#1330) * add food classification module --- .../Image_Classification_apple_pie.png | Bin 0 -> 55879 bytes .../food_classification/README.md | 84 ++++++++++ .../food_classification/__init__.py | 1 + .../food_classification/module.py | 147 ++++++++++++++++++ .../food_classification/requirements.txt | 3 + 5 files changed, 235 insertions(+) create mode 100644 docs/imgs/Readme_Related/Image_Classification_apple_pie.png create mode 100644 modules/thirdparty/image/classification/food_classification/README.md create mode 100644 modules/thirdparty/image/classification/food_classification/__init__.py create mode 100644 modules/thirdparty/image/classification/food_classification/module.py create mode 100644 modules/thirdparty/image/classification/food_classification/requirements.txt diff --git a/docs/imgs/Readme_Related/Image_Classification_apple_pie.png b/docs/imgs/Readme_Related/Image_Classification_apple_pie.png new file mode 100644 index 0000000000000000000000000000000000000000..22de4d52837786bd053f38b1a678b8eb93ea573e GIT binary patch literal 55879 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 S@k7q0%JIlN*8u?cKmXajIWkEA literal 0 HcmV?d00001 diff --git a/modules/thirdparty/image/classification/food_classification/README.md b/modules/thirdparty/image/classification/food_classification/README.md new file mode 100644 index 00000000..138bfcf0 --- /dev/null +++ b/modules/thirdparty/image/classification/food_classification/README.md @@ -0,0 +1,84 @@ +# food_classification + +类别 图像 - 图像分类 + +网络 ResNet50_vd_ssld + + +> 模型概述 + +美食分类(food_classification),该模型可识别苹果派,小排骨,烤面包,牛肉馅饼,牛肉鞑靼。该PaddleHub Module支持API预测及命令行预测。 + +> 选择模型版本进行安装 + +```shell +$ hub install food_classification==1.0.0 +``` +> Module API说明 + +```python +def predict(self, + images=None, + paths=None, + batch_size=1, + use_gpu=False, + **kwargs): +``` +美食分类预测接口,输入一张图像,输出该图像上食物的类别 + +参数 + +* images (list[numpy.ndarray]): 图片数据,ndarray.shape 为 [H, W, C],BGR格式; +* paths (list[str]): 图片的路径; +* batch_size (int): batch 的大小; +* use_gpu (bool): 是否使用 GPU; + +返回 + +* res (list[dict]): 识别结果的列表,列表中每一个元素为 dict,各字段为: + * category_id (int): 类别的id; + * category(str): 类别; + * score(float): 准确率; + +## 代码示例 + +### API调用 + +```python +import cv2 +import paddlehub as hub + +module = hub.Module(name="food_classification") + +images = [cv2.imread('PATH/TO/IMAGE')] + +# execute predict and print the result +results = module.predict(images=images) +for result in results: + print(result) +``` + +### 命令行调用 +```shell +$ hub run food_classification --input_path /PATH/TO/IMAGE --use_gpu True +``` + +## 效果展示 + +### 原图 + + +### 输出结果 +```python +[{'category_id': 0, 'category': 'apple_pie', 'score': 0.9985085}] +``` + +## 贡献者 +彭兆帅、郑博培 + +## 依赖 +paddlepaddle >= 2.0.0 + +paddlehub >= 2.0.0 + +paddlex >= 1.3.7 diff --git a/modules/thirdparty/image/classification/food_classification/__init__.py b/modules/thirdparty/image/classification/food_classification/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/modules/thirdparty/image/classification/food_classification/__init__.py @@ -0,0 +1 @@ + diff --git a/modules/thirdparty/image/classification/food_classification/module.py b/modules/thirdparty/image/classification/food_classification/module.py new file mode 100644 index 00000000..af42cd40 --- /dev/null +++ b/modules/thirdparty/image/classification/food_classification/module.py @@ -0,0 +1,147 @@ +from __future__ import absolute_import +from __future__ import division + +import os +import cv2 +import argparse +import base64 +import paddlex as pdx + +import numpy as np +import paddlehub as hub +from paddlehub.module.module import moduleinfo, runnable, serving + + +def base64_to_cv2(b64str): + data = base64.b64decode(b64str.encode('utf8')) + data = np.fromstring(data, np.uint8) + data = cv2.imdecode(data, cv2.IMREAD_COLOR) + return data + + +def cv2_to_base64(image): + # return base64.b64encode(image) + data = cv2.imencode('.jpg', image)[1] + return base64.b64encode(data.tostring()).decode('utf8') + + +def read_images(paths): + images = [] + for path in paths: + images.append(cv2.imread(path)) + return images + + +@moduleinfo( + name='food_classification', + type='cv/classification', + author='郑博培、彭兆帅', + author_email='2733821739@qq.com, 1084667371@qq.com', + summary='Food classification', + version='1.0.0') +class MODULE(hub.Module): + def _initialize(self, **kwargs): + self.default_pretrained_model_path = os.path.join( + self.directory, 'assets') + self.model = pdx.deploy.Predictor(self.default_pretrained_model_path, + **kwargs) + + def predict(self, + images=None, + paths=None, + data=None, + batch_size=1, + use_gpu=False, + **kwargs): + + all_data = images if images is not None else read_images(paths) + total_num = len(all_data) + loop_num = int(np.ceil(total_num / batch_size)) + + res = [] + for iter_id in range(loop_num): + batch_data = list() + handle_id = iter_id * batch_size + for image_id in range(batch_size): + try: + batch_data.append(all_data[handle_id + image_id]) + except IndexError: + break + out = self.model.batch_predict(batch_data, **kwargs) + res.extend(out) + return res + + @serving + def serving_method(self, images, **kwargs): + """ + Run as a service. + """ + images_decode = [base64_to_cv2(image) for image in images] + results = self.predict(images_decode, **kwargs) + res = [] + for result in results: + if isinstance(result, dict): + # result_new = dict() + for key, value in result.items(): + if isinstance(value, np.ndarray): + result[key] = cv2_to_base64(value) + elif isinstance(value, np.generic): + result[key] = np.asscalar(value) + + elif isinstance(result, list): + for index in range(len(result)): + for key, value in result[index].items(): + if isinstance(value, np.ndarray): + result[index][key] = cv2_to_base64(value) + elif isinstance(value, np.generic): + result[index][key] = np.asscalar(value) + else: + raise RuntimeError('The result cannot be used in serving.') + res.append(result) + return res + + @runnable + def run_cmd(self, argvs): + """ + Run as a command. + """ + self.parser = argparse.ArgumentParser( + description="Run the {} module.".format(self.name), + prog='hub run {}'.format(self.name), + usage='%(prog)s', + add_help=True) + self.arg_input_group = self.parser.add_argument_group( + title="Input options", description="Input data. Required") + self.arg_config_group = self.parser.add_argument_group( + title="Config options", + description= + "Run configuration for controlling module behavior, not required.") + self.add_module_config_arg() + self.add_module_input_arg() + args = self.parser.parse_args(argvs) + results = self.predict( + paths=[args.input_path], + use_gpu=args.use_gpu) + return results + + def add_module_config_arg(self): + """ + Add the command config options. + """ + self.arg_config_group.add_argument( + '--use_gpu', + type=bool, + default=False, + help="whether use GPU or not") + + def add_module_input_arg(self): + """ + Add the command input options. + """ + self.arg_input_group.add_argument( + '--input_path', type=str, help="path to image.") + +if __name__ == '__main__': + module = MODULE(directory='./new_model') + images = [cv2.imread('./cat.jpg'), cv2.imread('./cat.jpg'), cv2.imread('./cat.jpg')] + res = module.predict(images=images) diff --git a/modules/thirdparty/image/classification/food_classification/requirements.txt b/modules/thirdparty/image/classification/food_classification/requirements.txt new file mode 100644 index 00000000..ad320664 --- /dev/null +++ b/modules/thirdparty/image/classification/food_classification/requirements.txt @@ -0,0 +1,3 @@ +paddlepaddle >= 2.0.0 +paddlehub >= 2.0.0 +paddlex >= 1.3.7 -- GitLab