【CANN训练营第三季】AI目标属性编辑应用

时间:2023-01-08 13:55:11

1、参考样例进行运行stargan

下载stargan后,查看readme,进行复现。

# 为了方便下载,在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。
cd $HOME/samples/cplusplus/level2_simple_inference/6_other/StarGAN/model/

总是报错找不到这个文件,那我们直接上传到家目录也很方便。
【CANN训练营第三季】AI目标属性编辑应用

wget https://sharedata.obs.cn-north-4.myhuaweicloud.com/StarGAN.zip
unzip StarGAN.zip
cd $HOME/StarGAN/StarGAN/StarGAN/model/
wget https://sharedata.obs.cn-north-4.myhuaweicloud.com/StarGAN.onnx
wget https://sharedata.obs.cn-north-4.myhuaweicloud.com/aipp_nv12.cfg
atc --framework=5 --model=StarGAN.onnx --output=StarGAN_aipp --input_format=NCHW --input_shape="real_img:1,3,128,128;attr:1,5" --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg

cd $HOME/StarGAN/StarGAN/StarGAN/scripts/
bash sample_build.sh

bash sample_run.sh

【CANN训练营第三季】AI目标属性编辑应用
遇到了这样一个报错
【CANN训练营第三季】AI目标属性编辑应用
我猜想是不是对目录项有所依赖呢?
于是,我选择了把这个文件复制到level2下。

cp -r $HOME/StarGAN/StarGAN/StarGAN/ $HOME/samples/cplusplus/level2_simple_inference/6_other/StarGAN/

看来倒不是这个原因
【CANN训练营第三季】AI目标属性编辑应用
那参考一下配置环境变量的文件:
https://gitee.com/ascend/samples/blob/master/cplusplus/environment/environment_variable_configuration_CN.md

我以为是DDK和NPU_HOST的问题,结果却不是。
我又研究了一番代码补全,终于使得编译通过了。
【CANN训练营第三季】AI目标属性编辑应用
遇到不会的地方,完全可以看下B站Ascend主讲老师的代码,然后和自己的代码进行对比调试,特别是TODO的部分,要仔细研究错误代码和错误原因。
【CANN训练营第三季】AI目标属性编辑应用

2、dvpp媒体数据处理

jpegd参考:https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/0_data_process/jpegd
resize参考:
https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/0_data_process/resize
这里就不再赘述过程。
只需要注意jpegd是图片编码
【CANN训练营第三季】AI目标属性编辑应用

resize可以通过命令修改有关参数,输入和得到的必须是yuv
【CANN训练营第三季】AI目标属性编辑应用

同步推理参考:https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
【CANN训练营第三季】AI目标属性编辑应用
【CANN训练营第三季】AI目标属性编辑应用

export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub

【CANN训练营第三季】AI目标属性编辑应用
【CANN训练营第三季】AI目标属性编辑应用
**参考:**https://blog.csdn.net/weixin_44676081/article/details/106755135
得到对应标签

结业考核

题目1、

目标:

让学员根据讲师讲解的内容、在样例代码基础上补充关键步骤的代码,以便学员了解整体开发流程、掌握关键代码逻辑。

实战场景:

单击Link获取AI目标属性编辑应用的源码包,补充缺失步骤的代码。

评分细则:

使用atc工具转换模型,提供转换命令及转换成功的截图。(5分)

cd model/
wget https://sharedata.obs.cn-north-4.myhuaweicloud.com/StarGAN.onnx
wget https://sharedata.obs.cn-north-4.myhuaweicloud.com/aipp_nv12.cfg
atc --framework=5 --model=StarGAN.onnx --output=StarGAN_aipp --input_format=NCHW --input_shape="real_img:1,3,128,128;attr:1,5" --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg

【CANN训练营第三季】AI目标属性编辑应用

完成样例代码补充,提供提交成功编译应用源码以及成功运行应用的截图。(15分)
参考VPC的整个流程代码。
参考:https://gitee.com/ascend/samples/tree/master/cplusplus/level1_single_api/7_dvpp

cd $HOME/StarGAN/StarGAN/StarGAN/data/
wget https://sharedata.obs.cn-north-4.myhuaweicloud.com/input_1.jpg
wget https://sharedata.obs.cn-north-4.myhuaweicloud.com/input_2.jpg
cd $HOME/StarGAN/StarGAN/StarGAN/scripts/
bash sample_build.sh
bash sample_run.sh

看来最后对loadmodel的迁移还有一部分问题。
提个issue看看。
终于编译成功。
【CANN训练营第三季】AI目标属性编辑应用
代码提交:https://gitee.com/qmckw/star-gan-ascend

总结实战过程中遇到的问题及解决方法,并提交总结。(5分)
只需要在有关的案例中找到类似的例子,适配即可,同时认真看视频,对比不同之处。

题目2、

目标:

让学员掌握DVPP图片处理的开发流程,便于在应用中对图片数据进行预处理或后处理。

实战场景:

开发一个图片数据处理的应用,支持对JPEG、PNG格式的图片进行解码,再对解码后的图片进行缩放,使得输入和输出图片的分辨率不同。

JPEG图片解码、PNG图片解码、图片缩放等处理后的输出图片,由于图片宽、高的对齐约束,可能存在绿边,该实战中学员可以不关注绿边。

开发应用时,可从Sample仓查找更多样例源码。

评分细则:

开发一个“JPEG图片解码+图片缩放”功能串联的图片处理应用,提交成功编译应用源码以及成功运行应用的截图。(10分)

开发一个“PNG图片解码+图片缩放”功能串联的图片处理应用,提交成功编译应用源码以及成功运行应用的截图。(10分)

开发图片处理应用时,在一个应用中,实现既支持“JPEG图片解码+图片缩放”,又支持“PNG图片解码+图片缩放”,根据用户输入的图片格式(JPEG或PNG)来判断走哪个分支,提交成功编译应用源码以及成功运行应用的截图。(10分)

串联功能时,如果实现内存复用,例如,JPEG图片的输出可以作为图片缩放的输入、图片缩放的输出可以作为JPEG图片编码的输入,提交成功编译应用源码以及成功运行应用的截图。(5分)

总结实战过程中遇到的问题及解决方法,或优化Sample仓中的样例源码(包括优化代码逻辑、优化代码注释、补充代码注释等),并提交问题总结、优化后的源码、优化思路说明、优化位置说明。(5分)

PNG+JPEG解码缩放:https://gitee.com/qmckw/png-jpeg-decoding-scaling
PNG图片解码+图片缩放:https://gitee.com/qmckw/PNGD-resize
JPEG图片解码+图片缩放:https://gitee.com/qmckw/JPEGD-resize

主要问题是串联时可以有一个内存复用,以JPEG图片解码+图片缩放为例:
JPEG图片的输出可以作为图片缩放的输入、图片缩放的输出可以作为JPEG图片编码的输入。
如果不内存复用,就copy_data
【CANN训练营第三季】AI目标属性编辑应用
如果内存复用,直接用decodeData作为resize的输入,直接在后续过程使用decodeOutDevBuffer_,不用aclrtMemcpy.
【CANN训练营第三季】AI目标属性编辑应用

  • JPEGD-resize运行成功截图:

  • 【CANN训练营第三季】AI目标属性编辑应用

  • PNGD-resize运行成功截图:

  • 【CANN训练营第三季】AI目标属性编辑应用

  • 混合png、jpeg判断逻辑截图-运行成功截图(包括png、jpeg由输入自动判断):

  • 【CANN训练营第三季】AI目标属性编辑应用
    【CANN训练营第三季】AI目标属性编辑应用

题目3

3、目标:

让学员掌握图片数据预处理+模型推理的完整开发流程,便于根据实际场景开发更多AI应用。

实战场景:

下载ResNet18模型或从ModelZoo仓中自选模型,开发一个包含图像数据预处理的推理应用。

开发应用时,可从Sample仓查找更多样例源码。

评分细则:

根据所下载的模型,提交应用的整体分析、设计思路,包含模型的输入和输出数据情况、需要什么样的数据预处理功能、关键代码逻辑是什么等。(5分)
具体的预处理功能我写了个markdown到gitee:

我选择的模型是ATC SSD-Resnet34(FP16)
https://www.hiascend.com/zh/software/modelzoo/models/detail/1/324b0ca450184da99130d5d9c56baf4a/1
【CANN训练营第三季】AI目标属性编辑应用

使用atc工具转换模型,提供转换命令及转换成功的截图。(5分)

atc --model=caffe_model/ssdresnet34_1batch_tf.pb --framework=3 --output=model/resnet34_tf --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,300,300,3" --log=info

根据所选模型,开发对应的图像数据预处理功能,代码能成功编译运行,输出处理后的图片,提交成功编译应用源码以及成功运行应用的截图。(10分)

import numpy as np
import os
from PIL import Image

def process(input_path):
    try:
        input_image = Image.open(input_path)
        #resnet34 输入大小为224*224
        input_image = input_image.resize((300,300))
        # 默认h为0, w为1,
        # hwc
        img = np.array(input_image)
        height = img.shape[0]
        width = img.shape[1]
        h_off = int((height-300)/2)
        w_off = int((width-300)/2)
        crop_img = img[h_off:height-h_off, w_off:width-w_off, :]
        # rgb to bgr 不需要,直接用rgb在resnet101
        # img = crop_img[:, :, ::-1]
        # shape = img.shape
        img = crop_img
        shape = img.shape
        #数据类型为RGB_FP32	
        img = img.astype("float32")
        img[:, :, 0] -= 104
        img[:, :, 1] -= 117
        img[:, :, 2] -= 123
        img = img.reshape([1] + list(shape))
        # nhwc PIL默认就是NHWC
        result = img
        # nchw
        # result = img.transpose([0, 3, 1, 2])
        output_name = input_path.split('.')[0] + ".bin"
        result.tofile(output_name)
    except Exception as except_err:
        print(except_err)
        return 1
    else:
        return 0
if __name__ == "__main__":
    count_ok = 0
    count_ng = 0
    images = os.listdir(r'./')
    for image_name in images:
        if not image_name.endswith("jpg"):
            continue
        print("start to process image {}....".format(image_name))
        ret = process(image_name)
        if ret == 0:
            print("process image {} successfully".format(image_name))
            count_ok = count_ok + 1
        elif ret == 1:
            print("failed to process image {}".format(image_name))
            count_ng = count_ng + 1
    if count_ng == 0:
        print("{} images in total, {} images process successfully" .format(count_ok + count_ng, count_ok))
    else:
        print("{} images in total, {} images process successfully, {} images process failed"
            .format(count_ok + count_ng, count_ok, count_ng))

【CANN训练营第三季】AI目标属性编辑应用

在第3步开发的代码中,根据所选模型,串接模型推理的代码,提交成功编译应用源码以及成功运行应用的截图。(10分)
【CANN训练营第三季】AI目标属性编辑应用
【CANN训练营第三季】AI目标属性编辑应用
运行成功

总结实战过程中遇到的问题及解决方法,并提交总结。(5分)
这个题和之前做过的resnet101很相似,有几个修改点:

  • 修改预处理,转换为模型需要的输入格式
  • 修改载入模型的步骤,因为均为resnet系列模型,大部分可以复用
  • 修改模型转换命令

代码链接:https://gitee.com/qmckw/resnet34-ascend310