【2022年第一期 CANN训练营进阶班应用课】第二次大作业

前情提要

  1. 按照官方B站视频介绍,接收镜像,并创建云服务器;如果不想看视频,可以参照其他开发者的教程配置环境,推荐教程【CANN训练营进阶班应用课笔记】大作业1实战趟坑记录
  2. ssh登录服务器,可以用MobaXterm,也可以直接用Visual Studio Code,这里选择前者,因为MobaXterm支持X server,简单来说,就是支持图形界面,方便我们后续查看yuv文件,如果有朋友不熟悉,推荐教程【CANN训练营进阶班应用课笔记】大作业1实战趟坑记录

准备工作

  1. 安装ffmepg。方便做视频解码和通过ffplay查看yuv文件。在root用户下执行如下命令即可:
sudo apt-get install ffmpeg

     2.切换到用户HwHiAiUser。因为默认是root用户登陆,但是运行代码用HwHiAiUser用户才行,否则报错。

     3. 任务要求。从开发手册可以看到

     首先,明确输入是一段.mp4封装的视频,输出是jpeg图片(注意,图片的“分辨率”与输入视频不同),具体来说,整个过程是

     本地.mp4封装的视频(无法直接对mp4格式封装的视频做解码,需要先转换为H.264/H.265视频流)------>硬解码为H.264/H.265视频流——>解码得到YUV图片(一张或多张))——>缩放(修改分辨率,一张或多张)——>硬编码为jpeg文件(一张或多张)

     这里提供一段mp4格式封装的视频,分辨率为1920 x 1080(1080P),帧率为25,编码为AVC(H.264),下载链接为:

     链接:https://pan.baidu.com/s/10b3x15HfGHRmam16M1sGrw 
     提取码:fo6c

     预览一下视频!这是一段经典的视频,一般用于展示行人检测或跟踪的应用效果。

操作

  1. 将输入的mp4文件解码为H.264或H.265视频流

      接下来操作!因为昇腾处理器中的视频编解码专用硬件电路无法直接对mp4格式封装的视频操作,要求输入是H.264/H.265视频流,所以我们先对输入的mp4视频做“拆装”,可以通过ffmpeg来做:

# 注意,我们要先将视频文件TownCentreXVID_1920_1080_25_AVC_H264.mp4上传到
# /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/data/下
# 上传操作也很简单,直接在MobaXterm上打开到上述目录,点击上传即可

ffmpeg -i TownCentreXVID_1920_1080_25_AVC_H264.mp4 -vcodec h264 TownCentreXVID_1920_1080_25_AVC_H264.h264

运行过程截图:

运行结果截图:

好了,我们现在得到想到的H.264视频流了(即 TownCentreXVID_1920_1080_25_AVC_H264.h264),下面要开始解码了,得到YUV格式文件:

首先要修改下main.cpp中的一些参数设置:

# 进入main.cpp所在目录
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/src

# vim修改文件
vim main.cpp

# 首先,修改输入文件路径和名称,将第22行的std::string filePath= "../data/vdec_h265_1frame_rabbit_1280x720.h265"; 修改为
std::string filePath= "../data/TownCentreXVID_1920_1080_25_AVC_H264.h264";

# 其次,修改输入视频大小
# 将第23行的const int inputWidth = 1280; 修改为
const int inputWidth = 1920;
# 将第24行的const int inputHeight = 720; 修改为
const int inputHeight = 1080;
# 这样才和我们的输入视频大小相匹配

# 最后修改解码设定,将第 40行的int32_t enType_ =0 ; 改为
int32_t enType_ =3 ;
# 参照注释,可知这对应H.264
/* 0:H265 main level
 * 1:H264 baseline level
 * 2:H264 main level
 * 3:H264 high level
 */

接下来,来运行试试!

# 确保已经切换到HwHiAiUser用户
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/scripts
# 注意下面命令运行时,会弹出架构选项,因为我们的CPU是x86架构的,所以这里选择x86,如下图所示
bash sample_build.sh
bash sample_run.sh

最终程序运行成功截图:

运行速度很快,体验不错!我们到这个目录下可以看到生成的.yuv文件:

cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/out/output

如下图所示,可以看到我们得到的10张图片


接下来,我们查看图片,在root用户下执行命令:

# 注意在root用户下执行,如果不是root用户,可执行su root进行切换
ffplay -f rawvideo -video_size 1920x1080 image1.yuv

可以看到,如下图片,注意这是依赖了MobaXterm的X Server

此时程序运行截图:

我们还可以查看其他yuv图片,注意到展示的图片有些色彩疑似有问题,暂时先不管了。

    2. 对yuv格式进行resize(输入是上一步得到的yuv格式文件)

    其实到这一步的话,就和第一次大作业的过程基本一致了,这也是此次作业的目的之一,巩固上次的学习成果,连续性还是很不错的,可见老师设计的时候也是经过深思熟虑和精心安排的,同时这种视频编解码、resize和图片编解码的操作是在计算机操作中很常见的,在AI推理和训练中也常用,非常有学习价值和意义,更重要的是,一般来说,都会配有专门的硬件电路来加速,这也是DVPP的作用。

   那这里,就选择image1.yuv来操作吧!

# 注意之前可能是root用户,这里我们通过su HwHiAiUser切换为HwHiAiUser用户
# 首先将image1.yuv拷贝到我们resize操作的数据输入目录
cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/out/output/image1.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/data

# 接下来修改运行脚本sample_run.sh,主要是输入图片的路径和resize的分辨率:
# 首先进入脚本所在路径
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/scripts

# vim修改文件第10行,修改为
running_command="./main ../data/image1.yuv 1920 1080 ./output/output.yuv 224 224 "
# 这表示我们处理的是./main ../data/image1.yuv文件,该文件尺寸为1920 x 1080,设置输出路径是./output/output.yuv ,输出文件outpu.yuv的大小是224 x 224

# 注意下面命令运行时,仍然会弹出架构选项,因为我们的CPU是x86架构的,所以这里选择x86,如下图所示
bash sample_build.sh

bash sample_run.sh

resize后的文件为output.yuv,我们来看看

# 来到output.yuv保存路径
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/out/output

# 注意在root用户下执行,如果不是root用户,可执行su root进行切换
ffplay -f rawvideo -video_size 224x224 output.yuv

可以看到图片尺寸确实缩小了,而且没有绿边或黄边,这应该是因为DVPP的输入是符合前面提到的宽高对齐要求的。但要注意的是我们设置的resize大小224 x 224的宽度是不符合128对齐的。

应该没啥问题,接着来吧!

    3. resize后的yuv文件编码成jpg图片(输入是上一步得到的resize后的yuv格式文件)

# 注意之前可能是root用户,这里我们通过su HwHiAiUser切换为HwHiAiUser用户
# 将上一步生成的output.yuv拷贝到指定路径,方便后续jpeg编码
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


# 进行路径
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

接下来,到输出路径看看,之后下载到本地查看即可。因为MobaXterm很好的文件交互性和可视化,我们可以直接双击该输出文件,就能自动下载查看了

最终得到编码后的图片

至此,我们完成了全部流程,最终得到了编码后的,如上图所示的jpg文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值