一、背景
其实这应该是张小白完成MindStudio体验官第一期体验的第2篇文章,因为这原本就是对标MindStudio团队提供的AI1S服务器镜像基础上,张小白试着在200DK上的实现。
本来张小白以为这应该很好解决的,哪里知道这反而变成了这次体验官活动中最大的拦路虎。好在最近在 @黄贺阳 的帮助下解决了。所以特意重新整理下相关的文字,以供大家参考。
张小白在AI1S服务器上使用MindStudio小助手使用的镜像完成了MindStudio卡通风格迁移的项目的复现。具体过程参见 https://bbs.huaweicloud.com/blogs/371113
张小白在200DK上完成了MindStudio YoLoV3目标检测项目的复现:https://bbs.huaweicloud.com/blogs/371600
但是显然,这个案例不是MindStudio体验官要求复现的项目,因为这次体验官的项目明确要求是MindX SDK项目,而YoLoV3这个是sample仓库的项目,并不是一个MindX SDK项目。
张小白在200DK上完成了MindStudio MMNet人像分割项目的复现:https://bbs.huaweicloud.com/blogs/371825
这篇文章从零开始介绍一直到最后运行成功,张小白也用两套环境(两台笔记本,两套x86虚拟机,两张200DK启动的TF卡)做了尝试。文章的实践性较强,如果环境还不会搭建的,可以参考这篇文字进行全流程的搭建。
张小白又在MMNet项目的基础上,完成了200DK上MindStudio FaceBoxes人脸检测项目的复现:https://bbs.huaweicloud.com/blogs/372229
这篇文章也成功地检测出目前MindStudio中下载插件配置文件的一个BUG( https://bbs.huaweicloud.com/forum/thread-0230967406263860003-1-1.html ),功德无量。
那么现在,张小白依然在前面这两篇文字的基础上,来复现一下200DK上的卡通风格迁移项目吧!
二、安装MindStudio 5.0.RC2 for Windows
由于此时张小白也测出了MindStudio的一些其他BUG,@K 大大建议张小白下载新的MindStudio前端进行验证。
那就从MindStudio的最新版开始吧!这样也可以把MindStudio的相关配置过程再重现一下。
打开MindStudio官网:https://www.hiascend.com/software/mindstudio
点击立即下载:
当然,张小白对此是有点疑问的。因为张小白以前下载的日期应该也是8月份,所以那个时候下载的应该也是7月27日的版本才对。
不管了,点击最下面一个zip包右边的“软件包下载“吧!
耐心等待下载结束:
将其带目录解压到G盘(上次是E盘)
解压后如下:
点击MindStudio.bat,可以打开MindStudio:
当然,由于张小白机器上有一个版本的MindStudio,所以这次会打开前面的那个项目,我们点击 关闭项目:
三、使用MindStudio 5.0.RC2打开卡通风格迁移样例工程
为了完全复现,张小白特意在G盘也重新下载一个MindX SDK样例仓库(省得被E盘的MindX SDK仓库中已经修改过的代码所干扰。)
打开cmd窗口
G:
git clone https://gitee.com/ascend/mindxsdk-referenceapps.git
用MindStudio打开工程目录:
G:\mindxsdk-referenceapps\contrib\CartoonGANPicture
点击确定:
点击信任项目,进入了工程的主页面:
这个时候,打开的项目还不是一个昇腾的工程,需要点击Ascend-》Convert to Ascend Project:
按照以下方式填写:
点击OK
四、查看MindStudio相关配置
1、CANN配置
点击Ascend-》CANN Manager
当然,由于以前配置过,所以CANN Toolkit也被识别出来。
2、MindX SDK配置
点击Ascend-》MindX SDK Manager
同样的,mxVison 3.0.RC2也被识别出来。
五、工程编译
1、编译配置
从这个项目的程序架构来看,它是个C++的工程,使用cmake作为编译工具。
我们就来配置下编译参数:
点击 构建-》Edit Build Configuration:
点击+
点击确定。
2、编译
点击构建-》Build Project,仔细查看编译的输出窗口:
这里报了个错:
信息:/home/HwHiAiUser/mxVision-3.0.RC2/lib/libmxbase.so: undefined reference to `memset_s’
显然,这个问题张小白遇到过也解决过。
打开CMakeLists.txt文件,在link_directories内增加一行:/usr/lib64
在target_link_libraries内增加一行:/usr/lib64/libc_sec.so
再重新编译:
可见可执行程序 CartoonGAN_picuture程序已经编译成功。
六、准备项目环境
我们选择原有的JPG图片:
在项目工程下创建data目录:
创建data/images目录,将上面的图片复制过去。
创建data/output目录。
创建data/model目录:
七、使用MindStudio完成模型转换
1、准备原始pb模型
使用浏览器下载 https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/CartoonGANPicture/model.zip
解压到data目录(zip文件本身带目录,选择解压到当前目录下即可)
2、模型转换
点击Ascend-》Model Converter:
Model File想选择刚才的pb文件,其实不行。非要选择后台的文件。。。
这个有点尴尬了。张小白不是想在MindStudio前台界面上完成模型转换功能吗?
如果是远程在后台执行,那张小白干嘛不直接使用命令行转换呢?
无奈,只好选择200DK上同样目录下的文件(这个目录是原来在200DK后台git clone MindX SDK样例仓创建的)
点击确定:
系统会进行模型解析,解析完毕后,会显示如下:
当然,上图中模型的输出目录应该放在 G:\mindxsdk-referenceapps\contrib\CartoonGANPicture\data\model ,改一下即可。
结果如下:
点击Next:
打开Data Preprocessing:
打开Load Aipp Configuration:
选择AIPP的文件名,应该是 G:\mindxsdk-referenceapps\contrib\CartoonGANPicture\data\model\insert_op.cfg 才对:
系统又去200DK后台找文件了!
算了,还是找给它吧!
显示如下:
点击Next:
先切换到200DK的终端把原来转换好的om模型备份一下吧!
切换回到MindStudio,点击Finish:
系统开始做模型转换。。。
模型转换成功了。
但是张小白比较了一下 原来的命令行命令:
atc –output_type=FP32 –input_shape=”train_real_A:1,256,256,3″ –input_format=NHWC –output=”cartoonization” –soc_version=Ascend310 –insert_op_conf=insert_op.cfg –framework=3 –model=”cartoonization.pb” –precision_mode=allow_fp32_to_fp16
以及刚才生成的atc命令:
/home/HwHiAiUser/Ascend/ascend-toolkit/5.1.RC2/atc/bin/atc –input_shape=”train_real_A:1,256,256,3″ –check_report=/home/HwHiAiUser/modelzoo/cartoonization/Ascend310/network_analysis.report –input_format=NHWC –output=”/home/HwHiAiUser/modelzoo/cartoonization/Ascend310/cartoonization” –soc_version=Ascend310 –framework=3 –model=”/home/HwHiAiUser/mindxsdk-referenceapps/contrib/CartoonGANPicture/data/model/cartoonization.pb”
发现少了一个参数:
–precision_mode=allow_fp32_to_fp16
张小白仔细想了一下,还是决定在Addtional Arguments里面加上这个参数吧!
输入后按TAB键:
这回有这个参数了。
点击Finish重新进行模型转换:
耐心等待转换结束:
转换完毕。
奇怪了,模型转换之后,模型呢?
哦。原来张小白第二次模型转换的时候忘记选 output path了!
到这里了:
C:\Users\zhang\modelzoo\cartoonization\Ascend310
只好手工把om文件拷贝过去:
好了,万事俱备,只欠执行了!
(当然现在的代码执行应该会报个比较严重的错误…)
八、调试、运行项目
点击运行-》运行 CartoonGANPicture:
显示如下:
这就是张小白遇到的那个大BUG:
E20220827 14:01:24.365751 22956 DvppWrapperBase.cpp:607] [507013][Error code unknown] DvppJpegDecode, fail to synchronize stream.
E20220827 14:01:24.365921 22956 DvppWrapper.cpp:256] [507013][Error code unknown] Fail to set input data information.
E20220827 14:01:24.365957 22956 DvppWrapper.cpp:192] [507013][Error code unknown] DvppJpegDecode, fail to GetImageData.
E20220827 14:01:24.365998 22956 CartoonGANPicture.cpp:73] DvppWrapper DvppJpegDecode failed, ret=507013.
E20220827 14:01:24.366017 22956 CartoonGANPicture.cpp:214] ReadImage failed, ret=507013.
E20220827 14:01:24.366043 22956 main.cpp:96] CartoonGANPicture process failed, ret=507013.
不要紧,华为的人已经有了解决方案了!
打开CartoonGANPicture.cpp代码:
将ReadImage函数改为以下内容: