AI-ISP:手机相机是如何将风景变成图片的?

news2024/11/15 8:08:59

在这里插入图片描述

文章目录

    • 前言
    • 1. ISP芯片
    • 2. Sensor知识
    • 3. RAW数据
    • 4. ISP Pipeline
    • 5. AI-ISP
    • 结束语

前言

  本篇文章只干一件事:AI-ISP:手机相机是如何将风景变成图片的?

1. ISP芯片

  一颗小小的SoC芯片(10mm x 10mm)上集成了一百多亿个晶体管(Kirin 9000有153亿),其集成的各个模块共同支撑手机功能实现,如负责手机应用流畅切换的CPU、支持游戏画面快速加载的GPU,专门负责实现AI运算和AI应用实现的NPU以及手机拍照担当的ISP等等。按照书上的介绍,大致绘制了一块SoC预览图:

在这里插入图片描述

  ISP(Image Signal Processor),即图像信号处理器的缩写,主要用来处理前端图像信号,它能够将光信号变成电信号,是图像处理的核心器件。因此其性能会直接影响手机的拍照、摄像效果。
  当打开手机准备拍照时,镜头(Lens)会首先把被摄景物投影在图像传感器(Sensor)上。与此同时,影像处理器(ISP)会通过测光、测距算出合适的参数并指示镜头对焦。随着拍照键的按下,Sensor会完成一次曝光,并通过ISP的处理将其变成图片。大致流程如下:

在这里插入图片描述
  所以呢,本篇侧重点在ISP是如何将Sensor的输出数据转换成RGB图像的。

2. Sensor知识

  参考文章:CMOS图像传感器

  CMOS(Complementary Metal Oxide Semiconductor),即互补金属氧化物半导体,是一种可记录光线变化的半导体,主要利用硅和锗做成的半导体,使其在CMOS上共存着N型和P型半导体,这两个互补效应所产生的电流即可被处理芯片记录和解读称图像(数电书中也有介绍)。CMOS图像传感器(CMOS imager Sensor ),简称CIS,即采用CMOS工艺的图像传感器,一种利用光电技术原理所制造的图像传感元件。
  按道理Sensor输出的是RGBraw data,每个像素点都感知RGB 3个分量的数字这样最准确。但是这样需要3套感光板,而且RGB3套数据还需要时间同步和对齐,这样成本高,难度大。所以,实际中通常采用一个叫Bayer色彩滤波阵列(Bayer Color Filter Array, CFA)的滤光板,放在一个感光板上。CFA(Color Filter Array),即彩色滤波列阵,由于CIS本身是无法感受光的波长,也就是不能感知颜色,CFA的作用是为了让CIS能够感受色彩,目前主流采用Bayer阵列,也称RGGB或者RGB Bayer,一般有四种Bayer PatternBGGRGBRGGRBGRGGB。比如下面的BGGR模式:

在这里插入图片描述

  像素(Pixel),是图像传感器的最小感光单元,像素阵列排列在一起形成了图像传感器的感光区域。
  像素尺寸(Pixel Size),是指图像传感器单个感光元件的尺寸,一般我们能看到两种表述,比如1.12μm或者1.12μm×1.12μm。像素的尺寸越大,接收光子的数量就越多,同光照条件和曝光时间内产生的电荷也越多。

3. RAW数据

  博主我从手机里导出了.jpg和对应的.dng数据:

在这里插入图片描述
  左侧为原始的RAW数据(76.2MB),右侧为手机相机(ISP)自动处理后的RGB数据(4.74MB)
  下面使用库读取RAW数据来看一下详细的信息:

import rawpy


raw_file = '../raws/IMG_20230418_143110.dng'
raw_data = rawpy.imread(raw_file)

# 查看有木有缩略图
try:
    thumb = raw_data.extract_thumb()
except rawpy.LibRawNoThumbnailError:
    print('no thumbnail found')

# 返回给定坐标相对于完整 RAW 大小的颜色索引
color_index = raw_data.raw_color(0, 0)
print(color_index)

# 返回相对于完整RAW图像的给定位置的RAW值
raw_value = raw_data.raw_value(0, 0)
print(raw_value)

# 返回相对于图像可见区域的给定位置的RAW值
raw_value = raw_data.raw_value_visible(0, 0)
print(raw_value)

在这里插入图片描述
  根据color_descraw_pattern两个属性可知,此RAW数据的Bayer模式为BGGR,推理如下:

  color_desc值为RGBG,对应索引为0123,而raw_pattern的值为2310,转换为颜色值就是BGGR

  局部放大RAW图像,代码及结果如下:

import rawpy
import matplotlib.pyplot as plt
import seaborn as sns


raw_file = '../raws/IMG_20230418_143110.dng'
raw_data = rawpy.imread(raw_file)

# plt.imshow(raw_data.raw_image_visible)
sns.heatmap(raw_data.raw_image_visible[:10, :10], cmap=plt.cm.binary)
# plt.savefig('../raws/ori_raw_10x10.png')
plt.show()

在这里插入图片描述
  以下是rawpy.RawPy对象的所有属性,更详细的可以参考官方的文档:

属性含义
black_level_per_channel每通道黑电平校正
camera_white_level_per_channel从原始文件元数据读取的每通道饱和度,没有就是None
camera_whitebalance白平衡系数
color_desc编号从 03 的颜色(RGBG、RGBE、GMCY or GBTG)的字符串说明。需要注意的是,相同的字母可能表示不同的颜色
color_matrix颜色矩阵,从某些相机的文件中读取,为其他相机计算。颜色矩阵的shape[3, 4]
daylight_whitebalance日光的白平衡系数(daylight balance)。从文件中读取,或根据文件数据计算, 或取自硬编码常量
num_colors颜色数量。 请注意,例如,对于RGBG,这可能是3或4,具体取决于相机型号, 因为有些人使用两种不同的绿色
raw_colorsRAW 图像中每个像素的颜色索引数组。 相当于为每个像素调用 raw_color(y, x)
raw_colors_visibleraw_colors,但是没有margin
raw_imageRAW图像,包括margin,对于Bayer 图像,将返回 2D ndarray。 对于Foveon和其他RGB类型的图像,将返回3D ndarray。 请注意,可能有 4 个颜色通道,其中第 4 个通道可以是0
raw_image_visibleraw_image,但是没有margin
raw_patternBayer阵列的模式
raw_type返回RAW数据的类型,比如RawType.Flat
rgb_xyz_matrix相机 RGB - XYZ 转换矩阵。 此矩阵是常数(不同型号不同),RGB 相机的最后一行为零,不同颜色型号(比如CMYG 等)的最后一行为非零,转换矩阵的shape[4, 3]
sizes返回RAW图像和后处理(postprocessed)图像的信息,包含在rawpy.ImageSizes对象中
tone_curve相机色调曲线,从尼康,索尼和其他一些相机的文件中读取。长度为65536
white_level原始像素值被认为饱和的级别

4. ISP Pipeline

  看了相关的参考资料,这里的情况很复杂,内容太多太多啦,博主我就简单的梳理了以下,仅供参考:

在这里插入图片描述
  这里根据网上的一些博客做了整理:
  1. BLC(Black Level Correction)
  黑电平校正,由于Sensor漏电流存在,把镜头放入一个全黑的环境,Sensor输出的原始数据不为0,而我们希望全黑时原始数据为0
  2. LSC(Lens Shade Correction)
  镜头阴影校正,由于随着视场角慢慢增大,能够通过照相机镜头的斜光束将慢慢减少,导致Senor捕获的图像中间亮度高,周围边缘亮度低。
  3. BPC(Bad Point Correction)
  坏点校正,也叫Defect Pixel Correction(DPC),由于Sensor是物理器件,有坏点是难以避免的;而且使用时间长了坏点会越来越多。通过在全黑环境下观察输出的彩点和亮点,或在白色物体下观察输出的彩点和黑点,就可以看到无规律的散落在各处的坏点。
  4. Demosaic
  去马赛克,对空白部分进行线性插值,也叫颜色插值,使其具有颜色(就是每个像素点具有三种颜色)。
  5. DR(Denoise)
  去除噪声,具体也有很多中,比如2DNR3DNR等,Senor的感光器件包含模拟部分,所以信号中的噪声很难避免,ADC器件本身也会引入噪声。另外,当光线较暗时,整个系统需要将信号放大,这样噪声也跟着放大。
  6. AWB(Automatic White Balance)
  自动白平衡,人类的视觉系统有一定的颜色恒常性特点,不会受到光源颜色的影响。实际生活中,不论是晴天、阴天、室内白炽灯或日光灯下,人们所看到的白色物体总是是白色的,这就是视觉修正的结果。人脑对物体的颜色有一定先验知识,可识别物体并且更正这种色差。但是Sensor不具备这样的特点,比如一张白纸,在不同光线下,Sensor输出的是不同颜色,在低色温下偏黄,在高色温下偏蓝。如白炽灯照明下拍出的照片易偏黄;而在户外日光充足则拍摄出来景物也会偏蓝。我们就需要,让不同色温光线条件下白色物体,Sensor的输出都转换为更接近白色。
  7. CCM(Color Correction Matrix)
  颜色校正,Sensor图像传感器获取的图像,与人们期望的颜色有距离,必须矫正。AWB已经将白色校准了,CCM就是用来校准除白色以外其他颜色的准确度的。
  8. RGB Gamma
  Gamma校正,人眼不同于摄像机,接收光子来感知光线。比如:在一间小黑屋中每增加一盏灯,摄像机都能线性增加亮度。但是人眼在黑暗时增加一盏灯时感受明显,往后随着灯的个数增长人眼并不会有明显感受。(人眼非线性)
  9. CSC(Color Space Conversion)
  色彩空间转换,在YUV 色彩空间上进行彩色噪声去除、 边缘增强等更方便,且YUV存储和传输时更省带宽。比如,RGBToYUV
  10. HDR(High-Dynamic Range)
  高动态范围,自然界的中光强度很宽,而人眼对高亮,极暗环境的细节分辨能力相对较窄,而摄像头记录的范围更窄,真正的HDR技术就是记录视觉范围内高亮,极暗环境的中的细节分辨率。为保证人眼看到的世界和显示器或者摄像头采集的图像的亮度范围相差无几,甚至更好,需要通过tone mapping,将暗处和亮出细节再现。这是一种纯粹为了视觉感受而进行的处理,并非真正的HDR。简而言之,宽动态技术可以使场景中特别亮的区域和特别暗的区域在最终成像中同时看清楚。
  11. Color denoise / Sharpness
  锐化,主要是对YUV降噪处理,同时为了消除降噪过程中对图像细节的损失,需要对图像进行锐化处理,还原图像的相关细节。因为在YUV色彩空间,这些处理更方便。
  12. AEC(Automatic Exposure Control)
  自动曝光,不同场景下,光照的强度有着很大的差别。人眼有着自适应的能力因此可以很快的调整,使自己可以感应到合适的亮度,而图像传感器却不具有这种自适应能力,因此必须使用自动曝光功能来确保拍摄的照片获得准确的曝光从而具有合适的亮度。

  篇幅有限,下面就仅看一下Demosaic是如何进行操作的。正如上述所说,再具体一点,就是将无颜色的RAW图像转为RGB三通道的彩色图像,示例图如下:

在这里插入图片描述
  代码实现如下:

import rawpy
import cv2
import numpy as np
import matplotlib.pyplot as plt


raw_file = '../raws/IMG_20230418_143110.dng'
raw_data = rawpy.imread(raw_file)
# rawpy内置VNG-Demosaic算法
rgb_data = raw_data.postprocess(demosaic_algorithm=rawpy.DemosaicAlgorithm(1))
# print(rgb_data.shape)
plt.imshow(rgb_data)
plt.savefig('../raws/isp_rgb.png')


with rawpy.imread(raw_file) as raw:
    bayer_img = raw.raw_image.copy()
bayer_img = np.uint8(bayer_img)		# uint16 --> uint8
# opencv内置VNG-Demosaic算法
rgb_img = cv2.demosaicing(bayer_img, cv2.COLOR_BAYER_BG2RGB_VNG)
# print(rgb_img.shape)
plt.imshow(rgb_data)
plt.savefig('../raws/isp_rgb_cv2.png')

  效果如下:

在这里插入图片描述

在这里插入图片描述

  参考博客如下:
  1. ISP全流程简介:https://www.ngui.cc/article/show-954304.html
  2. 我收藏的几篇知乎文章:https://www.zhihu.com/collection/865188946

5. AI-ISP

  AI ISP是最近几年才出来的一个新的技术概念,当面对越来越高的场景复杂度和特殊的图像质量要求时,传统ISP正面临了参数库逐渐庞大、调试困难、开发周期逐步拉长等挑战。以AI技术为辅助,通过机器学习的方法来强化ISP的功能就成为技术发展的重要方向,由此诞生了AI ISP
  在2018年,英特尔实验室的《Learning to see in the dark》论文中提出,可以通过整个神经网络来实现ISP的全部功能。在这篇论文中,通过一个RAW图进入,然后输出RGB或者YUV图像。到目前为止,还没有听说哪家的ISP产品是由整个神经网络完成的。

在这里插入图片描述
  在爱芯的Pipeline中,只将其中重要的模块进行AI化,将有限的算力集中于整个AI ISP中,最关键、人眼最可知的这些功能中,比如像HDR、去噪的3DNRtone mapping,还有demosaic这样的功能中进行AI化,以实现整个AI ISP的最佳效果。

在这里插入图片描述
  在爱芯的整个ISP中,有一个专门为了ISP设计的NPU,这个NPU和传统其他芯片中的NPU并不完全一样,除了强调计算单元之外,还有Pre-ProcessPost-Process和一个更大的Shared Memory,以及一些针对AI ISP的流式处理和CV的处理操作,可以使其算力在AI的图像处理中能够有更好的提升。

  参考文章:AI视觉芯片干货分享:深度讲解AI ISP的技术原理([https://zhuanlan.zhihu.com/p/467137601](AI视觉芯片干货分享:深度讲解AI ISP的技术原理))

结束语

  持续充电中,博客内容也在不断更新补充中,如有错误,欢迎来私戳小编哦!共同进步,感谢Thanks♪(・ω・)ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pandas】Python读取DataFrame的某行或某列

行索引、列索引、loc和iloc import pandas as pd import numpy as np # 准备数据 df pd.DataFrame(np.arange(12).reshape(3,4),indexlist("abc"),columnslist("WXYZ"))行索引(index):对应最左边那一竖列 列索引(columns):对应最…

建筑数据破解JS逆向爬虫

建筑数据破解JS逆向爬虫 地址:https://jzsc.mohurd.gov.cn/data/project GitHub地址:https://github.com/NearHuiwen/JzscCrawler RequestsPyExecJS JS文件:req_aes.js 目标 抓包,抓取建筑市场数据(注:用于学习&am…

multi-scale training多尺度训练

文章目录 背景参考1:[输入不同长度的向量,输出相同长度](https://www.zhihu.com/question/569406523/answer/2780168200):参考2:[多种尺寸的图像数据训练没有全连接层的卷积神经网络模型](https://www.zhihu.com/question/533481647)参考3&am…

展开说说:Adobe XD 哪个版本好用?

工具还是得顺着自己的习惯才是最好 即时设计 - 可实时协作的专业 UI 设计工具即时设计是一款支持在线协作的专业级 UI 设计工具,支持 Sketch、Figma、XD 格式导入,海量优质设计资源即拿即用。支持创建交互原型、获取设计标注,为产设研团队提…

如何快速将PDF文件转换为Word文档

PDF文件是一个广泛使用的电子文档格式,其被广泛应用于各种领域,包括教育、商业和政府。虽然PDF文件非常实用,但有时你需要将其转换为Word文档,以便更方便地编辑和处理。以下是几种快速将PDF文件转换为Word文档的方法。 1. 使用在…

Linux Shell 实现一键部署http+用户名密码登录

Apache 前言 Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等…

【python】采集天气数据并作可视化,怀念一下之前得好天气

前言 这几天,长沙得天气突然爆冷,每天上班跟渡劫一样 生怕一不小心,风就把伞吹跑了,人湿点无所谓,但是我得伞不能有事 现在得我无比怀念之前得好天气,今天我就来采集一下天气数据并作个可视化怀念一下它…

C# 特性(Attribute)

一、特性(Attribute)定义 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。 特性使用中括号…

ArduPilot之开源代码框架

ArduPilot之开源代码框架 1. 系统框架2. 工程框架2.1 工程目录2.2 代码组成2.3 运行流程 4. 硬件传感器总线4.1 I2C4.2 SPI4.3 UART4.4 CAN 5. 软件设计概念6. 总结7. 参考资料 在研读ArduPilot的过程,尝试用一些中文的词汇来描述,可能会造成某些理解上的…

sparksql select后插入自己 报错 Cannot overwrite a path that is also being read from

问题现象 spark.version < 3.0.1 执行下面语句报错: Cannot overwrite a path that is also being read from ... 哪些情况算同时读写自己? 如果读自己和写自己在一个spark stage中,就算同时读写自己. spark.table("tb1")// 其他stransform.write.mode("…

运维监控工具PIGOSS BSM扩展指标介绍

PIGOSS BSM运维监控工具&#xff0c;除系统自带指标外&#xff0c;还支持添加SNMP扩展指标、脚本扩展指标、JMX扩展指标、自定义JDBC指标等&#xff0c;今天本文将介绍如何添加SNMP扩展指标和脚本扩展指标。 添加SNMP扩展指标 前提&#xff1a;需要知道指标的oid 例子&#xff…

刚毕业在深圳做程序员,我来聊聊月薪1万在大城市生活能剩下多少

我今年刚毕业&#xff0c;然后在大城市做IT&#xff0c;可能工资大概1万左右。现在讨论一下&#xff0c;月薪1万在大城市最后能留下多少。以下是兴哥的一位刚毕业没多久的程序员朋友&#xff0c;给大家分享一下程序员的薪资水平&#xff0c;在大城市生活 &#xff0c;一个月会剩…

JDBC重点

JDBC初识 DriverManager 将第三方数据库厂商的实现驱动jar注册到程序中可以根据数据库连接信息获取connection Connection 和数据库建立的连接,在连接对象上,可以多次执行数据库curd动作 可以获取statement和 preparedstatement,callablestatement对象 Statement | Prepare…

网络基础,InetAddress,Socket,TCP,UDP

概念&#xff1a;两台设备之间通过网络实现数据运输网络通信&#xff1a;将数据通过网络从一台设备传输到另一台设备java.net包下提供了一系列的类或接口&#xff0c;供程序员使用&#xff0c;完成网络通信网络&#xff1a;两台或多台设备通过一定物理设备连接起来构成了网络根…

go1.20环境安装以及beego框架配置

打开网址下载安装包选择对应安装包来下载安装(个人是windows&#xff0c;下载的1.20.3版本) 默认情况下会安装在C盘&#xff0c;但是我安装在了D盘目录 根据安装提示一步步next&#xff0c;直至完成 go get 在1.18版本之后就弃掉了&#xff0c;换成了install 配置自己的work…

Spring Cloud Alibaba全家桶——微服务链路追踪SkyWalking

前言 本文小新为大家带来 微服务链路追踪SkyWalking 相关知识&#xff0c;具体内容包括SkyWalking简介&#xff0c;SkyWalking环境搭建部署&#xff0c;SkyWalking接入微服务&#xff0c;SkyWalking持久化跟踪数据&#xff0c;自定义SkyWalking链路追踪&#xff0c;SkyWalking集…

ARM相关重点

一、概念&#xff1a; 指令&#xff1a;就是一条汇编指令 指令集&#xff1a;很多条汇编指令的集合 架构&#xff1a;随着ARM产品的迭代升级&#xff0c;对ARM指令集的命名 armv1~armv6已经淘汰 armv7~armv8市面正在使用的 armv9:2021年刚上市 内核&#xff1a;根据不同的a…

SpringCloud分布式请求链路跟踪——Sleuth

Sleuth 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 随着微服务越来越多&#xff0c;可能会出现A调B&#xff0c;B调C、D等多重调用的情况&#xff0c;出现问题不易排查。 Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案&#xff0c…

软件测试高频面试题【附答案解析】

面试指导 软件测试理论刷题篇mysql数据库刷题库linux操作系统刷题篇软件测试工程师面试篇 一. 软件测试理论刷题篇 1.软件测试的意义是什么&#xff1f; 思路&#xff1a;什么是软件测试→软件测试的含义 什么是软件测试&#xff1a;在规定的条件下对程序进行操作&#xf…

【错误:A component required a bean of type ‘xxx‘ that could not be found.解决办法】

在学谷粒商城项目的时候出现了以下问题&#xff1a; *************************** APPLICATION FAILED TO START *************************** Description: A component required a bean of type org.redisson.Redisson that could not be found. Action: Consider defining a…