【CANN训练营】【2022第二季】【新手班】基于ResNet-101网络实现图片分类的实验复现

举报
StarTrek 发表于 2022/07/24 20:24:46 2022/07/24
【摘要】 本实验主要是在第一篇基于Caffe ResNet-50网络来实现图片分类的实验基础上,将模型更换为TensorFlow ResNet-101来实现图片分类,并将该模型部署到昇腾AI处理器上进行推理。

本实验主要是在第一篇(基于Caffe ResNet-50网络实现图片分类)所述实验的基础上,更换模型为TensorFlow ResNet-101来实现图片分类。该实验的主要任务有:
1、将TensorFlow ResNet-101网络的模型文件(.pb)转换为适配昇腾AI处理器的离线模型(.om文件);
2、加载该om文件,对2张准备的jpg图片进行同步推理,分别得到推理结果后,再对推理结果进行处理,输出top5置信度的类别标识。
由于本实验是在第一篇文章实验——基于Caffe ResNet-50网络实现图片分类的基础上进行的,所以实验目录(samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/)和原来的是一致的。

一、输入图片数据的格式变换

1、观察分析ResNet-50和ResNet-101两个网络

可以先利用Netron软件来观察ResNet50模型和ResNet101模型的区别,便于我们之后对程序进行修改(此操作建议在本地主机上进行,较为便捷直观)。
Netron软件的网页版链接为:https://netron.app/
ResNet-101模型的资源下载(二选一即可):
https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/modelzoo/Official/cv/Resnet101_for_ACL.zip
或者:https://www.hiascend.com/zh/software/modelzoo/models/detail/1/8bbb7c17dfa94408ab46ea0073fec355
在本次实验中,ResNet-50用的是Caffe模型,在网页版Netron中导入resnet50.prototxt文件;ResNet-101用的是TensorFlow,在网页版Netron中导入resnet101_tf.pb文件。
ResNet-50
图片.png
ResNet-101
图片.png
可以看到ResNet-50的输入格式为[1, 3, 224, 224],ResNet101的输入格式为[?, 224, 224,3],且输入数据的类型是float32,所以需要修改一下transferPic.py文件。

2、修改transferPic.py文件

分别找到process函数中的下面两行

img = img.astype("float16")
...
result = img.transpose([0, 3, 1, 2])

分别修改为

img = img.astype("float32")
...
result = img.transpose([0, 1, 2, 3])

可以看到输出的result shape为(1, 224, 224, 3),输出的数据类型是float32
图片.png

3、图片格式转换

进入data目录,进行图片预处理

cd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/data/
python3 ../script/transferPic.py

图片.png

二、模型替换

下面我们进行模型的替换,将原有的Caffe ResNet-50预训练模型替换成TensorFlow ResNet-101。

1、下载预训练模型

进入样例,并新建一个tf_model(当然也可以直接存在原有的caffe_model下)

cd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/
mkdir tf_model

图片.png
进入tf_model文件夹,下载预训练模型并解压

cd tf_model
wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/modelzoo/Official/cv/Resnet101_for_ACL.zip
unzip Resnet101_for_ACL.zip

图片.png
可以看到在压缩包Resnet101_for_ALC中已经有了.pb的预训练模型,.om离线模型和 .cfg算子的配置文件,我们重新学习一下模型转换,这里可以用ATC命令直接将resnet101_tf.pb转换成.om文件,我们不妨将resnet101_tf.pb文件到tf_model中,并重新使用ATC工具转换为.om离线模型。
(注:此处没有使用.cfg文件,该文件好像是有关于使能AIPP的预处理算子配置文件,该部分学习的还不深刻,融合.cfg文件和.pb文件并转换为.om文件,目前还存在输入数据格式的问题的报错,暂时没能解决,此处应该需要对应AIPP的输入格式去修改前面的transferPic.py文件,如果想要尝试可以参考:https://gitee.com/ascend/ModelZoo-TensorFlow/tree/master/ACL_TensorFlow/built-in/cv/Resnet101_for_ACL/

cp resnet101_tf.pb ../
cd ../
atc --model=resnet101_tf.pb --framework=3 --output=resnet101_tf --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,224,224,3" --log=info

说明:
–model=resnet101_tf.pb 表示需要转换的原始文件路径和文件名;
–framework=3 表示原始模型所使用的框架,3表示tensorflow;
–output=resnet101_tf 表示存放转换后的离线模型的路径以及文件名(转换后会自动添加.om,这里无需写出);
–output_type=FP32 表示指定网络输出数据类型或指定某个输出节点的输出类型为FP32;
–soc_version=Ascend310 表示模型转换时指定芯片版本为Ascend310;
–input_shape=“input:1,224,224,3” 表示输入数据的shape大小,一张224 * 224的RGB三通道图;
–log=info 表示设置ATC模型转换过程中显示日志的级别。
图片.png

2、修改sample_process.cpp代码

根据.om模型路径修改模型读取位置

const char* omModelPath = "../tf_model/resnet101_tf.om"

图片.png

3、重新编译文件

cd ../build/intermediates/host/
make
cd ../../../out/

图片.png
可以看到可执行文件main已经生成

4、运行main进行推理

图片.png
最后运行结果是成功出现了,但是观察到输出的最大可能的预测标签和实际之间还是存在差距的,识别精度的问题仍需要进一步分析。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。