Camera ISP-知识大纲

人工智能58

随着工作时限的增长,与工作相关的知识点已经开始慢慢的从一个个孤立的点向着还尚未成型的网进化而去,虽然还未完全成型,但是基本的轮廓已然影影绰绰。为了对知识面进行一个总结归纳,也为了巩固并拓展目前的知识面,所以准备开一个新的专题,就是 Camera 的 ISP 知识专题,这个专题应该会成为一个长期更新的专题。

到现在为止 Camera ISP 仍然在总体上还是一个偏经验的东西,就是说它不是一个标准化的流程,ISP 全称:Image Signal Processor。它不是一个具体的什么模块,而是一个流程,目的就是把 Camera 图像传感器收集到的图像从电平信号转换为可存储的像素数据,并且要使得输出图像效果要符合每家厂商的主观审美。而市面上会生产 ISP 软硬件的消费品公司我们熟知的就是手机和数码相机,而众所周知,各家的图像效果又是不一样的,这个不一样不是某几块不一样,而是整个整体观感都是不一样的,所以从这个角度来看也可以说它不是一个标准化的流程,而是有着极大的创作灵活度的。

而在 ISP 这个庞大的流程当中,自然也不可能全是不可捉摸的经验,还是有很多很多的基础理论的,这些理论本质上是标准化的,只是说应用的时候大家用法不太一样。而这个系列就打算穿插这些统一的理论和一部分不一样的应用来对自己的工作进行复习巩固和拓展。基本上内容可以分为下面几个大的方面:

ISP 基础理论

这个其实没有明确的定义,反正按照我自己的归类去写了,具体来说大概就是色彩原理,曝光、摄影基本概念等等,会大量参考:https://www.cambridgeincolour.com/learn-photography-concepts.htm 这里的文章。这些基本上是属于完全的理论知识部分,怎么说呢,就有点像是内功心法这个感觉,但又不完全是,相当于是一个入门的概念解析吧。

这部分我也没有全部看过,都是在工作当中的被动学习以及少部分主动了解的,属于是一种无意识的知识接纳,所以这块对于我自己来说也是一个归整的时机,让自己更多的去了解一个基础的概念性质的知识点,相信对自己还是有不少帮助的。

实时处理、后处理

后处理这部分应该是涵盖范围最广的,Image Warp 也可以归入此类,不过我就分出来了,作为两个部分去写,属于我自己的分类喜好。这部分的处理主要是对图像的质量进行矫正,比如说噪声消除、色彩矫正、亮度对比度调整、色调映射等等。

下一篇计划写的就是 Gamma 这部分,广义上的 Gamma 矫正应该占到了差不多百分之二三十的后处理,包括局部色调映射和全局色调映射应该都是可以算做叫 Gamma 矫正的。剩下一大部分就是降噪和 HDR,然后还有一部分色彩映射边缘增强之类的,其中的重点就是降噪和 HDR,降噪又分为空域降噪和时域降噪,分别有不同的优缺点,这点后面也会提及。而 HDR 则是今年比较关注的部分,因为现在夜景的拍照和视频已经卷到了一定的程度,尤其是华为的夜景起了个卷王的开头,后面手机影像有很大一部分也是关于夜景的比拼了。

这部分我觉得应该会分为:Gamma,LTM,GTM,HDR,降噪等这几个大的部分去写写。

图像变换

这里主要就是说图像的翘曲变换,可以做的常规功能有畸变校正、Roll shutter 矫正、图像防抖、多摄变焦对齐等,这部分的功能复杂度比较高,应该说相对于降噪和 HDR 来说算是复杂度更高一层的图像处理了,有点偏向于计算机视觉的感觉,当然,手机里面的翘曲变换受限于硬件算力等等,并没有计算机视觉里面那么变态。

这部分变换有一个特点就是需要对图像进行标定来获取镜头、sensor 的几何参数,然后再进行进一步的计算,所涉及到的运算有很大一部分都是线性代数、插值运算。图像变换除了多摄变焦对齐和 Roll shutter 矫正目前看起来必须软件算法参与之外,畸变校正和图像防抖一定程度上都是可以被硬件替代的,比如无畸变镜头、光学机械防抖,这些从硬件去做可以达到更好的效果,软件处理必不可少的已经丢失了一部分原始数据信息,再加上算法并不是完美的,得到的效果总是不如硬件方式来得好,不过受限于硬件的规格,软件算法处理这部分现在也是必须的辅助手段,不可缺少。

AI ISP

AI 现在已经有点想用一个 AI 节点处理所有 Raw 到 Jpeg/YUV 域的 ISP 流程,也就是说传统的 ISP pipeline 那么一长串在一定的条件下只需要一个 AI node 就可以替换出相似的效果,这个如果乍一看是有点吓人的,ISP 发展了这么多年就这么被一个 AI 节点给替代了,也代表着数万人的失业。目前为止传统的 ISP 还由于下面几个因素并没有被替换掉:

目前 AI ISP 也是想着把一部分传统 ISP 的节点用 AI 来进行替换,就有点儿类似把一个 AI 节点拆成一个个的特定 AI 模块,听起来是不是跟传统 ISP pipeline 一模一样了,现在就是这种状态,传统的 ISP 朝着 AI 的方向进化,相当于是把一整个 AI 节点拆分的过程逆化了,不知道最后能不能做到一个 AI 节点处理一切。

Original: https://blog.csdn.net/u013904227/article/details/123167857
Author: 嵌入式Max
Title: Camera ISP-知识大纲



相关阅读1

Title: 使用Supervisord软件管理go服务进程

一、介绍Supervisord软件
1、什么是Supervisord?
Supervisord是一个非常优秀的进程管理工具,使用Python开发。它可以在类UNIX系统的方式让用户来准确地监视和控制后台一定数量的服务进程。并作为一个天使进程让后台进程在当发生内部错误退出、或者进程被意外杀死时自动重启。除此之外,supervisord可以监控TCP端口,让其他主机通过客户端了命令supervisorctl通过HTTP协议直接对Server端进程进行启停,避免让进程/服务器管理者直接接触Shell或root用户。进程之间也有一个优先级和进程组关系,让管理员使用start all和stop all的关系来启动。

2、安装Supervisord软件

[root@yyljxl ~]# cat /etc/redhat-release
CentOS Linux release 7.x

[root@www ]# yum -y install supervisor
[root@yyljxl ~]# supervisorctl -h
supervisorctl -- control applications run by supervisord from the cmd line.

Usage: /usr/bin/supervisorctl [options] [action [arguments]]

Options:
-c/--configuration -- configuration file path (default /etc/supervisord.conf)
-h/--help -- print usage message and exit
-i/--interactive -- start an interactive shell after executing commands
-s/--serverurl URL -- URL on which supervisord server is listening
(default "http://localhost:9001").

-u/--username -- username to use for authentication with server
-p/--password -- password to use for authentication with server
-r/--history-file -- keep a readline history (if readline is available)

action [arguments] -- see below

Actions are commands like "tail" or "stop". If -i is specified or no action is
specified on the command line, a "shell" interpreting actions typed
interactively is started. Use the action "help" to find out about available
actions.

出现上面的帮助信息表示安装成功了。

启动服务

systemctl start supervisord
systemctl enable supervisord
systemctl status supervisord

supervisord监控的软件的配置说明

vim /etc/supervisor/conf.d
[program:项目名]
command=/data/www/go/src/test/test.bin
程序启动命令
autostart=true
在supervisord启动的时候也自动启动
startsecs=10
启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true
程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3
启动失败自动重试次数,默认是3
user=root
用哪个用户启动进程,默认是root
priority=999
进程启动优先级,默认999,值小的优先启动
redirect_stderr=true
把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB
stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20
stdout 日志文件备份数,默认是10
stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/data/logs/test/test.log
日志输出的文件地址
stopasgroup=false
默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false
默认为false,向进程组发送kill信号,包括子进程。

官方文档

http://supervisord.org/

3、使用案例
示例:编写一个简单的go web项目
[root@web scripts]# cat mail.go
package main

import (
"fmt"
"net/http"
)

//w, 给客户端回复数据
//r, 读取客户端发送的数据
func HandConn(w http.ResponseWriter, r *http.Request) {
fmt.Println("r.Method = ", r.Method)
fmt.Println("r.URL = ", r.URL)
fmt.Println("r.Header = ", r.Header)
fmt.Println("r.Body = ", r.Body)

w.Write([]byte("hello go")) //给客户端回复数据
}

func main() {
//注册处理函数,用户连接,自动调用指定的处理函数
http.HandleFunc("/", HandConn)

//监听绑定
http.ListenAndServe(":8000", nil)
}

上传程序到Centos7.x系统

yum install go -y

build程序

[root@yyljxl scripts]# go build -o test

生成可执行文件

[root@yyljxl scripts]# ll
total 6416
-rw-r--r-- 1 root root 542 Jun 24 09:15 mail.go
-rwxr-xr-x 1 root root 6562362 Jun 24 09:37 test

运行程序

[root@yyljxl scripts]# nohup ./test &
[1] 14132
[root@yyljxl scripts]# nohup: ignoring input and appending output to 'nohup.out'

查看进程

[root@yyljxl ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::8000 :::* LISTEN 14132/ ./test

4、配置test程序用supervisord监控
[root@www scripts]#
mkdir -p /nulige/scripts/logs
touch /nulige/scripts/logs/test.log

配置supervisor监控test

cat > /etc/supervisord.d/test.ini <

执行命令

[root@yyljxl scripts]# supervisorctl update
test: added process group
[root@yyljxl scripts]# supervisorctl status
test RUNNING pid 15214, uptime 0:00:09

端口占用,导致没有载入成功,kill掉原端口程序,再重新载入

[root@yyljxl scripts]# supervisorctl status
test FATAL Exited too quickly (process log may have details)

重新载入

[root@yyljxl scripts]# supervisorctl reload
Restarted supervisord

更新监控的程序

[root@yyljxl scripts]# supervisorctl update

查看运行状态

[root@yyljxl scripts]# supervisorctl status
test RUNNING pid 15214, uptime 0:00:09

停止服务

[root@yyljxl scripts]# supervisorctl stop test
test: stopped

测试杀当前程序的pid,再观察pid变化。

5、supervisord常用命令

supervisorctl status #监控的程序的运行状态的列表
supervisorctl stop test #停止监控的程序
supervisorctl start test #启动监控的程序
supervisorctl restart test #重启监控的程序
supervisorctl update #更新监控的程序,如有新的配置添加一定要先执行update
supervisorctl reload #载入最新的配置文件,并按新的配置启动、管理所有进程。

Original: https://www.cnblogs.com/nulige/p/11075596.html
Author: 努力哥
Title: 使用Supervisord软件管理go服务进程

相关阅读2

Title: MobilenetV1、V2、V3系列详解

Mobilenet系列模型作为当前主流的端侧轻量级模型被广泛应用,很多算法都会使用其作为backbone提取特征,这一章对Mobilenet系列模型做一个总结。

一、MobilnetV1

MobilenetV1提出了深度可分离卷积(Depthwise Convolution),它将标准卷积分解成深度卷积以及一个1x1的卷积即逐点卷积,大幅度减少了运算量和参数量。下面看一下普通卷积和深度可分卷积的对比:

普通卷积:

Camera ISP-知识大纲

深度可分离卷积:

DW卷积:对每个输入通道(输入深度)应用一个滤波器

Camera ISP-知识大纲

PW卷积:(就是普通的卷积,只不过卷积核的大小为1x1),一个简单的1×1卷积,然后被用来创建一个线性组合的输出的深度层

Camera ISP-知识大纲 两种卷积计算量对比:

Camera ISP-知识大纲

普通卷积层的特征提取与特征组合一次完成并输出,而深度可分离卷积先用厚度为1的33的卷积核( depthwise分层卷积),再用11的卷积核(pointwise 卷积)调整通道数,将特征提取与特征组合分开进行。

Camera ISP-知识大纲

mobileNetV1的网络结构如下,前面的卷积层中除了第一层为标准卷积层外,其他都是深度可分离卷积(Conv dw + Conv/s1),卷积后接了一个7*7的平均池化层,之后通过全连接层,最后利用Softmax激活函数将全连接层输出归一化到0-1的一个概率值,根据概率值的高低可以得到图像的分类情况。

Camera ISP-知识大纲

二、MobileNetV2

mobilenetV2相对于V1的主要优化点为:

  • 倒残差结构:Inverted Residuals
  • Linear Bottlenecks

倒残差结构:

对于倒残差结构的理解,主要在于对 &#x901A;&#x9053;&#x6570;变化(维度变化)的理解。在残差结构中,先使用 1x1 卷积实现降维,再通过 3x3 卷积提取特征,最后使用 1×1 卷积实现升维。这是一个两头大、中间小的沙漏型结构。但在倒残差结构中,先使用 1x1 卷积实现升维,再通过 3x3 的 DW 卷积(逐通道卷积)提取特征,最后使用 1×1 卷积实现降维。调换了降维和升维的顺序,并将 3×3 的标准卷积换为 DW 卷积,呈两头小、中间大的梭型结构。二者比较参见下图:

Camera ISP-知识大纲

这里要注意,只有stride=1且输入特征矩阵与输出特征矩阵shape相同时,才有shortcut连接。

  • 残差模块
    (1) 整个过程为 "压缩 - 卷积 - 扩张",呈沙漏型;
    (2) 卷积操作为:卷积降维 (1×1) - 标准卷积提取特征 (3×3) - 卷积升维 (1×1);
    (3) 统一使用 ReLU 激活函数;
  • 倒残差模块
    (1) 整个过程为 "扩展- 卷积 - 压缩",呈梭型;
    (2) 卷积操作为:卷积升维 (1×1) - DW卷积提取特征 (3×3) - 卷积降维 (1×1);
    (3) 使用 ReLU6 激活函数和线性激活函数。

Linear Bottlenecks

线性瓶颈结构,就是末层卷积使用线性激活的瓶颈结构(将 ReLU 函数替换为线性函数),论文中的解释如下图:

Camera ISP-知识大纲

下面来看一下mbv2的模型结构:

Camera ISP-知识大纲

三、MobileNetV3

mbv3的主要亮点为:

  • 更新Block(bneck):加入SE模块、更新激活函数
  • 使用NAS搜索参数(Neural Architecture Search)
  • 重新设计耗时层结构:减少第一个卷积层的核数(32->16),更新last-stage

mbv3的bneck如下图:

Camera ISP-知识大纲

(NL 代表使用非线性激活函数,并不特指)

SE模块:

在bottlenet结构中加入了SE结构,并且放在了depthwise filter之后,如下图。因为SE结构会消耗一定的时间,所以作者在含有SE的结构中,将expansion layer的channel变为原来的1/4,这样作者发现,即提高了精度,同时还没有增加时间消耗。并且SE结构放在了depthwise之后。实质为引入了一个channel级别的注意力机制,其细节如下:

Camera ISP-知识大纲

更新激活函数:

使用h-swish替换swish,swish是谷歌自家的研究成果,颇有点自卖自夸的意思,这次在其基础上,为速度进行了优化。swish与h-swish公式如下所示,由于sigmoid的计算耗时较长,特别是在移动端,这些耗时就会比较明显,所以作者使用ReLU6(x+3)/6来近似替代sigmoid,观察下图可以发现,其实相差不大的。利用ReLU有几点好处,1.可以在任何软硬件平台进行计算,2.量化的时候,它消除了潜在的精度损失,使用h-swish替换swith,在量化模式下回提高大约15%的效率,另外,h-swish在深层网络中更加明显。

Camera ISP-知识大纲

重新设计耗时层结构:

(1)减少第一个卷积层的卷积核个数(32—>16),减少卷积核的个数但是准确率没变,计算量反而会降低,检测速度更快

(2)精简Last Stage

将延迟时间减少了7毫秒,这是运行时间的11%,并将操作数量减少了3000万MAdds,几乎没有损失准确性。

Camera ISP-知识大纲 (笔者曾经试着在mbv2的模型基础上将last stage参考mbv3的来改动,即将最后的conv放到pooling后面,但是实验结果在笔者的任务上变差了很多。。。所以这里提到的不会损失准确性,笔者保持怀疑态度,大概是和mbv3其他的修改合到一起才能保证不损失精度?)

MobileNetV3-Large 模型结构

Camera ISP-知识大纲

NBN是不使用bn层的 SE打钩才使用注意力机制 exp size对应倒残差块刚开始1*1卷积输出的深度 out对应倒残差块最后的深度。

mbv3-small的模型结构:

Camera ISP-知识大纲

最后附上原论文实验结果:

Camera ISP-知识大纲 写在最后

虽然论文中的结果,mbv3比mbv2在速度和效果上都要好,但是在笔者的一个任务中表现却并非如此,mbv3的模型初始化时间和推理时间比v2都要慢一些(分析过程见:端侧模型性能优化——Flops与访存量的坑_Turned_MZ的博客-CSDN博客),至于效果,mbv2也比mbv3好一些,因此在使用这些网络时,还是需要具体任务具体分析。

Original: https://blog.csdn.net/mingzheng114/article/details/124561633
Author: Turned_MZ
Title: MobilenetV1、V2、V3系列详解

相关阅读3

Title: windows下VS安装CUDA环境配置

CUDA安装见:https://blog.csdn.net/Ang_go/article/details/122329715
本文内容均在已安装VS和CUDA情况下,如需安装教程,请自行搜索。

windows下VS安装CUDA环境配置

一.CUDA环境配置

1.此电脑->属性->高级系统设置->环境变量->系统变量
在系统变量中新建5个新内容(如图所示):
1.变量名: CUDA_SDK_PATH
变量内容:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2
v10.2指下载版本文件夹,请导航至自己下载版本的文件夹中,下同

2.变量名: CUDA_LIB_PATH
变量内容:%CUDA_PATH%\lib\x64

3.变量名: CUDA_BIN_PATH
变量内容:%CUDA_PATH%\bin

4.变量名: CUDA_SDK_BIN_PATH
变量内容:%CUDA_SDK_PATH%\bin\win64

5.变量名: CUDA_SDK_LIB_PATH
变量内容:%CUDA_SDK_PATH%\common\lib\x64Camera ISP-知识大纲
2.在用户变量的 path中新建4个新内容(如图所示):

%CUDA_LIB_PATH%
%CUDA_BIN_PAHT%
%CUDA_SDK_BIN_PAHT%
%CUDA_SDK_LIB_PATH%

Camera ISP-知识大纲
3.测试:win+R,输入cmd,打开命令行,输入 set cuda,显示如下内容,若无显示,请重启,显示如下内容即为1,2步成功,才可进行此步
Camera ISP-知识大纲

切换如下目录, v10.2指下载版本文件夹,请导航至自己下载版本的文件夹中,下同

cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite

运行deviceQuery.exe

deviceQuery.exe

Camera ISP-知识大纲

显示如下结果,最后显示Result=PASS,即为成功!

Camera ISP-知识大纲
Camera ISP-知识大纲

VS中配置CUDA

1.VS新建一个空项目,打开属性管理器
下图1位置,新建一个*.props文件,命名为CUDA_debug_x64Camera ISP-知识大纲
2.右键 刚建的CUDA_debug_x64->属性,如下图
Camera ISP-知识大纲3.VC++目录->包含目录中添加

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include

VC++目录->库目录中添加

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64

Camera ISP-知识大纲
4.仍然是上一步属性中 ->链接器->输入->附加依赖项,添加下述内容(见图)

cublas.lib
cublasLt.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cufft.lib
cufftw.lib
curand.lib
cusolver.lib
cusparse.lib
nppc.lib
nppial.lib
nppicc.lib
nppicom.lib
nppidei.lib
nppif.lib
nppig.lib
nppim.lib
nppist.lib
nppisu.lib
nppitc.lib
npps.lib
nvblas.lib
nvgraph.lib
nvml.lib
nvrtc.lib
OpenCL.lib

Camera ISP-知识大纲
🆗!!

Original: https://blog.csdn.net/Ang_go/article/details/122734873
Author: Ang_go
Title: windows下VS安装CUDA环境配置