029、车载环视系统架构——海思Hi3559的4路鱼眼拼接与实时性优化中的ISP资源分配
老规矩,先讲个真事儿。上个月有个兄弟项目组,拿着Hi3559A做环视,四路720P鱼眼,要求30帧实时拼接出鸟瞰图。方案评审的时候拍胸脯说没问题,结果一上板子,ISP跑起来CPU占用直接飙到85%,拼接线程饿得嗷嗷叫,画面卡成PPT。查到最后,问题出在ISP资源分配上——四路Sensor全开了在线模式,每路都占着独立的ISP通道,还都开了3DNR和WDR,把ISP的硬件资源吃干抹净,CPU还得帮着做畸变校正和查表,不卡才怪。
这活儿我干了十年,Hi3559A的ISP资源分配,说白了就是个“分蛋糕”的游戏。蛋糕就那么大——ISP总带宽、硬件加速单元(比如LDC、NR、Sharpen)、DDR带宽,还有CPU的算力预算。你得想清楚,哪路画面是给驾驶员看的,哪路只是用来做拼接的中间产物,优先级完全不同。
先看硬件底牌。Hi3559A的ISP是支持多路复用的,但别被“4路”给骗了。它内部其实有多个ISP核,但共享一套硬件加速器。你四路Sensor同时进来,每路都要做Bayer处理、去噪、Gamma、畸变校正,如果全走硬件LDC,那LDC模块的吞吐量就是瓶颈。我见过有人把四路全开LDC,结果每路只能跑到15帧,还互相抢带宽,画面撕裂。正确做法是——拼接用的鱼眼图,畸变校正别在ISP里做,扔给CPU或者GPU做软件校正。为什么?因为鱼眼拼接本来就要做球面投影映射,你ISP里做一次LDC,CPU再做一次投影,等于做了两遍几何变换,浪费算力不说,还引入两次插值误差。
具体怎么分?我的习惯是,四路Sensor,两路走ISP在线模式,开全功能——3DNR、WDR、Sharpen全开,这两路是给驾驶员看的前视和后视,画质要求高。另外两路(左视和右视)走ISP的“旁路模式”或者叫“直通模式”,只做最基本的Bayer处理和黑电平校正,连Gamma都别开,直接输出RAW或者简单的YUV。为什么?因为左右视的图最终是要进拼接融合的,拼接算法本身会做亮度均衡和色彩校正,你ISP里做一遍Gamma,拼接时再做一遍,色调就偏了。而且旁路模式省下的ISP资源,正好补给前视后视的3DNR——环视系统最怕夜间噪点,前视后视的3DNR强度直接决定夜视效果。
再说实时性。Hi3559A的ISP有个特性,叫“帧同步”或者“Sensor同步”,四路Sensor必须同时曝光同时出帧,不然拼接时运动物体会错位。这个必须在ISP的时序配置里做,别指望靠CPU去对齐时间戳。我踩过坑——当时图省事,四路Sensor各跑各的,结果车一动,拼接缝里的行人直接“分身”,被客户当场拍桌子。后来老老实实配了Sensor的同步信号,把四路曝光时间对齐,问题才解决。但同步之后有个副作用——四路同时出帧,ISP的DDR带宽会瞬间冲高,这时候你得给ISP的DDR通道设置优先级,前视后视的帧优先写入,左右视的帧可以稍微延迟,反正拼接算法要等四路齐了才处理,晚个几毫秒无所谓。
还有个容易忽略的点——ISP的“帧率降级”策略。Hi3559A支持在ISP负载过高时自动降低非关键路的帧率,比如左右视从30帧降到15帧。这个功能默认是关的,你得手动打开,并且设置好阈值。我一般把ISP的负载阈值设在70%,超过就降左右视的帧率,保证前视后视的30帧稳定。别小看这个,环视系统在车辆转弯时,左右视的画面变化快,但驾驶员主要看前视和后视,左右视降帧率对体验影响不大,却能救回整个系统的实时性。
再聊聊CPU和ISP的配合。Hi3559A的ISP输出的是YUV数据,拼接算法在CPU上跑。这里有个关键——ISP输出的数据格式和拼接算法的输入格式必须匹配。我见过有人ISP输出NV12,拼接算法却要RGB888,结果CPU还得做一次颜色空间转换,白白吃掉20%的算力。正确做法是,ISP直接输出拼接算法需要的格式,比如YUV420SP,然后拼接算法里用NEON优化做查表映射,别用浮点运算。海思的SDK里其实有现成的拼接库,但很多人不用,非要自己写,写就写吧,还不用NEON,跑起来慢得跟蜗牛似的。
最后说个实战技巧——用Hi3559A的“Region Of Interest”功能。环视拼接时,四路鱼眼图的边缘区域(就是畸变最大的地方)其实对拼接结果贡献很小,但ISP照样全分辨率处理。你可以把每路Sensor的ROI设置成只输出中心区域,比如只输出80%的宽度和高度,这样ISP的带宽和DDR占用直接降一半。拼接算法那边,边缘区域用插值补一下就行,反正鱼眼边缘的像素本来就被拉伸得不成样子,补一点看不出来。这个技巧我用了好几年,每次都能把ISP负载降下来20%以上。
总结一下我的经验——别把Hi3559A当万能神器,它的ISP资源是有限的,你得学会“按需分配”。前视后视是亲儿子,给最好的资源;左右视是干活的,够用就行。ISP里能不做的事就别做,扔给CPU或者算法去做,但前提是CPU那边你得留好预算。还有,帧同步和ROI这两个功能,一定要用,这是海思平台白送你的性能优化手段,不用白不用。最后,调试的时候别光看CPU占用率,要看ISP的负载计数器——海思SDK里有这个接口,能看到每个ISP模块的实时占用率,哪个模块吃满了,一目了然。
这行干久了,你会发现,影像系统优化不是堆硬件,而是抠资源。每一路Sensor、每一个ISP模块、每一毫秒的DDR带宽,都是你手里的牌。怎么打,全看你对系统的理解有多深。