三年前在一家3D人脸识别的芯片公司,先后做过两个稍具规模的芯片项目,因为各种原因,这些最终都没有上市,成为沉寂在实验室的产物。但是这些芯片的总体设计都颇具匠心,自己在当时也很有触动,现在拿出一点来供读者欣赏。为不侵犯原有设计者的创作,所有列举的芯片结构图已经经过本人抽取和改动,只为学习和演示这些设计的原理。
首先介绍的是一款当时爆炒的关于人脸识别的门锁芯片的VI系统,该系统如下所示,支持单摄象头和双摄像头模式。所有支持门锁应用的摄像头必须具有外部触发的slave方式,同步外部的sync 脚给过来的脉冲来触发每一帧sensor图像的输出。双设模式时在单摄像头上的分时演进,在dphy0 和dphy1 上接的两颗摄像头必须型号出图都完全一致,然后通过在switch 部件的后面VID IN的中断中根据实际需求去切换选择sensor。下面具体解释下在单摄像头情形下的图像数据的流动和处理。
-
首先在dphy0或者dphy1 上接入一颗输出图像在5M 尺寸以下,出图30帧的IR sensor,配置switch模块的开关sensor_sel,正确选择链接的外部sensor。图像数据流从dphy 经过MIPI RX,通过switch模块选择进入到VID_IN 模块。 从VID_IN 模块处理出来后,数据分成两路,一路到经过左边的rgb bayer gen, 从IR变换成raw RGB的图像数据,然后经过display 多路器,通过 resize 模块缩放处理,最终通过am4_wr写入到显示需要用到的DDR buffer。这是送往显示的一路。
从VID_IN 模块处理出来的右边的一路 ,经过lsc 光圈效果处理,出来后左边一路给到AE统计模块,生成统计的亮度分布信息,在统计结束后,通过中断和寄存器给出来统计结果。右边一路继续往下,经过gamma处理,提升合适的亮度。
然后通过after1 模块,after1 模块可以打开关闭往after2 模块的输出。如果打开,after2模块也同样可以选择往display 多路器和 am1_wr的输出, 往display 多路器输出必须配置多路器的选择开关disp_sel。am1_wr的输出直接将gamma处理后的图像输出到DDR buffer。这after1,after2模块时可选打开模块,场景不使用时可以采用默认的关闭状态。
after1 后面的crop 将sensor过来的全尺寸图裁剪到深度引擎可以处理的尺寸,一般不超过640 * 480,通过rectify模块将裁剪后的图像修正效果,将像素坐标系的图转换成世界坐标系的图。在depth模块这个核心模块做各像素的对应位置的深度信息产生,产生出来的深度信息也是640*480的图像。depth模块在运行前需要对各种sensor对具体的参考图标定,一般是在1米的距离对黑白色卡做上斜,下斜,正对等各种角度的采样,最后由PC端的工具产生出参考图,运行时通过am1_rd 模块读取到depth模块中去。深度图生成后,可以通过后面的resize模块缩放到需要的尺寸,然后最终写入DDR buffer,由后面的软硬件模块去判断当前截取的人脸信息和 实际注册登记的数据库中各种深度图像的相似度,从而决定门锁的开关。这是一般正常运行过程中产生的使用的图像数据流的规划,使用display这个模块通路做显示,使用it isp到depth这一通路做深度计算。下面说说关于am4_rd 模块, am1_wr模块这些非常规模块。
在实际开发验证的过程中,am4_rd模块可以做offline级别的验证,在sensor 没有点起来之前,先行使用之前已经有的纯净图和散斑图,通过读入到crop后面的模块,直接做后级验证。等前面的sensor 和效果都OK之后,再通过crop切换 isp输出上。
am1_wr,可以拿来做isp调教后的效果输出,来确保进入depth 模块通路前的图像效果对比。
这就是验证的一个基本思路。offline的通路和am1_wr1的设计将直接的这条漫长的depth通路的问题可以分段处理,加速了后续验证和正常开发使用的效率。
这是关于这颗门锁项目的人像处理的视频输入系统部分。另外这颗芯片还有关于功耗设计的优化,主芯片是arm m0的内核实现, 包含几乎所有的基本的外设端口,包括指纹识别这类,人像识别部分是risc-v架构的cpu实现,包含video input,video output,vide codec,NPU……等。在平常时刻,人没有走近门,mcu没有通过人像以外的方式识别到人,那mcu和cpu 都处于超低功耗的待机方式。当mcu识别到人走近,那mcu给cpu上电,并且通过处理器中断,通知cpu进行人像识别的动作,等上述识别到的结果给出来,cpu通过处理器间中断反馈给mcu,mcu决定是否开门,并给cpu下电。