基于SoC FPGA和CNN模型的动作识别系统设计

基于视觉的动作识别方法可以分为两大类[1],其一是采用人工设计的特征进行识别的方法,比如基于密集轨迹

[2]、基于空时滤波器与图模型[3]、基于关节信息和流形学习的方法[4]、基于HMM的复杂动作建模[5]等;其二是采用深度网络的方法,比如基于空时卷积神经网络[6]、Two-stream卷积网络[7-8]、基于关节信息和LSTM的空时注意力模型[9]等。虽然使用深度学习可以减少人工设计特征的工作量,且在图像识别等领域有极佳的表现[10],但是却有运算量大的问题。对此,可以通过模型改进[11-12]、压缩[13]、量化[14]等方式减少运算量,也可以使用GPU[15]、ASIC[16]和FPGA[17-18]等硬件系统进行加速运算。

本文采用模型对视频流中的目标任务进行动作识别。为了减少运算量,首先利用基于光流信息和静态图像处理的行人检测方案定位场景中的目标,而后使用CNN网络对目标区域的图像和光流进行处理,最终给出动作识别结果。该系统在DE10-Nano开发板上进行开发与验证,在FPGA端实现流水线型计算、基于HOG和SVM的行人检测、指令集架构的处理单元,在HPS端实现目标区域融合求解、NPU单元调用,两者共享DDR内存,采用AXI总线实现片内通信。

1 动作识别原理

1.1 LK光流法

I(x,y,t)表示时刻t拍摄下的视频图像中坐标(x,y)点的灰度值,根据LK光流约束[19],光流场的计算满足下列式子:

求解上述优化问题,可以得到其最优解的形式如下:

基于SoC FPGA和CNN模型的动作识别系统设计

1.2 基于HOG和SVM的行人检测

通常使用滑动窗口对原始图像进行HOG特征提取,再对HOG特征向量进行分类识别,达到行人检测的目的。图像中(x,y)坐标点的像素值为I(x,y)。该点的像素梯度的大小和方向可以计算为M(x,y)和Θ(x,y)。将梯度的方向Θ(x,y)划分到N个区间,每个区间占据π/N角度值,如图1所示。

基于SoC FPGA和CNN模型的动作识别系统设计

其中:

基于SoC FPGA和CNN模型的动作识别系统设计

将检测窗口(window)划分成数个元胞(cell)。在本设计中,窗口尺寸设定为140×80,可被划分成14×8个10×10的元胞。首先,对这14×8个10×10的元胞,依次统计每个元胞里面的梯度直方图;将其通过规则化模块,得到最终的cell特征;通过组合2×2的元胞特征,可以得到块特征;最后,将窗口中的块特征依次排列,得到最终的91×36=3 276维度的窗口特征,如图2所示。

基于SoC FPGA和CNN模型的动作识别系统设计

在提取HOG特征后,可以利用SVM进行分类识别。本文选择使用线性SVM进行分类判别。其判别的依据如式(3)所示。

其中,w和b分别是SVM的权值和偏置,x则是输入的HOG特征。最后输出y=+1说明是正样本(即行人);输出y=-1则说明是负样本(即非行人)。

1.3 动态窗口与静态窗口的融合

使用光流信息和静态图像信息都可以对视频流中的行人进行检测[20-21]。通过实验发现,使用基于HOG和SVM的静态图像检测方法不易受到物体运动影响,但是误检率较高;而基于光流信息的动态检测方法误检率较低,但是一旦物体长时间静止或者缓慢运动就难以定位目标。因此,本文提出将两种检测方法相融合的方案,如图3所示。

基于SoC FPGA和CNN模型的动作识别系统设计

融合光流和行人检测结果的窗口融合算法流程如下:

基于SoC FPGA和CNN模型的动作识别系统设计

通过上述窗口融合算法,可以得到目标人物在视频帧中的位置。针对这个区域的视频图像和光流数据进行采集,对于不同的动作有不同的数据形态。如图4所示,每个动作对应的四张图分别是原始视频图像、光流x轴分量、光流y轴分量和显著运动检测掩膜。

基于SoC FPGA和CNN模型的动作识别系统设计

1.4 基于CNN的动作识别

计算每一帧视频的光流,提取行人存在区域的视频图像、光流场x轴分量、y轴分量以及显著运动检测掩膜。将这四类图像信息统一形变到94×94大小,并作为CNN的输入通道,交由CNN进行卷积层和池化层运算;最后的结果经过全连接层计算得到姿势识别结果。其中,卷积核的尺寸统一设置为3×3大小,池化核的尺寸统一为2×2;而为了提高CNN的泛化性能,在全连接层使用了dropout,并对CNN中的卷积核、全连接权值都添加L2正则化。使用CNN模型识别目标人物的动作如图5所示。

2 动作识别系统的设计与实现

2.1 软硬件协同开发示意图

本文提出的动作识别系统发挥了SoC FPGA的软硬件协同处理能力。

将运算量巨大的光流计算、静态行人检测和CNN运算放置在FPGA端,充分发挥其并行计算、流水线型处理的运算能力;而将运算需求较低的窗口融合算法在HPS端实现,使其发挥C语言程序设计的便捷性。HPS和FPGA之间通过AXI桥实现通信。而为了训练CNN模型,在HPS端增加数据采样模块,将样本保存到ima文件,通过网络传输到PC。针对站立、挥手、下蹲和行走四种姿势分别采样,其中存在一定数量的“离群值”,为了更好地训练CNN,在MATLAB上实现了可视化样本筛选程序。所有样本和标签代入TensorFlow框架,进行CNN模型训练;将训练得到的CNN模型参数和CNN模型结构传输到HPS端,HPS会将CNN参数加载到DDR内存,并将CNN模型对应的NPU指令发送到FPGA端的指令集架构NPU单元的指令Cache中。一旦HPS将目标窗口融合完成,可以发送一次CNN运算启动的指令,等待FPGA端NPU运算完成,读取DDR中的判别结果。动作识别系统框架图如图6所示。

基于SoC FPGA和CNN模型的动作识别系统设计

2.2 硬件系统框架

整个动作识别系统的硬件部分框架的细节图如图7所示。DDR存储空间为1 GB,被划分为7个部分。其中,Linux操作系统占用0~480 MB空间;光流计算结果占用480 MB~512 MB这32 MB空间;原始视频流数据占用512 MB~544 MB空间;行人检测的结果占用576 MB~608 MB空间;行人加框视频占用608 MB~640 MB空间;而将640 MB~1 024 MB空间用于NPU运算过程中的数据缓存。

基于SoC FPGA和CNN模型的动作识别系统设计

摄像头MT9D111的数据进入FPGA后,会同时传输到LK光流计算模块、行人检测模块,计算结果会缓存到DDR中;而通过视频缓存与显示模块,原始视频可以存储到DDR中,同时HDMI视频输出所需的数据从DDR中获取。这些模块对DDR的读写优先级较高,且占用DDR带宽较大,使用FPGA-to-SDRAM(F2S)接口直接和HPS上的SDRAM控制器交互。

HPS端的C程序需读取行人检测结果,并使用NMS算法对行人检测的框进行聚合、优化。调用memcpy将原始视频复制到加框视频的内存空间,并加上打框的结果;同时使用通过HPS-to-FPGA(H2F)接口传输指令,启动FPGA端NPU的运算,并读取NPU运算状态。

NPU运算时会对DDR进行读写访问,该访问通过FPGA-to-HPS(F2H)接口和L3互联网络实现。NPU单元可以计量指令执行时间,将运算状态与执行时间写入到状态寄存器中,随后HPS可以通过Light Weight HPS-to-FPGA(H2F-LW)接口获取NPU运行状态信息。

2.3 流水线LK光流计算模块设计

本文设计的流水线LK光流计算框架如图8所示。

基于SoC FPGA和CNN模型的动作识别系统设计

每当MT9D111完成一帧图像传输(VSYNC下降),或者一行传输完成(HSYNC下降),都会启动从DDR中读取一行的视频数据缓存到FIFO内,生成I(x,y,t-1);而后,MT9D111输出的像素点分别进入长度为一行像素点数量和长度为1的移位寄存器,得到I(x,y-1,t)和I(x-1,y,t);将I(x,y,t),I(x-1,y,t),I(x,y-1,t)和I(x,y,t-1)输入到梯度计算模块,得到在x,y和t方向上的一阶差分为Ix,Iy和It;使用4个长度一致为一帧图像一行像素点数量的移位寄存器,以及5×6个寄存器阵列构造LK光流法计算区域,即Ω域。使用互乘矩阵模块,分别计算寄存器阵列中previous对应数据Ix,prev,Iy,prev和It,prev的乘法交叉项;同理,计算出current对应数据Ix,curr,Iy,curr和It,curr的乘法交叉项。Ω域内乘法交叉项可以更新为:

结合光流场计算式(2),可以通过流水线型除法器实现光流场的计算。最后将运算结果回写到DDR中的480 MB~512 MB空间。

2.4 指令集架构NPU设计

为了便于实现、修改CNN架构,本文设计了基于指令集架构的NPU处理单元,能够执行矩阵运算(如ADD、SUB、MULT、DOT等)、立即数运算(ADDi、MULTi等)、2-D图像处理(如卷积CONV、池化POOL等)、激活函数(如SIGM、TANH、ReLU等)。指令集架构NPU结构框图如图9所示。通过不同NPU指令组合,能够实现不同CNN结构。NPU指令设计参考RISC格式,如表1所示,每条指令是128 bit长度,其中高4 bit区分指令类型,[123:92]表示参数$1内存首地址,[91:60]表示参数$2的内存首地址或者立即数IMM,[59:28]表示运算结果$3的内存首地址,[27:0]用于表示运算参数,如函数输入矩阵尺寸、卷积核尺寸等。

基于SoC FPGA和CNN模型的动作识别系统设计

比如全连接层的NPU指令可以表述如下。将存储在首地址0x0F000000的输入矩阵$1(尺寸为1×112)与存储在0x0A6B0000的权值矩阵$2(尺寸为112×32)相乘,结果缓存在0x0C000000;而后加上存储在0x0A6C0000的偏置(尺寸为1×32),缓存到0x0C010000;最后通过SIGM指令实现非线性映射,结果保存到0x0E000000。

Layer 6: fully_connection

MULT, @0F000000, @0A6B0000, @0C000000,M=1,N=112, P=32

inst=40F0000000A6B00000C0000000170200

ADD, @0C000000, @0A6C0000, @0C010000, M=1, N=32

inst=00C0000000A6C00000C0100000120000

SIGM, @0C010000, xx, @0E000000, M=1, N=32

inst=90C010000000000000E0000000120000

整个NPU划分成FSM控制逻辑、NPU指令解析逻辑、NPU指令运算逻辑和DDR读写接口逻辑四个部分。

如果NPU就绪,那么会给出cnn_inst_ready信号,表示可以接收运算指令;cnn_inst信号则是外部控制逻辑给出的运算指令;cnn_inst_en信号则表示cnn_inst指令有效使能。

DDR读写接口由ddr_write_*和ddr_read_*两组信号构成,且都符合Avalon-MM接口协议。由*_addr给出读写地址,*_req给出读写请求,对于DDR写入使用ddr_write_data表示写入数据。读写过程中信号都要保持稳定,直到DDR控制器给出*_ready读写请求完成信号。对于DDR读取,ddr_read_data表示读取的数据,而ddr_read_data_valid则表示DDR读取数据有效。

2.5 软件设计架构

HPS中的软件程序框架图如图10所示。其中分别实现了下述功能模块。

基于SoC FPGA和CNN模型的动作识别系统设计

(1)初始化接口,使用mmap函数将HPS-to-FPGA接口和DDR物理内存映射到Linux用户空间,方便其他模块访问、读写FPGA和DDR内的数据;

(2)按键响应模块,一旦用户按下键盘上的按键,程序能够及时响应;

(3)目标窗口生成模块,加载光流数据和静态图像行人检测结果,生成动态窗口和静态窗口,并通过窗口融合算法对其进行融合,确定目标所在的位置;

(4)数据采集模块,从DDR中采集视频、光流等数据,并保存到相应的文件中,用于CNN的离线学习使用;

(5)NPU指令传输和状态监控模块,能够通过HPS-to-FPGA接口传输NPU指令到FPGA端的指令cache中;并且能够启动NPU的运算、监控NPU的指令执行情况;

(6)绘图模块,能够将窗口融合结果保存到DDR中的内存区间,便于HDMI输出显示。

3 动作识别系统测试

3.1 CNN参数训练

为了训练本文的CNN模型,对于“无人”、“挥手”、“下蹲”、“站立”和“行走”这5种情况分别采集600个训练样本,共计3 000个样本。采用深度学习框架TensorFlow对CNN模型参数进行训练[22]。整个训练过程在Nvidia GeForce 940M显卡进行,大约消耗3小时,识别精度可以在训练集达到90%,在测试集达到88%。对于不同的动作,训练结果如表2所示。本文采用的动作识别方法能够较好识别“挥手”、“站立”和“行走”这三种姿势;而对于“无人”、“下蹲”这两个情况检出率较低,但是误报率也相对较低。

基于SoC FPGA和CNN模型的动作识别系统设计

3.2 硬件资源消耗与运行性能

由于本文设计的LK光流模块、基于HOG和SVM的行人检测模块、指令集架构NPU单元都是采用流水线处理,数据吞吐量极大。各模块的资源消耗与理论最大性能如表3所示。

基于SoC FPGA和CNN模型的动作识别系统设计

选择DE10-Nano开发板作为软硬件运行平台,在Quartus II 14.0环境下对动作识别系统进行综合、布局布线,工程消耗FPGA资源如表4所示。

布局布线后各模块分布情况如图11所示。

基于SoC FPGA和CNN模型的动作识别系统设计

3.3 实际运行测试

对本文提出的动作识别系统进行运行测试。将开发板和摄像头MT9D111、HDMI显示器进行连接,如图12所示。

基于SoC FPGA和CNN模型的动作识别系统设计

针对“站立”、“行走”、“下蹲”和“挥手”等不同的人物动作进行识别,结果输出到显示器。其中,左上角为原始视频;左下角为光流计算结果;右上角为行人加框结果;右下角为动作识别结果。系统运行测试情况如图13所示。

基于SoC FPGA和CNN模型的动作识别系统设计

4 结论

本文提出并实现了一种基于SoC FPGA和CNN模型的动作识别系统。该系统具有流水线型运算结构,能快速地执行光流计算和静态的行人检测;同时,指令集架构NPU的设计可以很方便地适应于多种CNN模型结构;该姿势识别系统在训练和实际识别测试中都表现出较高的准确率。

参考文献

[1] 范嘉义.基于骨架信息的人体动作识别[D].合肥:中国科学技术大学,2017.

[2] WANG H,KLASER A,SCHMID C,et al.Action recognition by dense trajectories[C].IEEE Conference on Computer Vision and Pattern Recognition. IEEE Computer Society,2011:3169-3176.

[3] TURAGA P,CHELLAPPA R,SUBRAHMANIAN V S,et al.Machine recognition of human activities:a survey[J].IEEE Transactions on Circuits & Systems for Video Technology,2008,18(11):1473-1488.

[4] 王鑫,沃波海,管秋,等.基于流形学习的人体动作识别[J].中国图象图形学报,2014,19(6):914-923.

[5] 战青卓,王大东.基于深度神经网络的人体动作识别研究[J].智能计算机与应用,2018,8(2):151-154.

[6] VAROL G,LAPTEV I,SCHMID C.Long-term temporal convolutions for action recognition[J].IEEE Trans on Pattern Anal & Mach Intell,2015,PP(99):1-1.

[7] SILVA V D O,VIDAL F D B,ROMARIZ A R S.Human action recognition based on a two-stream convolutional network classifier[C].IEEE International Conference on Machine Learning and Applications.IEEE,2017:774-778.

[8] 王亮亮. 基于视觉的人体动作识别研究[D].哈尔滨:哈尔滨工业大学,2017.

[9] SONG S,LAN C,XING J,et al.An end-to-end spatiotemporal attention model for human action recognition from skeleton data[J].arXiv:1611.06067,2016.

[10] 周凯龙.基于深度学习的图像识别应用研究[D].北京:北京工业大学,2016.

[11] GIRSHICK R.Fast R-CNN[J].Computer Science,2015.

[12] REN S,HE K,GIRSHICK R,et al.Faster R-CNN:towards real-time object detection with region proposal networks[C].International Conference on Neural Information Processing Systems.MIT Press,2015:91-99.

[13] HAN S,KANG J,MAO H,et al.ESE:efficient speech recognition engine with sparse LSTM on FPGA[J].arXiv:1612.00694,2017.

[14] COURBARIAUX M,HUBARA I,SOUDRY D,et al.Binarized neural networks: training deep neural networks with weights and activations constrained to +1 or -1[J].arXiv:1602.02830,2016.

[15] ABADI M,AGARWAL A,BARHAM P,et al.TensorFlow:large-scale machine learning on heterogeneous distributed systems[J].arXiv:1603.04467,2016.

[16] LIU S,DU Z,TAO J,et al.Cambricon:an instruction set architecture for neural networks[C].International Symposium on Computer Architecture.IEEE Press,2016:393-405.

[17] 王思阳.基于FPGA的卷积神经网络加速器设计[D].成都:电子科技大学,2017.

[18] GUO K,SUI L,QIU J,et al.Angel-Eye:a complete design flow for mapping CNN onto embedded FPGA[J].IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems,2017,PP(99):1-1.

[19] BARRON J L,FLEET D J,BEAUCHEMIN S S,et al.Performance of optical flow techniques[J].International Journal of Computer Vision,1994,12(1):43-77.

[20] 谢红,原博,解武.LK光流法和三帧差分法的运动目标检测算法[J].应用科技,2016,43(3):23-27,33.

[21] LI J,YIN Y,LIU X,et al.12,000-fps Multi-object detection using HOG descriptor and SVM classifier[C].IEEE/RSJ International Conference on Intelligent Robots and Systems.IEEE,2017:5928-5933.

[22] ZHANG M,XU H,WANG X,et al.Application of Google TensorFlow machine learning framework[J].Microcomputer & Its Applications,2017.

作者信息:

陈旭东1,周昱琪2,李梦杰1,陈章进1,3

(1.上海大学 微电子研究与开发中心,上海200444;

2.上海大学 纳米科学与技术研究中心,上海200444;3.上海大学 计算中心,上海200444)


分享到:


相關文章: