前情提要
- 按照官方B站视频介绍,接收镜像,并创建云服务器;如果不想看视频,可以参照其他开发者的教程配置环境,推荐教程【CANN训练营进阶班应用课笔记】大作业1实战趟坑记录。
- ssh登录服务器,可以用MobaXterm,也可以直接用Visual Studio Code,这里选择前者,因为MobaXterm支持X server,简单来说,就是支持图形界面,方便我们后续查看yuv文件,如果有朋友不熟悉,推荐教程【CANN训练营进阶班应用课笔记】大作业1实战趟坑记录。
准备工作
- 安装ffmepg。方便通过ffplay查看yuv文件。在root用户下执行如下命令即可:
sudo apt-get install ffmpeg
2.切换到用户HwHiAiUser。因为默认是root用户登陆,但是运行代码用HwHiAiUser用户才行,否则报错。
操作
- 将jpeg图片解码成yuv格式(输入文件是dog1_1024_683.dog,尺寸为1024 x 683)先来看看输入jpg文件
接下来操作!
# 确保已经切换到HwHiAiUser用户
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/scripts
# 注意下面命令运行时,会弹出架构选项,因为我们的CPU是x86架构的,所以这里选择x86,如下图所示
bash sample_build.sh
bash sample_run.sh
最终程序运行成功截图:
我们到这个目录下可以看到生成的.yuv文件:
/home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/out/output
如下图所示:
接下来,我们查看图片,在root用户下执行命令:
# 注意在root用户下执行,如果不是root用户,可执行su root进行切换
ffplay -f rawvideo -video_size 1024x683 dvpp_output.yuv
可以看到,如下图片,注意这是依赖了MobaXterm的X Server
此时程序运行截图:
可以看到yuv格式的文件上方有一条黄边,在使用ffplay查看时,需要设置图像大小,这里设置的是解码之前的jpeg文件大小,即1024 x 683,而得到的yuv文件,要符合DVPP的宽128对齐,高16对齐要求,原文件宽度没问题,高度要调整对齐,则应为1024 x 688(688是16的倍数),即高度增加了,接下来,我们运行如下代码试试:
ffplay -f rawvideo -video_size 1024x688 dvpp_output.yuv
得到如下图片:
上方的黄边没了,但是下方多了一条绿边,应该就是因为高度对齐带来的吧,正如作业文档提到的那样:
2. 对yuv格式进行resize(输入是上一步得到的yuv格式文件)
# 注意之前可能是root用户,这里我们通过su HwHiAiUser切换为HwHiAiUser用户
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/scripts
# 注意下面命令运行时,仍然会弹出架构选项,因为我们的CPU是x86架构的,所以这里选择x86,如下图所示
bash sample_build.sh
我们希望resize第一步生成的yuv文件,并设置resize大小,所以先将之前生成的yuv文件拷贝到当前程序的输入目录
cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/out/output/dvpp_output.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/data/
接下来,修改运行脚本sample_run.sh,主要是输入图片的路径和resize的分辨率:
cd ../scripts/
vim sample_run.sh
# 将sample_run.sh的第10行,替换为如下,表示输入yuv文件路径是../data/dvpp_output.yuv,大小是1024 x 688,resize后大小是224 224
running_command="./main ../data/dvpp_output.yuv 1024 688 ./output/output.yuv 224 224 "
# 运行程序
bash sample_run.sh
我们来看下运行成功截图:
下面看看resize后的yuv文件
# 查看yuv文件要root用户,所以先切换
su root
# 切换到输出的yuv文件目录
cd ../out/output
# 查看yuv文件
ffplay -f rawvideo -video_size 224x224 output.yuv
可以看到明显变小了,而且没有绿边或黄边,这应该是因为DVPP的输入是符合前面提到的宽高对齐要求的。但要注意的是我们设置的resize大小224 x 224的宽度是不符合128对齐的。
3. resize后的yuv文件编码成jpg图片(输入是上一步得到的resize后的yuv格式文件)
# 注意之前可能是root用户,这里我们通过su HwHiAiUser切换为HwHiAiUser用户
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/scripts
# 修改main.cpp文件,执行输入yuv文件路径和大小
# 切换到main.cpp所在文件夹
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/src
# 修改文件
vim main.cpp
# 在第242行,将该行替换为如下:
PicDesc testPic = {"../data/output.yuv", 224, 224};
# 注意下面命令运行时,仍然会弹出架构选项,因为我们的CPU是x86架构的,所以这里选择x86
bash sample_build.sh
# 接下来,我们要将上一步得到的resize后的yuv文件拷贝过来作为输入
cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/out/output/output.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/data/dvpp_output.yuv
# 运行程序
bash sample_run.sh
最终运行成功截图:
最终得到编码后的图片
至此,我们完成了全部流程,对于输入文件是dog1_1024_683.dog,尺寸为1024 x 683的jpg文件——> 解码为YUV文件——>resize到224 x 224 大小——>编码为jpg文件,最终得到了编码后的,如上图所示的jpg文件。