基于 Caffe ResNet-50 网络实现图片分类(视频解码 + 同步推理)
该样例是基于 Caffe ResNet-50 网络来实现图片分类功能,芯片要求是 Ascend310、310P 和 910。在开始前,首先要建议大家点击下方图片,报名 CANN 训练营活动,然后入群找小助手领取代金券,这样就可以零成本进行样例开发了。
![](https://static001.geekbang.org/infoq/7d/7d55a21dddcbf07e4c96f4f9159ecf29.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
本次样例使用的是 vdec,VDEC(Video Decoder)负责将 H264/H265 格式的视频码流解码为 YUV/RGB 格式的图片。输入码流格式支持 H264/H265,若码流中有坏帧、缺帧等情况,解码器 VDEC 可能会丢帧,下图是 VDEC 整个过程实现的流程图:
![](https://static001.geekbang.org/infoq/e7/e7d23e090c25fc75a948d9f571817887.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
参考下方的链接进行样例体验:
环境准备
具体的步骤,可以参考我之前发的文章,这里简单介绍下,首先购买华为云弹性云服务器,如图:
![](https://static001.geekbang.org/infoq/69/69afc10cb176a0c25ba26f8a4dee7519.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
通过下方链接下载 CANN8 版本的软件包和驱动:
https://www.hiascend.com/developer/download/community/result?module=cann
上传到服务器,执行命令升级 CANN 版本。
样例准备及运行
下载样例和 resnet50 模型等样例相关文件上传到对应的文件夹:
![](https://static001.geekbang.org/infoq/20/20d4eaf8d81e5f8ee9d6127299f8c743.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
ATC 转换模型文件:
atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --soc_version=Ascend310 --insert_op_conf=caffe_model/aipp.cfg --output=model/resnet50_aipp
命令执行后,需要等待一会,我们借此正好简单介绍下上面参数的含义,--model 代表需要转换的模型文件;--weight 代表的是权重文件;--framework 为原始的框架,0 代表 caffe,1 代表 mindspore,3 代表 tensorflow,5 代表 onnx;soc_version 代表的是芯片型号,insert_op_conf 代表算子配置文件;--output 代表的是模型的输出位置。
![](https://static001.geekbang.org/infoq/08/082abe19159d41010ab1bb1dffadb028.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
编译运行
配置环境变量,需要注意的是 $HOME 是你的 CANN 安装路径,比如我的安装路径上在/usr/local,所以需要改成合适的路径,否则编译会失败。
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
创建编译文件存放位置:
mkdir -p build/intermediates/host
因为我的运行环境和开发环境一致,如果环境不一致,参考样例提供的样例命令执行,进入文件夹并编译:
cd build/intermediates/host
cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
如下图说明编译成功:
![](https://static001.geekbang.org/infoq/e8/e8fd20d783e33580a9d83db523524341.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
如果上面的环境配置错误,那么有可能在编译时会出现如下错误:
![](https://static001.geekbang.org/infoq/e1/e1b733a352df78f86c432dede981d3b3.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
样例运行
切换到样例的 out 路径下,里面有个 main 文件,一般是有执行权限的,如果没有需要为其增加权限。
cd ../../../out ./main
输出如下图,代表样例执行成功:
![](https://static001.geekbang.org/infoq/78/7891ac795248ed68694fff3d9259d042.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
评论