【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
我们学习Infinite-ISP开源代码之外,除了想了解一下isp的基本原理,把代码编译出来之外,其实还可以自己编写一下算法。这样不仅对isp有一个更加深刻的认识,还能在实际项目中为自己所用。其实在实际产品中,固定的isp未必能满足客户的所有要求,那么此时用fpga对isp做增强处理,就是意料之中的事情了。在用fpga处理之前,就可以用python做一下简单的设计和预研即可。

1、确认算法在流程中的位置
实际开发之前,需要确认一下新算法的位置。它的前面一个算法是哪个,后面一个算法是哪个,这个算法要达到什么目的。

2、确认算法的参数,部署到configs.yml文件
lens_shading_correction:
is_enable: false
is_save: false
3、参数解析添加到load_config
self.parm_lsc = c_yaml["lens_shading_correction"]
4、算法添加到run_pipeline
# =====================================================================
# Digital Gain
dga = DG(oecf_raw, self.platform, self.sensor_info, self.parm_dga)
dga_raw, self.dga_current_gain = dga.execute()
# =====================================================================
# Lens shading correction
lsc = LSC(dga_raw, self.platform, self.sensor_info, self.parm_lsc)
lsc_raw = lsc.execute()
# =====================================================================
# Bayer noise reduction
bnr = BNR(lsc_raw, self.sensor_info, self.parm_bnr, self.platform)
bnr_raw = bnr.execute()
5、实现算法本身your_algo.py
在Infinite-ISP开源包里面,lens shading correction这个算法其实并没有实现。如果有些朋友需要练手自己设计的算法,不妨拿它试试,
"""
File: lens_shading_correction.py
Description:
Code / Paper Reference:
Author: 10xEngineers Pvt Ltd
------------------------------------------------------------
"""
class LensShadingCorrection:
"""
Lens Shading Correction
"""
def __init__(self, img, platform, sensor_info, parm_lsc):
self.img = img
self.enable = parm_lsc["is_enable"]
self.sensor_info = sensor_info
self.parm_lsc = parm_lsc
self.platform = platform
def execute(self):
"""
Execute Lens Shading Correction
"""
print("Lens Shading Correction = " + str(self.enable))
if self.enable:
return self.img
else:
return self.img
6、测试和验证
如果是前期开发阶段,可以通过肉眼导入raw图进行验证,但是到了后期,比如生成了bitfile,就要专门去进行处理调优了,这个时候一般要做这么几件事情,
(a)准备好对应的sensor和驱动;
(b)准备好开发板;
(c)启动开发板isp server,准备上位机isp tunning tool;
(d)准备好测试的道具,比如彩色卡、灰度渐变卡、棋盘格、灯箱、毛玻璃、道具头像等;
(e)找到尽可能多的ground truth图片;
(f)找到soc厂家的文档,开始准备调试,边学习边验证,比如rk的isp文档就比较齐全;
(g)测试的时候,可以一步一步enable isp里面的算子,从bayer到rgb到yuv,从前往后算子慢慢放开,及时保存配置文件。如果发现偏差较大,就立马返工重新标定,这样就会越来越熟练,越来越成熟。
每个厂家都有自己的isp调试文档,只不过有的好找,有的不好找,某火的isp调试文档还可以,建议可以多看看,
https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/quick_start/isp/isp.html
主要标定的流程如下所示,

ground truth图片可以尽可能多找一点,一个是raw图,一个是ground truth(比如好的单反相机拍出来的图片)。不同场景下调图ok之后,再用raw图和ground truth做局部微调,这样慢慢挑出一个自己需要的isp效果出来。本身开源代码assets目录下就有这样的对比图。
注:
图中的添加的算法都是串行的,事实上在最后阶段,y/u/v分开处理,不同的部分用不同的算法,是并行处理,最终encode的时候merge在一起的,这也是非常常见的做法。