【CANN训练营】【2022第二季】【新手班】基于ResNet-101网络实现图片分类的实验复现
本实验主要是在第一篇(基于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
ResNet-101
可以看到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
3、图片格式转换
进入data目录,进行图片预处理
cd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/data/
python3 ../script/transferPic.py
二、模型替换
下面我们进行模型的替换,将原有的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
进入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
可以看到在压缩包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模型转换过程中显示日志的级别。
2、修改sample_process.cpp代码
根据.om模型路径修改模型读取位置
const char* omModelPath = "../tf_model/resnet101_tf.om"
3、重新编译文件
cd ../build/intermediates/host/
make
cd ../../../out/
可以看到可执行文件main已经生成
4、运行main进行推理
最后运行结果是成功出现了,但是观察到输出的最大可能的预测标签和实际之间还是存在差距的,识别精度的问题仍需要进一步分析。
- 点赞
- 收藏
- 关注作者
评论(0)