- 1 -
中国科技论文在线
基于 DSP 的人脸识别系统的优化
黄荣斌,庄伯金**
作者简介:黄荣斌(1987-),男,硕士,多媒体通信与模式识别,嵌入式系统
通信联系人:庄伯金(1976-),男,副教授,嵌入式系统,MPEG-2/MPEG-4/ 智能转码器设计
以及网络编码(Network Coding)与视频应用融合技术等
(北京邮电大学信息与通信工程学院,北京 100876)
5 摘要:随着嵌入式计算机技术的高速发展,自动化、智能化系统在各行各业的应用越发广泛,
便携、低功耗和高性能的嵌入式人脸识别系统越来越受到关注和欢迎。本文主要介绍基于嵌
入式 DSP 平台 TMS320DM642 的人脸识别系统的 C 语言级和线性汇编的优化。本文首先简
单介绍了 DM642 的体系架构;接着描述了 C 语言级别的优化,并举例说明了线性汇编的优
化工作;最后通过系统的运行效率对比说明了优化的效果。经过这两个层次的深入优化,本10
文的人脸识别系统运行速度得到了很大提高,基本满足实时处理的需求。
关键词:人脸识别;C 语言级优化;线性汇编;TMS320DM642
中图分类号:
Optimization For Face Recognition System Based on DSP 15
Huang Rongbin, Zhuang Bojin
(College of Information and telecommunication in Beijing University of Posts and
telecommunications, Beijing 100876)
Abstract: With the rapid development of embedded computer technology, automation and
intelligent systems are more widely used in all walks of life. Human face recognition system based 20
on embedded platform are more and more welcomed these days. This paper introduces the
optimization of C code and linear assembly language of the face recognition system based on
TMS320DM642, which is a embedded platform. This paper describes the architecture of DM642
firstly; then introduces optimization methods of the C code level, and illustrate the optimization
work of writing linear assembly language by functions' efficiency; finally shows the effect of 25
optimization by the contrast of the system's efficiency. After the deep optimization of the two
level, the embedded face recognition system basiclly reachs the goal of real-time processing with
the processing performance being greatly improved.
Key words: face recognition; C code optimization; linear assembly language; TMS320DM642
30
0 引言
随着科技的高速发展,当今社会对生活智能化和方便性的需求越发突出,相应的,有较
强的信息处理能力和更好的人机交互的嵌入式设备的市场需求也越来越大。近年来,在人们
的日常生活中,从 MP3、智能手机到平板电脑,类似的嵌入式设备层出不穷,已经融入到
人们生活工作中,遍布各行各业,如工业自动化、国防、运输、通信等领域。而如嵌入式人35
脸识别系统等高性价比的小型系统也越来越受欢迎。嵌入式人脸识别系统,指的是基于嵌入
式处理器设计的计算机系统通过摄像机或其他输入获取图像,并检测人脸,进而提取合适的
人脸特征,再与系统数据库中的特征模板进行匹配后,输出识别结果。显然,嵌入式人脸识
别系统有着广阔的应用前景,因此,本文深入研究了 DSP 平台的嵌入式人脸识别系统,并
对其进行了 C 语言级别和线性汇编级别的优化,使其达到实时处理的应用要求。 40
1 嵌入式开发环境
TMS320DM642 作为 C6000 系列的定位高端的定点数字信号处理器由 TI(美国德州仪
- 2 -
中国科技论文在线
器公司)推出,其核心是 C64x 型高性能 DSP,具有极强的最高可达到 5760MIPS 的处理性
能,高度的灵活性和可编程性,同时外围集成了非常完整的音频、视频和网络通信等设备及
接口。由于本文的人脸识别系统运算复杂,而且要求实时响应,同时,系统需要多种包括视45
频、通信等输入输出外设,而 DM642 都满足这些要求,所以本文选择了它作为本文的人脸
识别系统的嵌入式处理器。
TMS320DM642
[1]采用超长指令字的体系结构:VelociTI 体系结构。它能够在一个指令
周期内驱动多个且最多可达8个内部功能单元,即相当于单周期可能并行执行多达8条指令,
有非常高的效率,它还专门引入了新的指令以更快的进行信号处理。TMS320DM642 的体系50
结构[2]如图 1 所示。
本文使用的开发环境是 TI 的集成开发环境 CCS (Code Composer Studio)。CCS 是
一款集成开发环境(IDE),是由 TI 公司为方便其 DSP 芯片开发而打造的,它包含了 C/C++
编译器、编辑器、仿真器、调试器、汇编优化器、建库工具还有 DSP/BIOS[3]等等功能。本
文对人脸识别算法的优化都是在 CCS 上完成的。 55
图 1 DM642 系统框图[2]
2 C 语言级的优化
通常,算法移植后,算法并不能实时的在嵌入式平台上运行,因此需要对其进行针对性
的优化。在系统算法优化阶段,首先需要进行的是 C 语言级的优化。C 语言级的优化往往60
- 3 -
中国科技论文在线
可以降低算法的运算复杂度,提高软件流水的并行度,从而有效提高程序的执行效率。
利用 C 语言提供的关键字
C 语言提供了 register、restrict 和 inline 等关键字帮助用户获得更好的编译效果:
register 关键字指的是,若一个变量会被高频度访问但很少被改变,可以将其声明
为 register 以提高访问效率,因为每次 CPU 会直接从寄存器中读取,而不用再次访65
问内存。
restrict 关键字声明可以指定一个指针是指向某个特定对象的唯一指针。通过这个关
键字可以确保在指针声明的范围内访问指定的对象只能通过该指针,这样可以让编
译器确定指令相关性,提高代码并行性。
inline 是针对函数声明的关键字,即内联扩展。使用 inline 关键字编译的函数会在70
调用处被展开,从而减少了函数调用的开销,如参数进栈,保存原寄存器值等。inline
关键字一般只会对代码量小、频繁调用且逻辑简单的函数有效,特别是在循环中调
用的简单函数,如果将其他的比较大的函数也进行内联,有可能会造成性能下降。
良好的局部性
具有优秀局部性[4]的代码往往能够提高 Cache 的命中率,提升效率。通常,具有良好局75
部性的 C 代码,在编译环节能获得更佳的优化效果。所以,应该努力提高代码的局部性。
比如需要频繁通过指针解引用方法访问的值,应使用局部变量保存下来,使用完后再保存到
指针指向处。
减少复杂运算
复杂运算不利于软件流水[5],应尽量令使用到的复杂运算简单化。一般说来,有以下几80
种方法:
a) 提取公因式:尽量将循环体内的表达式中的公共部分提取到循环体外,从而减少循
环中的运算。
b) 数学公式:利用数学公式可以有效的降低某些运算的复杂度。如:
几何级数:
2 3
1 ...
1! 2! 3!
x x x xe 85
自然对数:
1
0
1
ln 1
n
n
n
x x
n
c) 查表:查表法是经典的空间换时间的优化方法,经常用于需要大量重复运算的数学
函数,如三角函数、对数函数等等。首先对其定义精度,将运算结果保存至表中,
常驻内存,如果缓存命中率较高的话,速度可以得到很大提升。
d) 位运算:从硬件角度来看 CPU 运算,移位逻辑运算肯定比乘法更高效,只需要一90
个时钟周期。比如计算 2 的整数次幂,整数求余等运算可以用移位逻辑运算来实现。
e) 减少除法运算:DM642 架构中并没有除法器,因此在 DM642 中除法是作为函数利
用加法和乘法来完成的,通常需要几十个时钟周期的时间。因此务必尽量减少除法。
对循环优化
在图像、视频处理中,经常需要用到循环体。这些循环体往往就是图像处理、识别过程95
中运算的主体,所以一般都是程序中开销最大的部分,而且由于循环的特性,它内部进行的
- 4 -
中国科技论文在线
复杂运算和控制是制约软件流水的最重要因素。对循环的优化一般包括以下几项工作:
a) 循环展开:循环展开是一种程序变换,通过增加每次迭代计算的数据的数量,减少
循环的迭代次数。它可以减少不直接有助于程序结果的操作数量,如循环中的索引
的计算和条件判断,同时可以在每次循环中更充分的利用 CPU 的资源,减少计算100
中关键路径的操作数量。
b) 提取循环不变式:对于每次循环计算结果均不变的表达式或者子表达式都应提取到
循环外。
c) 降低循环嵌套:要提高循环体代码的效率,最直接有效的方法是使循环能实现高度
的软件流水。而通常说来,编译器只会对最内层循环进行软件流水,因此最好减少105
循环嵌套,并且尽量减少循环层次之间的代码。
d) 减少过程调用:过程调用需要“保留现场”,因此在循环体中出现过程调用将会使得
编译器无法对该循环实现软件流水。如果函数较简单,可以采用内联扩展或者直接
拆分的方法。
e) 避免分支逻辑:当出现分支判断代码跳转的时候,比如 if 语句或 switch 语句,流110
水将会失效,因为编译器无法确定需要执行的下一条指令。因此应该努力避免分支。
3 线性汇编的优化
算法的 C 语言级优化完成后,经剖析后发现某些代码还是难以充分利用 C6000 架构潜
能,不能达到应用需求时,本文把相应代码改写为线性汇编以获得更高的效率。线性汇编并
不是真正的 C6000 汇编语言,它介于汇编语言和高级语言之间,是 C6000 特有的一种编程115
语言。所以在写线性汇编的时候,以下信息是不需要说明的,编译器会自动完成相关工作[6]:
a) 使用的寄存器
b) 使用的功能单元
c) 指令的并行
d) 指令的延迟 120
线性汇编需要作为汇编优化器的输入,经过其重新编排后生成最终的可执行文件。因此
编写线性汇编需要很多次的尝试和坚持不断的修改才可能达到较为满意的效果。如同前文引
言所述,需要针对循环体中运算密集的函数编写线性汇编才可能在性能方面显现较大的提
高。本文对系统中经常使用的内积函数进行线性汇编的改写。
C 语言函数: 125
//本系统经过优化的 C 语言内积函数
int sprod_ss_sa(short * restrict a,short* restrict b)
{
register int sum,sum1=0,sum2=0;
register short i;
for( i= 0; i<280; i+=2)
{
sum1 += a[i]*b[i];
sum2 += a[i+1]*b[i+1];
}
sum = (sum1>>9) + (sum2>>9);
return(sum);
}
- 5 -
中国科技论文在线
线性汇编函数:
图 2 是 C 语言版本和线性汇编版本的内积函数效率比较,由于 C 语言版本的函数已经130
过充分优化,有很高的效率,线性汇编版本的函数效率仅仅提升了 6%,但是在运算密集的
算法中,6%的性能提升已经很可观。通过查看编译器的反馈信息,线性汇编版本的内积函
数已经达到 1 个指令周期进行 8 次迭代的完全流水。
(a)
135
(b)
图 2 内积函数线性汇编优化效率对比
(a)C 语言函数 sprod_ss_sa 效率 (b)线性汇编函数 sprod_ss_sa 效率
140
4 结论
本文针对 DSP 平台的体系结构,给出了人脸识别系统的 C 语言级以及线性汇编级别的
优化方法。上述优化工作大大的提升了系统的运行效率,如表 1 所示。
145
LOOP: .trip 140
LDW *a++,ai_i1
LDW *b++,bi_i1
MPY ai_i1,bi_i1,pi
MPYH ai_i1,bi_i1,pi1
ADD pi,sum0,sum0
ADD pi1,sum1,sum1
[cntr] SUB cntr,1,cntr
[cntr] B LOOP
SHR sum0,0x09,sum0
SHR sum1,0x09,sum1
ADD sum0,sum1,sum
.return sum
.endproc
.global _sprod_ss_sa
_sprod_ss_sa: .cproc a, b
.reg sum, sum0, sum1, cntr
.reg ai_i1, bi_i1, pi, pi1
MVK N/2,cntr
ZERO sum0
ZERO sum1
- 6 -
中国科技论文在线
表 1 优化前后耗时对比
Tab. 1 contrast of elapsed time that optimization before and after
测试数据集(图片个数) 优化前耗时(毫秒/帧) 优化后耗时(毫秒/帧)
FERET(1196) 2325 223
LFW-Bush(530) 2021 192
LFW-Rumsfeld(121) 1675 157
注: FERET 与 LFW 是著名的人脸识别测试图像数据集
根据文中的数据对比,C 语言级以及线性汇编的优化能够有效的运用于基于 DSP 平台150
的嵌入式人脸识别系统,使其达到实时处理的目的。
[参考文献] (References)
[1] Texas Instruments. TMS320DM642 Video Imaging Fixed-Point Digital Signal Processor[Z]. USA:TI, 2002.
[2] Texas Instruments. TMS320DM642 Technical Overview[Z]. USA:TI, 2007.
[3] Texas Instruments. TMS320 DSP/BIOS User's Guide[Z]. USA:TI,2002. 155
[4] R. E. Bryant, D. Hallaron, 龚奕利,雷迎春译, 深入理解计算机系统[M]. 北京:中国电力出版社, 2004.
[5] E. Granston, Hand-tuning loops and control code on the TMS320C6000[Z]. USA:Texas Instruments, 2006.
[6] 田黎育, 何佩琨, 朱梦宇, 美国德州仪器公司. TMS320C6000 系列 DSP 编程工具与指南[M]. 北京:清华
大学出版社,2006.
160