3. 图像传感器与ISP管线:从光子到数字图像
做嵌入式AI算法,尤其是3A算法,你绕不开一个东西——图像传感器和ISP。说白了,摄像头就是算法的眼睛。眼睛不好使,后面算法再牛也白搭。
我个人习惯,拿到一个项目,先不看算法模型,先看传感器型号和ISP架构。为什么?因为RAW数据的质量,直接决定了3A算法的天花板。
3.1 CMOS传感器工作原理
现在市面上99%的手机、安防、车载摄像头,用的都是CMOS传感器。CCD?基本退出消费市场了,功耗太高,成本也高。
CMOS怎么工作的?我简单给你拆解一下:
- 光电转换:每个像素点有一个光电二极管,光子打上去,产生电子。光子越多,电子越多。
- 电荷积累:曝光时间内,电子不断积累。曝光时间越长,积累的电荷越多。
- 读出转换:曝光结束,通过行选、列选电路,把每个像素的电荷量读出,转换成电压,再经过ADC(模数转换器)变成数字信号。
关键指标:满阱容量(Full Well Capacity)、量子效率(QE)、暗电流、读出噪声。这些参数直接影响动态范围和信噪比。我见过不少项目,算法调得再好,传感器暗电流太大,暗光下全是噪点,3A算法根本救不回来。
嗯,这里要注意一个概念——卷帘快门 vs 全局快门。CMOS主流是卷帘快门,逐行曝光。拍静态场景没问题,但拍快速运动的物体,会出现「果冻效应」。我做车载项目时,就因为这个吃过亏,后来换了全局快门传感器才解决。
3.2 Bayer阵列与RAW数据格式
CMOS传感器本身只能感知光的强度,分不清颜色。那彩色图像怎么来的?靠滤光片阵列。最主流的就是Bayer阵列。
Bayer阵列长这样:
R G R G ...
G B G B ...
R G R G ...
G B G B ...
每个像素只采集一种颜色。绿色像素占一半,红蓝各占四分之一。为什么?因为人眼对绿色最敏感。
传感器直接输出的,就是这种Bayer格式的RAW数据。每个像素8bit、10bit、12bit甚至14bit。我建议做3A算法时,尽量用RAW数据做分析,而不是用经过ISP处理后的YUV或RGB。为什么?因为RAW数据最原始,没有经过任何「美化」,最能反映真实光照情况。
| RAW位深 | 动态范围 | 典型应用 |
|---|---|---|
| 8bit | 48dB | 低端摄像头 |
| 10bit | 60dB | 手机摄像头 |
| 12bit | 72dB | 安防、车载 |
| 14bit | 84dB | 专业相机 |
避坑指南:我曾经在项目中直接用8bit RAW数据做AWB统计,结果发现色温判断总是不准。后来才意识到,8bit量化太粗,暗部细节丢失严重。换成10bit后,AWB准确率提升了一大截。所以,能用高位深就别用低位深。
3.3 ISP(图像信号处理)流水线介绍
RAW数据不能直接用。你得经过ISP处理,才能变成人眼看舒服的图像。ISP流水线,说白了就是一系列图像处理模块串在一起。
典型的ISP流水线:
- 黑电平校正(BLC):去掉传感器暗电流带来的固定偏移。
- 镜头阴影校正(LSC):镜头边缘亮度衰减,得补偿回来。
- 坏点校正(DPC):传感器总有坏点,得插值补上。
- 去马赛克(Demosaic):Bayer转RGB,插值出每个像素的R、G、B值。
- 白平衡(AWB):让白色物体在不同光源下看起来都是白的。
- 颜色校正(CCM):把传感器颜色空间映射到标准颜色空间。
- Gamma校正:人眼对暗部更敏感,Gamma曲线做非线性映射。
- 自动曝光(AE):调整曝光时间和增益,让图像亮度适中。
- 自动对焦(AF):调整镜头位置,让图像最清晰。
- 降噪(NR):去除噪声,保留细节。
- 锐化(Sharpening):增强边缘,让图像更清晰。
你想想看,这么多模块,每个都有参数要调。而且模块之间互相影响。比如你改了AWB的增益,AE的统计结果也会变。这就是为什么3A算法要联动。
下面这张图,是我自己总结的ISP流水线框架,你可以对照着看:
3.4 3A算法在ISP中的位置
3A算法——自动曝光(AE)、自动白平衡(AWB)、自动对焦(AF)——不是ISP流水线里的「一个模块」,而是三个独立的控制环路。它们从图像数据中提取统计信息,然后反馈控制传感器和镜头。
具体位置:
- AE:通常在Demosaic之后,统计亮度直方图或平均亮度,反馈控制曝光时间、模拟增益、数字增益。
- AWB:通常在Demosaic之后、CCM之前,统计色温信息,反馈控制R/G/B通道增益。
- AF:通常在锐化之后,统计对比度或相位差信息,反馈控制镜头马达位置。
重要提醒:3A算法不能独立调优。我见过最典型的错误——AE和AWB各自为政,结果AE一调整,图像亮度变了,AWB的色温统计也跟着变,两个环路互相打架,图像忽明忽暗、颜色乱飘。正确的做法是:3A算法要有优先级和协调机制。通常AE优先,AWB次之,AF最后。
在实际嵌入式部署中,3A算法通常跑在ISP硬件的前端或后端协处理器上。为什么?因为实时性要求高。30fps的视频流,每帧只有33ms的处理时间。3A算法必须在几帧内收敛,否则用户能明显感觉到闪烁或颜色漂移。
我记得有一次做安防摄像头项目,ISP芯片的3A算法是硬件实现的,但客户非要自己写软件3A。结果呢?软件跑在ARM上,每帧统计时间就占了15ms,再加上控制计算,帧率直接掉到15fps。后来还是切回了硬件3A,配合软件微调,才把性能拉回来。
所以,我的建议是:能用硬件3A就用硬件3A,软件只做参数微调和场景切换。除非你做的平台没有硬件ISP,那才考虑纯软件实现。
实战技巧:调试3A算法时,先把AE锁定,单独调AWB。AWB调准了,再放开AE。最后调AF。分步调试,问题定位快得多。我曾经一口气调三个环路,结果调了三天没调通,后来拆开调,一天搞定。