[{"data":1,"prerenderedAt":209},["ShallowReactive",2],{"content-query-cAhOd6YHgl":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"cover":11,"type":12,"category":13,"body":14,"_type":203,"_id":204,"_source":205,"_file":206,"_stem":207,"_extension":208},"/technology-blogs/zh/3383","zh",false,"","基于MindSpore案例的香橙派开发板离线推理实践--使用CycleGAN模型对输入图片进行风格迁移","样例介绍","2024-08-20","https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/11/28/08f3709b596243b19f5a9a3cca7fce14.png","technology-blogs","实践",{"type":15,"children":16,"toc":194},"root",[17,25,29,35,40,45,50,60,68,73,80,88,94,102,108,116,122,130,136,141,146,154,159,164],{"type":18,"tag":19,"props":20,"children":22},"element","h1",{"id":21},"基于mindspore案例的香橙派开发板离线推理实践-使用cyclegan模型对输入图片进行风格迁移",[23],{"type":24,"value":8},"text",{"type":18,"tag":19,"props":26,"children":27},{"id":9},[28],{"type":24,"value":9},{"type":18,"tag":30,"props":31,"children":32},"p",{},[33],{"type":24,"value":34},"功能：使用CycleGAN模型对输入图片进行风格迁移(apple2orange)。 样例输入：原始图片jpg文件。 样例输出：风格迁移后的图象。",{"type":18,"tag":19,"props":36,"children":38},{"id":37},"前期准备",[39],{"type":24,"value":37},{"type":18,"tag":30,"props":41,"children":42},{},[43],{"type":24,"value":44},"基础镜像的样例目录中已包含转换后的om模型以及测试图片，如果直接运行，可跳过此步骤。如果需要重新转换模型，可参考如下步骤：",{"type":18,"tag":30,"props":46,"children":47},{},[48],{"type":24,"value":49},"利用atc工具将原始模型转换为om模型，转换命令如下：",{"type":18,"tag":51,"props":52,"children":54},"pre",{"code":53},"atc --model=CycleGan.onnx --framework=5 --output=CycleGan --input_format=NCHW  --log=error --soc_version=Ascend310B4    \n",[55],{"type":18,"tag":56,"props":57,"children":58},"code",{"__ignoreMap":7},[59],{"type":24,"value":53},{"type":18,"tag":51,"props":61,"children":63},{"code":62},"其中各个参数具体含义如下：\n* --output_type：指定网络输出数据类型。\n* --input_shape：模型的输入节点名称和形状。\n* --input_format：输入Tensor的内存排列方式。\n* --output：输出的模型文件路径。\n* --soc_version：昇腾AI处理器型号。\n* --insert_op_conf：插入算子的配置文件路径与文件名，例如aipp预处理算子。\n* --framework：原始框架类型,  0: Caffe, 1: MindSpore, 3: TensorFlow, 5: ONNX。\n* --save_original_model：转换后是否保留原始模型文件。\n* --model：原始模型文件路径。\n* --precision_mode：选择算子精度模式。\n",[64],{"type":18,"tag":56,"props":65,"children":66},{"__ignoreMap":7},[67],{"type":24,"value":62},{"type":18,"tag":19,"props":69,"children":71},{"id":70},"模型推理实现",[72],{"type":24,"value":70},{"type":18,"tag":74,"props":75,"children":77},"h3",{"id":76},"_1-导入三方库",[78],{"type":24,"value":79},"1. 导入三方库",{"type":18,"tag":51,"props":81,"children":83},{"code":82},"import os\nimport numpy as np\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nimport mindspore.dataset as ds\nfrom mindspore import Tensor\nimport mindspore.dataset.vision as vision\n\nimport acl\nimport acllite_utils as utils\nimport constants as const\nfrom acllite_model import AclLiteModel\nfrom acllite_resource import resource_list\n",[84],{"type":18,"tag":56,"props":85,"children":86},{"__ignoreMap":7},[87],{"type":24,"value":82},{"type":18,"tag":74,"props":89,"children":91},{"id":90},"_2-定义acllite资源初始化与去初始化类",[92],{"type":24,"value":93},"2. 定义acllite资源初始化与去初始化类",{"type":18,"tag":51,"props":95,"children":97},{"code":96},"class AclLiteResource:\n    \"\"\"\n    AclLiteResource\n    \"\"\"\n    def __init__(self, device_id=0):\n        self.device_id = device_id\n        self.context = None\n        self.stream = None\n        self.run_mode = None\n        \n    def init(self):\n        \"\"\"\n        init resource\n        \"\"\"\n        print(\"init resource stage:\")\n        ret = acl.init()\n\n        ret = acl.rt.set_device(self.device_id)\n        utils.check_ret(\"acl.rt.set_device\", ret)\n\n        self.context, ret = acl.rt.create_context(self.device_id)\n        utils.check_ret(\"acl.rt.create_context\", ret)\n\n        self.stream, ret = acl.rt.create_stream()\n        utils.check_ret(\"acl.rt.create_stream\", ret)\n\n        self.run_mode, ret = acl.rt.get_run_mode()\n        utils.check_ret(\"acl.rt.get_run_mode\", ret)\n\n        print(\"Init resource success\")\n\n    def __del__(self):\n        print(\"acl resource release all resource\")\n        resource_list.destroy()\n        if self.stream:\n            print(\"acl resource release stream\")\n            acl.rt.destroy_stream(self.stream)\n\n        if self.context:\n            print(\"acl resource release context\")\n            acl.rt.destroy_context(self.context)\n\n        print(\"Reset acl device \", self.device_id)\n        acl.rt.reset_device(self.device_id)\n        print(\"Release acl resource success\")\n",[98],{"type":18,"tag":56,"props":99,"children":100},{"__ignoreMap":7},[101],{"type":24,"value":96},{"type":18,"tag":74,"props":103,"children":105},{"id":104},"_3-定义风格迁移类包含前处理推理后处理等操作",[106],{"type":24,"value":107},"3. 定义风格迁移类，包含前处理、推理、后处理等操作",{"type":18,"tag":51,"props":109,"children":111},{"code":110},"class CycleGan(object):\n    \"\"\"\n    class for Cartoonization\n    \"\"\"\n    def __init__(self, model_path):\n        self._model_path = model_path\n\n    def init(self):\n        \"\"\"\n        Initialize\n        \"\"\"\n\n        # Load model\n        self._model = AclLiteModel(self._model_path)\n\n        return const.SUCCESS\n \n    @utils.display_time\n    def pre_process(self, dir_path):\n        \"\"\"\n        image preprocess\n        \"\"\"\n        def read_img():\n            for dir in os.listdir(dir_path):\n                path = os.path.join(dir_path, dir)\n                img = Image.open(path).convert('RGB')\n                yield img, dir\n\n        dataset = ds.GeneratorDataset(read_img, column_names=[\"image\", \"image_name\"])\n        trans = [vision.Resize((256, 256)), vision.Normalize(mean=[0.5 * 255] * 3, std=[0.5 * 255] * 3), vision.HWC2CHW()]\n        dataset = dataset.map(operations=trans, input_columns=[\"image\"])\n        dataset = dataset.batch(1)\n\n        return dataset\n\n    @utils.display_time\n    def inference(self, dataset):\n        \"\"\"\n        model inference\n        \"\"\"       \n        for i, data in enumerate(dataset.create_dict_iterator()):       \n            img = data[\"image\"]\n            fake = self._model.execute([img.asnumpy(), ])\n        return img, fake\n            \n    @utils.display_time\n    def post_process(self, img, fake):\n        \"\"\"\n        post process\n        \"\"\"\n        fig = plt.figure(figsize=(8, 4), dpi=100)   \n        fake = Tensor.from_numpy(fake[0])\n        fake = (fake[0] * 0.5 * 255 + 0.5 * 255).astype(np.uint8).transpose((1, 2, 0))\n        img = (img[0] * 0.5 * 255 + 0.5 * 255).astype(np.uint8).transpose((1, 2, 0))\n\n        fig.add_subplot(2, 1, 1)\n        plt.axis(\"off\")\n        plt.imshow(img.asnumpy())\n\n        fig.add_subplot(2, 1, 2)\n        plt.axis(\"off\")\n        plt.imshow(fake.asnumpy())\n        plt.show()\n",[112],{"type":18,"tag":56,"props":113,"children":114},{"__ignoreMap":7},[115],{"type":24,"value":110},{"type":18,"tag":74,"props":117,"children":119},{"id":118},"_4-构造主函数串联整个代码逻辑",[120],{"type":24,"value":121},"4. 构造主函数，串联整个代码逻辑",{"type":18,"tag":51,"props":123,"children":125},{"code":124},"def main():\n    MODEL_PATH =\"CycleGan.om\"\n\n    acl_resource = AclLiteResource()  # 初始化acl资源\n    acl_resource.init()\n    \n    # instantiation CycleGan object\n    cyclegan = CycleGan(MODEL_PATH)  # 构造模型对象\n    \n    # init\n    ret = cyclegan.init()  # 初始化模型类变量\n    utils.check_ret(\"CycleGan.init \", ret)  \n    \n    dir_path = \"./data\"\n\n    # preprocess\n    dataset = cyclegan.pre_process(dir_path)  # 前处理\n    # inference\n    img, fake = cyclegan.inference(dataset)  # 推理\n    # postprocess\n    cyclegan.post_process(img, fake)   # 后处理\n",[126],{"type":18,"tag":56,"props":127,"children":128},{"__ignoreMap":7},[129],{"type":24,"value":124},{"type":18,"tag":74,"props":131,"children":133},{"id":132},"_5-运行",[134],{"type":24,"value":135},"5. 运行",{"type":18,"tag":30,"props":137,"children":138},{},[139],{"type":24,"value":140},"运行完成后，会显示原图片和推理后的图片，如下所示。",{"type":18,"tag":30,"props":142,"children":143},{},[144],{"type":24,"value":145},"**注意：**本案例在离线推理的过程中可能会出现内存不足的问题，可以根据情况查看FAQ文档中的解决方案。",{"type":18,"tag":51,"props":147,"children":149},{"code":148},"main()\n",[150],{"type":18,"tag":56,"props":151,"children":152},{"__ignoreMap":7},[153],{"type":24,"value":148},{"type":18,"tag":19,"props":155,"children":157},{"id":156},"样例总结",[158],{"type":24,"value":156},{"type":18,"tag":30,"props":160,"children":161},{},[162],{"type":24,"value":163},"我们来回顾一下以上代码，可以包括以下几个步骤：",{"type":18,"tag":165,"props":166,"children":167},"ol",{},[168,174,179,184,189],{"type":18,"tag":169,"props":170,"children":171},"li",{},[172],{"type":24,"value":173},"初始化acl资源：在调用acl相关资源时，必须先初始化AscendCL，否则可能会导致后续系统内部资源初始化出错。",{"type":18,"tag":169,"props":175,"children":176},{},[177],{"type":24,"value":178},"对图片进行前处理：使得模型正常推理。",{"type":18,"tag":169,"props":180,"children":181},{},[182],{"type":24,"value":183},"推理：利用AclLiteModel.execute接口对图片进行推理。",{"type":18,"tag":169,"props":185,"children":186},{},[187],{"type":24,"value":188},"对推理结果进行后处理：使得图片正常画出。",{"type":18,"tag":169,"props":190,"children":191},{},[192],{"type":24,"value":193},"可视化图片：利用plt将结果画出。",{"title":7,"searchDepth":195,"depth":195,"links":196},4,[197,199,200,201,202],{"id":76,"depth":198,"text":79},3,{"id":90,"depth":198,"text":93},{"id":104,"depth":198,"text":107},{"id":118,"depth":198,"text":121},{"id":132,"depth":198,"text":135},"markdown","content:technology-blogs:zh:3383.md","content","technology-blogs/zh/3383.md","technology-blogs/zh/3383","md",1776506129052]