文章目录
-
- 饱和度
-
- [1. 饱和度的定义](#1. 饱和度的定义)
- [2. 在颜色模型中的表示](#2. 在颜色模型中的表示)
- [3. 饱和度的计算](#3. 饱和度的计算)
- 假设图像像素矩阵如下
- 饱和度计算步骤
- 引导滤波
-
- [1. 引导滤波的原理](#1. 引导滤波的原理)
- [2. 公式推导](#2. 公式推导)
- [3. 引导滤波的参数](#3. 引导滤波的参数)
- [4. 代码示例](#4. 代码示例)
- 孪生网络
-
- [1. 孪生网络的基本结构](#1. 孪生网络的基本结构)
- [2. 工作原理](#2. 工作原理)
- [双边滤波(Bilateral Filter)](#双边滤波(Bilateral Filter))
- BM3D算法
- zernike矩
-
- [Zernike矩(Zernike Moments)](#Zernike矩(Zernike Moments))
- Zernike矩的定义
- Zernike多项式
- Zernike矩的旋转不变性
- 计算Zernike矩
-
- [步骤 1:构造5x5图像](#步骤 1:构造5x5图像)
- [步骤 2:极坐标转换](#步骤 2:极坐标转换)
- [步骤 3:Zernike多项式](#步骤 3:Zernike多项式)
- [步骤 4:计算Zernike矩](#步骤 4:计算Zernike矩)
- 示例:计算Zernike矩
-
- [步骤 5:简化计算](#步骤 5:简化计算)
- 总结
- Zernike矩的优势与局限性
- GhostNet
- 深度可分离卷积
- CSPdarknet
-
- 背景
- CSPDarknet的设计思路
- CSPDarknet的关键组成部分
-
- [1. 跨阶段部分连接(CSP)](#1. 跨阶段部分连接(CSP))
- [2. 深度可分离卷积(Depthwise Separable Convolution)](#2. 深度可分离卷积(Depthwise Separable Convolution))
- [3. 残差连接(Residual Connections)](#3. 残差连接(Residual Connections))
- [4. 多尺度特征融合](#4. 多尺度特征融合)
- CSPDarknet与传统Darknet的对比
- CSPDarknet的优点
- 动态Soft-NMS
-
- [背景与传统 NMS](#背景与传统 NMS)
- Soft-NMS:改进的非最大抑制
- [动态 Soft-NMS](#动态 Soft-NMS)
- [4. 动态 Soft-NMS 的工作原理](#4. 动态 Soft-NMS 的工作原理)
- [动态 Soft-NMS 的公式](#动态 Soft-NMS 的公式)
- [动态 Soft-NMS 的优势](#动态 Soft-NMS 的优势)
饱和度
饱和度(Saturation)是颜色属性之一,描述了颜色的强度和纯度。它反映了颜色的鲜艳程度,通常与色调(Hue)和明度(Value或Brightness)一起构成颜色的三维表示。在图像处理和视觉艺术中,饱和度是一个重要的概念。
1. 饱和度的定义
- 高饱和度:颜色非常鲜艳和纯正,几乎没有灰色成分。例如,鲜红色、鲜绿色都是高饱和度的颜色。
- 低饱和度:颜色看起来更接近灰色,显得比较柔和、黯淡。例如,淡红色、浅绿色是低饱和度的颜色。
- 总而言之,就是色彩更偏向于单通道,还是多通道。
2. 在颜色模型中的表示
在不同的颜色模型中,饱和度的定义和计算方法可能略有不同:
- HSV模型:在HSV(色调、饱和度、明度)模型中,饱和度值范围通常为0到1。0表示无彩色(灰色),1表示完全饱和的颜色。
- HSL模型:在HSL(色调、饱和度、亮度)模型中,饱和度的范围同样是0到1。不同之处在于亮度的定义和计算方式。
3. 饱和度的计算
在HSV或HSL模型中,饱和度可以根据RGB(红、绿、蓝)值计算得出。以下是一个简单的计算方法:
假设图像像素矩阵如下
每个像素格式为 ( R , G , B ) (R, G, B) (R,G,B):第一步规范化到[0,1]范围内。
( 0.8 , 0.3 , 0.2 ) ( 0.5 , 0.9 , 0.3 ) ( 0.2 , 0.6 , 0.4 ) ( 0.1 , 0.2 , 0.7 ) ( 0.6 , 0.3 , 0.8 ) ( 0.4 , 0.1 , 0.5 ) ( 0.7 , 0.5 , 0.2 ) ( 0.3 , 0.7 , 0.6 ) ( 0.9 , 0.1 , 0.4 ) \] \\begin{bmatrix} (0.8, 0.3, 0.2) \& (0.5, 0.9, 0.3) \& (0.2, 0.6, 0.4) \\\\ (0.1, 0.2, 0.7) \& (0.6, 0.3, 0.8) \& (0.4, 0.1, 0.5) \\\\ (0.7, 0.5, 0.2) \& (0.3, 0.7, 0.6) \& (0.9, 0.1, 0.4) \\\\ \\end{bmatrix} (0.8,0.3,0.2)(0.1,0.2,0.7)(0.7,0.5,0.2)(0.5,0.9,0.3)(0.6,0.3,0.8)(0.3,0.7,0.6)(0.2,0.6,0.4)(0.4,0.1,0.5)(0.9,0.1,0.4) #### 饱和度计算步骤 对于像素 ( 0.8 , 0.3 , 0.2 ) (0.8, 0.3, 0.2) (0.8,0.3,0.2) 的饱和度计算如下 1. **找到最大值和最小值** :对于每个像素 ( R , G , B ) (R, G, B) (R,G,B),计算: * C m a x = max ( R , G , B ) C_{max} = \\max(R, G, B) Cmax=max(R,G,B) * C m i n = min ( R , G , B ) C_{min} = \\min(R, G, B) Cmin=min(R,G,B) C m a x = 0.8 , C m i n = 0.2 C_{max} = 0.8, \\quad C_{min} = 0.2 Cmax=0.8,Cmin=0.2 2. **计算色差 C C C** : C = C m a x − C m i n C = C_{max} - C_{min} C=Cmax−Cmin C = 0.8 − 0.2 = 0.6 C = 0.8 - 0.2 = 0.6 C=0.8−0.2=0.6 3. **计算饱和度 S S S** : * 如果 C m a x = 0 C_{max} = 0 Cmax=0,则饱和度 S = 0 S = 0 S=0 * 否则,饱和度 S = C C m a x S = \\frac{C}{C_{max}} S=CmaxC S = C C m a x = 0.6 0.8 = 0.75 S = \\frac{C}{C_{max}} = \\frac{0.6}{0.8} = 0.75 S=CmaxC=0.80.6=0.75 \[ 0.75 S 1 , 2 S 1 , 3 S 2 , 1 S 2 , 2 S 2 , 3 S 3 , 1 S 3 , 2 S 3 , 3 \] \\begin{bmatrix} 0.75 \& S_{1,2} \& S_{1,3} \\\\ S_{2,1} \& S_{2,2} \& S_{2,3} \\\\ S_{3,1} \& S_{3,2} \& S_{3,3} \\\\ \\end{bmatrix} 0.75S2,1S3,1S1,2S2,2S3,2S1,3S2,3S3,3 其中 S i , j S_{i,j} Si,j 表示位置 ( i , j ) (i, j) (i,j) 处的饱和度值。 完整的矩阵会包含所有像素的饱和度值,可以帮助分析图像的整体色彩鲜艳程度。 好的,我们将对整个 3 × 3 3 \\times 3 3×3 图像计算每个像素的饱和度,并输出完整的饱和度矩阵。 \[ 0.75 0.67 0.67 0.86 0.63 0.80 0.71 0.57 0.89 \] \\begin{bmatrix} 0.75 \& 0.67 \& 0.67 \\\\ 0.86 \& 0.63 \& 0.80 \\\\ 0.71 \& 0.57 \& 0.89 \\\\ \\end{bmatrix} 0.750.860.710.670.630.570.670.800.89 ### 引导滤波 引导滤波(Guided Filter)是一种基于引导图像的边缘保留滤波算法,由何凯明等人在 2013 年提出。它的主要作用是在保持图像边缘的情况下平滑图像,是图像去噪、细节增强和多种图像融合任务中的常用算法。引导滤波的基本原理是利用一幅引导图来决定滤波的结果,这样在平滑图像的同时可以保护边缘不被模糊。 我个人的理解是,给一个原始图像是要处理的图像。 引导图像是一幅用来指导滤波过程的图像。通过引导图像的边缘信息,滤波器可以决定哪些区域需要平滑,哪些区域需要保留细节。 引导滤波是逐像素对图像处理。 1.使用窗口,这时候可以把引导图像这个窗口的值和原始图像的窗口的值求线性函数。假设是采用的是3\*3的窗口,那就是用最小二乘法求出a和b,保证9个点的一一对应(高中知识),计算引导图像块到原始图像块的线性关系,这样就保证损失函数最低。用y=ax+b,只处理选定的点,这样就处理了一个点。 2.然后再一个点,一个点的处理。把整幅图片处理完了。 绕的绕了又绕,其实本质上用图像窗口求引导函数和原始函数的最小二乘拟合,然后用求出的y=ax+b,处理一个点。 #### 1. 引导滤波的原理 引导滤波假设输出图像 q q q 是输入图像 I I I 和引导图像 g g g 的线性函数: q i = a k ⋅ g i + b k q_i = a_k \\cdot g_i + b_k qi=ak⋅gi+bk 其中 a k a_k ak 和 b k b_k bk 是局部线性系数, g i g_i gi 表示引导图在像素 i i i 处的值,而 q i q_i qi 是滤波后的结果。为了在保持边缘的情况下平滑图像,引导滤波在窗口内估计 a k a_k ak 和 b k b_k bk,使得输出图像在窗口内保持与引导图像一致的边缘结构。 引导滤波是逐像素进行处理的。 引导图像提供了有关局部结构和边缘的信息,指导滤波过程; #### 2. 公式推导 引导滤波的过程可以分为以下几个步骤: 1. **局部线性模型** :在每个局部窗口 k k k 中,引导图像 g g g 和输出图像 q q q 的关系用线性模型表示,即: q i = a k ⋅ g i + b k q_i = a_k \\cdot g_i + b_k qi=ak⋅gi+bk 其中 a k a_k ak 和 b k b_k bk 是在窗口 k k k 中常数。 2. **最小化代价函数** :为了找到最优的 a k a_k ak 和 b k b_k bk,我们需要最小化代价函数,使输出图像块 q q q 尽可能接近输入图像块 I I I: E ( a k , b k ) = ∑ i ∈ ω k ( ( a k ⋅ g i + b k − I i ) 2 + ϵ ⋅ a k 2 ) E(a_k, b_k) = \\sum_{i \\in \\omega_k} \\left( (a_k \\cdot g_i + b_k - I_i)\^2 + \\epsilon \\cdot a_k\^2 \\right) E(ak,bk)=i∈ωk∑((ak⋅gi+bk−Ii)2+ϵ⋅ak2) 这里 ω k \\omega_k ωk 是窗口 k k k 中的像素集合, ϵ \\epsilon ϵ 是一个正则化参数,用于平滑 a k a_k ak 以避免过拟合。 3. **求解 a k a_k ak 和 b k b_k bk** :通过最小化代价函数,可以得到 a k a_k ak 和 b k b_k bk 的解: a k = 1 ∣ ω k ∣ ∑ i ∈ ω k g i ⋅ I i − μ k ⋅ I k ˉ σ k 2 + ϵ a_k = \\frac{\\frac{1}{\|\\omega_k\|} \\sum_{i \\in \\omega_k} g_i \\cdot I_i - \\mu_k \\cdot \\bar{I_k}}{\\sigma_k\^2 + \\epsilon} ak=σk2+ϵ∣ωk∣1∑i∈ωkgi⋅Ii−μk⋅Ikˉ b k = I k ˉ − a k ⋅ μ k b_k = \\bar{I_k} - a_k \\cdot \\mu_k bk=Ikˉ−ak⋅μk 其中, μ k \\mu_k μk 和 σ k 2 \\sigma_k\^2 σk2 分别是引导图在窗口 k k k 内的均值和方差, I k ˉ \\bar{I_k} Ikˉ 是输入图像 I I I 在窗口 k k k 内的均值。 4. **生成输出图像 q q q** :最终,滤波结果 q i q_i qi 是通过对每个像素进行加权平均得到的,表示为: q i = 1 ∣ ω k ∣ ∑ k ∈ Ω i ( a k ⋅ g i + b k ) q_i = \\frac{1}{\|\\omega_k\|} \\sum_{k \\in \\Omega_i} (a_k \\cdot g_i + b_k) qi=∣ωk∣1k∈Ωi∑(ak⋅gi+bk) 这里 Ω i \\Omega_i Ωi 是包含像素 i i i 的所有窗口的集合。 #### 3. 引导滤波的参数 引导滤波的效果取决于以下几个参数: * **引导图像 g g g** :决定了输出图像的结构,如果 g g g 和输入图像 I I I 是同一幅图像,则是自引导滤波。 * **窗口半径 r r r**:控制平滑程度,较大的半径会平滑更大区域。 * **正则化参数 ϵ \\epsilon ϵ** :控制平滑强度,小的 ϵ \\epsilon ϵ 值会更敏感于边缘,较大的值则会带来更平滑的效果。 #### 4. 代码示例 以下是一个简单的引导滤波实现的代码示例: ```python import cv2 import numpy as np def guided_filter(I, p, r, eps): """引导滤波 I: 引导图像 p: 输入图像 r: 半径 eps: 正则化参数 """ mean_I = cv2.boxFilter(I, cv2.CV_64F, (r, r)) mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r)) mean_Ip = cv2.boxFilter(I * p, cv2.CV_64F, (r, r)) cov_Ip = mean_Ip - mean_I * mean_p mean_II = cv2.boxFilter(I * I, cv2.CV_64F, (r, r)) var_I = mean_II - mean_I * mean_I a = cov_Ip / (var_I + eps) b = mean_p - a * mean_I mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r)) mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r)) q = mean_a * I + mean_b return q # 示例用法 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE).astype(np.float32) / 255.0 filtered_image = guided_filter(image, image, r=8, eps=0.02) cv2.imwrite('filtered_image.jpg', (filtered_image * 255).astype(np.uint8)) ``` ### 孪生网络 孪生网络(Siamese Network)是一种特殊的神经网络架构,主要用于比较两个输入数据的相似度。孪生网络由两部分结构相同、共享权重的子网络组成,通过学习输入对之间的相似性或差异性来完成特定任务。它最早被应用于手写签名验证任务,但如今广泛用于图像识别、面部验证、文本相似度分析等领域。 #### 1. 孪生网络的基本结构 孪生网络由两部分完全相同的子网络组成,它们共享参数和权重,即输入相同的样本时会输出相同的特征表示。具体结构如下: * **两个输入**:孪生网络接受两个输入样本,分别输入到两个相同的子网络中进行处理。 * **共享权重**:这两个子网络共享相同的权重,这意味着无论哪个输入进入网络,处理逻辑和权重都是一致的。 * **特征提取**:每个子网络会提取输入的特征表示,得到两个特征向量。 * **相似度计算**:使用欧氏距离、余弦相似度或其他度量方法计算两个特征向量之间的距离或相似性,判断输入数据的关系。 #### 2. 工作原理 孪生网络的核心思想是通过共享权重的双子网络学习如何将相似的数据映射到相似的特征空间,将不相似的数据映射到不同的特征空间。在训练时,通常使用对比损失函数(Contrastive Loss)或三元组损失函数(Triplet Loss)来优化网络。 **对比损失函数** 示例如下: L = 1 2 ( 1 − Y ) D 2 + 1 2 Y max ( 0 , m − D ) 2 L = \\frac{1}{2} (1 - Y) D\^2 + \\frac{1}{2} Y \\max(0, m - D)\^2 L=21(1−Y)D2+21Ymax(0,m−D)2 其中: * Y Y Y 表示输入对的标签,1 表示正样本对(相似),0 表示负样本对(不相似)。 * D D D 是输入对的特征向量之间的欧氏距离。 * m m m 是阈值参数,用于调节负样本的损失范围。 **训练流程**: 1. 输入两组样本,如一张图片及其标签。 2. 网络输出两组特征向量。 3. 计算输出向量之间的距离,结合标签计算损失。 4. 通过反向传播更新共享的网络权重。 ### 双边滤波(Bilateral Filter) 双边滤波(Bilateral Filter)是一种基于图像像素空间和像素值空间的滤波方法,旨在平滑图像的同时保持边缘信息。这种滤波方法通过在空间上和颜色上同时进行加权处理,使得图像中的边缘能够被保留,而在平坦区域中能有效地去除噪声。 与传统的滤波器(如高斯滤波器)不同,双边滤波在计算每个像素的加权平均时,不仅考虑空间距离,还考虑***像素值的差异***,从而避免了图像中的边缘被模糊掉。 #### 双边滤波的工作原理 双边滤波的核心思想是根据两个因素来加权每个像素的邻域像素: 1. **空间权重**:这部分权重取决于像素之间的空间距离。距离越近,权重越大。基于高斯滤波的原理。 2. **值域权重**:这部分权重与像素值之间的差异相关。像素值差异小的像素被赋予更大的权重。 对于图像中的每个像素,双边滤波会通过以下公式来计算加权平均值: I out ( p ) = 1 W p ∑ q I ( q ) ⋅ exp ( − ∣ I ( p ) − I ( q ) ∣ 2 2 σ r 2 ) ⋅ exp ( − ∣ p − q ∣ 2 2 σ d 2 ) I_{\\text{out}}(p) = \\frac{1}{W_p} \\sum_q I(q) \\cdot \\exp\\left(-\\frac{\|I(p) - I(q)\|\^2}{2 \\sigma_r\^2}\\right) \\cdot \\exp\\left(-\\frac{\|p - q\|\^2}{2 \\sigma_d\^2}\\right) Iout(p)=Wp1q∑I(q)⋅exp(−2σr2∣I(p)−I(q)∣2)⋅exp(−2σd2∣p−q∣2) 其中: * I ( p ) I(p) I(p) 是像素 p p p 的颜色值(或者灰度值)。 * I out ( p ) I_{\\text{out}}(p) Iout(p) 是处理后的像素值。 * q q q 是邻域像素的位置。 * σ r \\sigma_r σr 是值域的标准差,控制像素值差异的影响。 * σ d \\sigma_d σd 是空间的标准差,控制空间距离的影响。 * W p W_p Wp 是归一化因子,确保加权和为1,通常计算为: W p = ∑ q exp ( − ∣ I ( p ) − I ( q ) ∣ 2 2 σ r 2 ) ⋅ exp ( − ∣ p − q ∣ 2 2 σ d 2 ) W_p = \\sum_q \\exp\\left(-\\frac{\|I(p) - I(q)\|\^2}{2 \\sigma_r\^2}\\right) \\cdot \\exp\\left(-\\frac{\|p - q\|\^2}{2 \\sigma_d\^2}\\right) Wp=q∑exp(−2σr2∣I(p)−I(q)∣2)⋅exp(−2σd2∣p−q∣2) #### 双边滤波的步骤 1. **空间权重计算** : 计算每个像素与其邻域像素之间的空间距离,并根据空间距离计算权重。距离越小,权重越大。常常使用高斯函数来计算空间权重。 2. **像素值权重计算** : 计算每个像素与其邻域像素值之间的差异,并根据差异计算权重。值差异越小,权重越大,通常使用高斯函数来计算值域权重。 3. **加权平均** : 对于每个像素,计算邻域像素的加权平均,保留边缘信息,同时去除噪声。 4. **归一化** : 通过计算归一化因子确保加权和为1,从而得到最终的滤波结果。 #### 双边滤波的应用 双边滤波的主要优点是它能够在去噪的同时保持图像中的边缘特征,因此被广泛应用于以下场景: * **去噪**:特别是去除图像中的高斯噪声或椒盐噪声,同时不模糊图像的边缘。 * **图像平滑**:图像的平滑处理,保持物体边缘不受影响。 * **美颜处理**:在图像美颜中,去除皮肤的噪点,同时保留皮肤的细节。 * **图像修复**:通过双边滤波恢复图像的细节,同时去除不需要的噪声。 #### 双边滤波的优缺点 ##### 优点 * **保留边缘**:双边滤波能够有效保留图像的边缘信息,避免了传统滤波器(如高斯滤波器)会模糊边缘的问题。 * **去噪效果好**:通过考虑像素值和空间位置,双边滤波能更精确地去除噪声,尤其是在存在大量高斯噪声的图像中效果尤为明显。 ##### 缺点 * **计算量大**:双边滤波需要计算每个像素与所有邻域像素的权重,因此其计算复杂度较高。对于高分辨率的图像,处理时间较长,尤其是在实时应用中可能成为瓶颈。 * **参数选择敏感** :双边滤波的效果很大程度上取决于参数(如 σ r \\sigma_r σr和 σ d \\sigma_d σd)的选择。如果这些参数选择不当,可能会导致滤波效果不理想。 #### 双边滤波的优化 由于双边滤波的计算开销较大,特别是当图像分辨率较高时,存在一些优化方法: 1. **高效的实现** :通过采用快速算法,如使用**图像金字塔** (pyramid)或**快速近似算法**(如双边滤波的分离算法),可以显著降低计算复杂度。 2. **加速库**:使用GPU加速的实现(如CUDA或OpenCL)可以加速双边滤波的计算,适用于实时图像处理。 #### 双边滤波的Python实现示例(OpenCV) 以下是使用OpenCV库在Python中实现双边滤波的代码示例: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('input_image.jpg') # 使用双边滤波进行平滑处理 # d: 过滤器直径 # sigmaColor: 色彩空间的标准差 # sigmaSpace: 坐标空间的标准差 filtered_image = cv2.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75) # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Filtered Image', filtered_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### BM3D算法 建议参考链接链接: [通俗语言说BM3D](https://blog.csdn.net/luzhanbo207/article/details/105736895/?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0--blog-128391485.235%5Ev38%5Epc_relevant_sort_base1&spm=1001.2101.3001.4242.1&utm_relevant_index=3) BM3D(Block Matching and 3D filtering)是一种先进的图像去噪算法,它采用了块匹配(block matching)和三维滤波(3D filtering)的方法来有效地去除图像中的噪声,尤其适用于去除高斯噪声。BM3D算法通过将相似的图像块集合成三维数组,并利用协方差矩阵进行滤波,从而有效保留图像细节的同时去除噪声。 BM3D算法通常被认为是当前最优秀的图像去噪算法之一,其性能优于传统的去噪方法(如高斯滤波、双边滤波等)。 #### BM3D算法的工作原理 BM3D算法主要分为两个步骤: 1. **块匹配(Block Matching)**: * 该步骤的目的是在图像中找到与当前处理块相似的邻域块,组成一个"块集合"。 * 对于每个图像块,算法会在图像中搜索所有与该块相似的块,通常通过计算像素块之间的差异(如均方误差MSE)来度量相似性。 * 这些相似的图像块被堆叠成三维块组,每个块组包含多个相似图像块。 2. **三维滤波(3D Filtering)**: * 将相似块堆叠成一个三维数组后,算法对这些三维数组应用高性能的滤波器,通常采用**硬阈值去噪** (Hard Thresholding)或者**Wiener滤波**。 * 通过对这些三维数组进行滤波,去除噪声并保留图像的结构信息,尤其是边缘和纹理细节。 #### BM3D算法的步骤详细描述 1. **图像预处理**: * 将输入的噪声图像分成多个小的图像块(通常是大小为 8 × 8 8\\times8 8×8或者 16 × 16 16\\times16 16×16的块)。 2. **块匹配**: * 对于每个图像块,搜索其他所有图像块,找到与之相似的块。这些相似块的选择标准是块之间的差异最小,通常使用欧几里得距离或者其他相似度度量方法来衡量。 3. **三维变换**: * 将匹配的块堆叠成三维数组。每个图像块的相似块形成一个三维数据集,其中每个维度代表一个像素块。 4. **去噪(3D滤波)**: * 对于每个三维数组,应用滤波操作。常见的做法是使用**硬阈值去噪** ,即去除某些频率分量(如高频噪声),也可以采用**Wiener滤波**来估算每个像素的最优值。 5. **块合成**: * 经过滤波后的图像块被重新合成到原图的位置。在重建时,通常会采用**加权平均**的方式来融合多个重叠的块,从而得到去噪后的图像。 6. **后处理**: * 去噪后的图像可能需要做一些细节恢复或微调,以获得更自然的效果。 #### BM3D算法的核心思想 BM3D算法的核心思想是**块匹配** 和**三维滤波**,通过将图像中相似的图像块堆叠成三维数组,并对这些数组应用滤波,可以在去除噪声的同时有效保留图像的细节。与传统的去噪方法(如高斯滤波)不同,BM3D能够针对图像中的不同区域使用不同的滤波策略,更加智能地处理图像中的噪声和细节。 #### BM3D算法的优缺点 ##### 优点 * **去噪效果好**:BM3D能够有效去除高斯噪声,同时保留图像的细节,特别是在图像边缘和纹理方面的表现优于传统去噪方法。 * **结构化去噪**:算法通过块匹配和三维滤波的方式,能够更好地利用图像的局部结构,减少噪声对图像结构的干扰。 * **性能优秀**:BM3D算法通常能在较低的噪声条件下获得非常好的去噪效果,且能较好地处理图像的高频细节。 ##### 缺点 * **计算复杂度高**:BM3D需要进行大量的块匹配操作,以及三维数据的滤波,计算开销较大,尤其是在图像分辨率较高时,可能导致较长的处理时间。 * **存储需求大**:由于需要存储多个相似图像块和三维数据集,BM3D的内存需求较高,尤其是在大图像的处理时。 #### BM3D的Python实现(使用`bm3d`库) BM3D算法已经在一些开源库中实现,如`bm3d`库,它提供了简便的接口来进行图像去噪。以下是一个简单的示例: ```python import bm3d import numpy as np import cv2 # 读取图像并添加高斯噪声 image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE) image_noisy = image + np.random.normal(0, 25, image.shape) # 使用BM3D去噪 image_denoised = bm3d.bm3d(image_noisy, sigma_psd=25) # 显示结果 cv2.imshow('Noisy Image', image_noisy) cv2.imshow('Denoised Image', image_denoised) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中: * `bm3d.bm3d`函数用来进行图像去噪,`sigma_psd`是噪声的标准差。 ### zernike矩 #### Zernike矩(Zernike Moments) **Zernike矩** 是一类用于图像描述的数学工具,广泛应用于图像分析、模式识别、计算机视觉等领域。它是一种基于**极坐标**的图像描述方法,能够有效地捕捉图像中的几何形状和结构特征。Zernike矩有着旋转不变性,这使得它们在许多应用中非常有用,尤其是在处理旋转变换和尺度变化时。 #### Zernike矩的定义 Zernike矩是通过在极坐标系下,基于一组正交多项式函数进行计算的。具体来说,Zernike矩是图像的某种"特征",通过对图像进行积分得到。这些特征具有**旋转不变性**,即图像旋转后其矩值保持不变。 Zernike矩的计算公式为: Z n , m = n + 1 π ∫ ∫ R f ( r , θ ) R n , m ( r ) e i m θ r d r d θ Z_{n,m} = \\frac{n + 1}{\\pi} \\int \\int_R f(r, \\theta) R_{n,m}(r) e\^{im\\theta} r \\, dr \\, d\\theta Zn,m=πn+1∫∫Rf(r,θ)Rn,m(r)eimθrdrdθ Z e r n i k e 矩 = 阶数 + 1 π ∫ ∫ R 极坐标系统中的强度分布 ∗ Z e r n i k e 多项式 e i m θ r d r d θ Zernike矩= \\frac{阶数+1}{\\pi} \\int \\int_R 极坐标系统中的强度分布\*Zernike多项式e\^{im\\theta} r \\, dr \\, d\\theta Zernike矩=π阶数+1∫∫R极坐标系统中的强度分布∗Zernike多项式eimθrdrdθ 其中: * n n n 是 Zernike多项式 的阶数,它决定了多项式的 径向变化。 n n n 是一个非负整数,表示多项式的总阶数。 n n n 越大可以捕捉越复杂的细节。 * f ( r , θ ) f(r, \\theta) f(r,θ) 是图像在极坐标系统中的强度分布; * R n , m ( r ) R_{n,m}(r) Rn,m(r) 是Zernike多项式; * e i m θ e\^{im\\theta} eimθ 是复指数项,保证了旋转不变性; * r r r 和 θ \\theta θ 是极坐标系中的径向坐标和角度坐标; * R n , m ( r ) R_{n,m}(r) Rn,m(r) 是Zernike多项式, R n , m ( r ) = ∑ k = 0 n − m 2 ( − 1 ) k ( n − k ) ! k ! ( n + m 2 − k ) ! ( n − m 2 − k ) ! r n − 2 k R_{n,m}(r) = \\sum_{k=0}\^{\\frac{n-m}{2}} (-1)\^k \\frac{(n-k)!}{k! \\left(\\frac{n+m}{2}-k\\right)! \\left(\\frac{n-m}{2}-k\\right)!} r\^{n-2k} Rn,m(r)=k=0∑2n−m(−1)kk!(2n+m−k)!(2n−m−k)!(n−k)!rn−2k #### Zernike多项式 Zernike矩的核心是Zernike多项式,它们是一组在单位圆内正交的多项式。Zernike多项式的形式如下:(给人感觉有点像傅里叶级数) R n , m ( r ) = ∑ k = 0 n − m 2 ( − 1 ) k ( n − k ) ! k ! ( n + m 2 − k ) ! ( n − m 2 − k ) ! r n − 2 k R_{n,m}(r) = \\sum_{k=0}\^{\\frac{n-m}{2}} (-1)\^k \\frac{(n-k)!}{k! \\left(\\frac{n+m}{2}-k\\right)! \\left(\\frac{n-m}{2}-k\\right)!} r\^{n-2k} Rn,m(r)=k=0∑2n−m(−1)kk!(2n+m−k)!(2n−m−k)!(n−k)!rn−2k Zernike多项式具有以下特点: * **正交性**:Zernike多项式在单位圆内是正交的,这使得它们适合用于图像特征提取。 * **旋转不变性**:由于Zernike多项式是基于极坐标的,图像的旋转不会影响它们的结果,因此它们对旋转变换具有不变性。 * **径向对称性**:Zernike多项式的径向部分是与图像的半径有关的。 #### Zernike矩的旋转不变性 Zernike矩最大的优点之一就是它具有**旋转不变性** ,即使图像旋转,Zernike矩的值也不会改变。这对于处理图像中的旋转变换非常重要。Zernike矩中的旋转不变性主要来自于它们的复指数部分( e i m θ e\^{im\\theta} eimθ),它确保了即使图像旋转,矩值也保持不变。 #### 计算Zernike矩 举例:计算5x5图像的Zernike矩 我们将用一个简单的 5x5 图像来演示如何计算 Zernike 矩。 ##### 步骤 1:构造5x5图像 假设我们的 5x5 图像如下所示: 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 这是一个简单的二值图像,表示一个中心对称的圆形。我们将计算它的 Zernike 矩。 ##### 步骤 2:极坐标转换 Zernike矩的计算依赖于将图像从笛卡尔坐标系转换到极坐标系。极坐标系中的两个坐标是径向坐标 r r r 和角度坐标 θ \\theta θ。对于图像的每个像素,我们需要计算它的极坐标表示。 1. **计算径向坐标 r r r** :对于每个像素,计算其到图像中心的距离(半径 r r r)。 2. **计算角度坐标 θ \\theta θ** :对于每个像素,计算其相对于图像中心的角度(角度 θ \\theta θ)。 假设图像的中心是 ( 2 , 2 ) (2, 2) (2,2),我们计算每个像素到中心的距离(径向坐标 r r r)和相应的角度(角度坐标 θ \\theta θ)。以下是一些常见像素的极坐标值计算: | 笛卡尔坐标 ( x , y ) (x, y) (x,y) | 径向坐标 r r r | 角度坐标 θ \\theta θ | |------------------------------|-----------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | ( 0 , 0 ) (0, 0) (0,0) | 2 2 + 2 2 = 8 ≈ 2.83 \\sqrt{2\^2 + 2\^2} = \\sqrt{8} \\approx 2.83 22+22 =8 ≈2.83 | atan2 ( 0 − 2 , 0 − 2 ) = π / 4 \\text{atan2}(0-2, 0-2) = \\pi / 4 atan2(0−2,0−2)=π/4 | | ( 0 , 1 ) (0, 1) (0,1) | 2 2 + 1 2 = 5 ≈ 2.24 \\sqrt{2\^2 + 1\^2} = \\sqrt{5} \\approx 2.24 22+12 =5 ≈2.24 | atan2 ( 1 − 2 , 0 − 2 ) = 3 π / 4 \\text{atan2}(1-2, 0-2) = 3\\pi / 4 atan2(1−2,0−2)=3π/4 | | ( 1 , 1 ) (1, 1) (1,1) | 1 2 + 1 2 = 2 ≈ 1.41 \\sqrt{1\^2 + 1\^2} = \\sqrt{2} \\approx 1.41 12+12 =2 ≈1.41 | atan2 ( 1 − 2 , 1 − 2 ) = π / 4 \\text{atan2}(1-2, 1-2) = \\pi / 4 atan2(1−2,1−2)=π/4 | | ( 2 , 2 ) (2, 2) (2,2) | r = 0 r = 0 r=0 | θ \\theta θ 不需要计算,因为它是中心点 | ##### 步骤 3:Zernike多项式 Zernike矩的计算需要使用 Zernike 多项式,这些多项式的阶数 n n n 和角度频率 m m m 决定了多项式的形式。我们先看几个简单的 Zernike 多项式: 1. **R 0 , 0 ( r ) = 1 R_{0,0}(r) = 1 R0,0(r)=1**:常数项。 2. **R 1 , 1 ( r ) = r R_{1,1}(r) = r R1,1(r)=r**:线性项。 3. **R 2 , 0 ( r ) = 2 r 2 − 1 R_{2,0}(r) = 2r\^2 - 1 R2,0(r)=2r2−1**:二次径向项。 对于较低阶的 Zernike 矩,我们使用这些简单的 Zernike 多项式来进行计算。 ##### 步骤 4:计算Zernike矩 Zernike矩是通过以下公式计算的: Z n , m = n + 1 π ∫ ∫ R f ( r , θ ) R n , m ( r ) e i m θ r d r d θ Z_{n,m} = \\frac{n + 1}{\\pi} \\int \\int_R f(r, \\theta) R_{n,m}(r) e\^{im\\theta} r \\, dr \\, d\\theta Zn,m=πn+1∫∫Rf(r,θ)Rn,m(r)eimθrdrdθ #### 示例:计算Zernike矩 假设我们计算 Z 1 , 1 Z_{1,1} Z1,1 和 Z 2 , 0 Z_{2,0} Z2,0 两个低阶 Zernike 矩。以下是计算过程的概要: 1. **Z 1 , 1 Z_{1,1} Z1,1 计算**: * R 1 , 1 ( r ) = r R_{1,1}(r) = r R1,1(r)=r。 * 对于每个像素点 ( r , θ ) (r, \\theta) (r,θ),计算图像强度 f ( r , θ ) f(r, \\theta) f(r,θ)(即图像的像素值)。 * 根据公式计算积分值: Z 1 , 1 = 2 π ∫ ∫ R f ( r , θ ) r e i θ r d r d θ Z_{1,1} = \\frac{2}{\\pi} \\int \\int_R f(r, \\theta) r e\^{i\\theta} r \\, dr \\, d\\theta Z1,1=π2∫∫Rf(r,θ)reiθrdrdθ 计算时需要对图像中的每个点(在极坐标中)进行加权求和。 2. **Z 2 , 0 Z_{2,0} Z2,0 计算**: * R 2 , 0 ( r ) = 2 r 2 − 1 R_{2,0}(r) = 2r\^2 - 1 R2,0(r)=2r2−1。 * 对于每个像素点 ( r , θ ) (r, \\theta) (r,θ),计算图像强度,并与多项式 R 2 , 0 ( r ) R_{2,0}(r) R2,0(r) 相乘。 * 使用相同的公式计算积分: Z 2 , 0 = 3 π ∫ ∫ R f ( r , θ ) ( 2 r 2 − 1 ) r d r d θ Z_{2,0} = \\frac{3}{\\pi} \\int \\int_R f(r, \\theta) (2r\^2 - 1) r \\, dr \\, d\\theta Z2,0=π3∫∫Rf(r,θ)(2r2−1)rdrdθ ##### 步骤 5:简化计算 由于手动计算 Zernike 矩涉及复杂的积分和求和过程,通常我们会使用计算机程序(例如 Python 中的 `scipy` 或 `OpenCV` 库)来自动完成这些计算。手动计算过程也可以根据图像的大小和复杂度进一步简化。 在实际应用中,图像的强度 f ( r , θ ) f(r, \\theta) f(r,θ) 和极坐标计算会通过数值积分的方式求解,从而得到 Zernike 矩的最终值。对于复杂的图像,计算 Zernike 矩的过程通常需要较高的计算效率和精度。 #### 总结 我们通过简单的 5x5 图像,展示了如何计算 Zernike 矩。实际上,Zernike 矩计算的难点在于极坐标转换和积分计算,尤其是在较大图像中。通过理解 Zernike 多项式的形式以及它们如何与图像的极坐标数据进行结合,可以帮助我们更好地提取图像的形状特征。 #### Zernike矩的优势与局限性 ##### 优势 * **旋转不变性**:Zernike矩对旋转非常鲁棒,可以应对不同方向的物体。 * **能够捕捉全局形状特征**:Zernike矩能够有效地描述图像的全局形状和结构特征,因此在形状识别中非常有用。 * **高效性**:由于Zernike矩的正交性,计算和存储的效率较高,特别适用于低维度的特征提取。 ##### 局限性 * **对噪声敏感**:尽管Zernike矩在旋转不变性方面具有优势,但它们对于图像中的噪声比较敏感,因此在实际应用中可能需要结合其他方法(如滤波器)进行处理。 * **计算复杂度较高**:计算Zernike矩需要进行积分和多项式计算,因此对于高分辨率图像,计算量会较大。 * **无法处理局部特征**:Zernike矩主要描述的是全局形状特征,对于局部细节的处理能力相对较弱。 ### GhostNet GhostNet是一种轻量级的卷积神经网络,旨在优化计算效率,特别适用于嵌入式设备和移动设备等计算资源受限的环境。它通过引入 **Ghost Bottleneck** 模块,显著减少了计算量和内存消耗,同时保持了较高的精度。GhostNet 由华为公司提出,专门为需要高效计算的实时应用而设计。 #### GhostNet 的设计理念 GhostNet 的核心设计理念是通过减少计算冗余来提高效率。与传统的卷积神经网络不同,GhostNet 利用 **Ghost Bottleneck** 模块来高效生成特征图。这种设计通过生成少量的 **真正有用的特征图** ,然后通过轻量级操作生成 **幽灵特征图(Ghost Feature Maps)**,从而达到降低计算成本的目标。 #### GhostNet 网络结构 GhostNet 的结构基于深度卷积网络,结合了多个 Ghost Bottleneck 模块。整体设计相较于传统的卷积神经网络减少了大量不必要的计算。网络结构大致包括以下几个部分: 1. **输入层** : 输入数据一般是标准化的图像。 2. **Ghost Bottleneck 模块** : GhostNet 的核心模块是 **Ghost Bottleneck**,它由两个部分组成: * **标准卷积**:首先使用一个常规的卷积操作来提取输入的基础特征图(这些特征图有较高的信息密度)。 * **生成幽灵特征图**:然后,利用一个轻量级的操作(如深度可分离卷积)对基础特征图进行处理,生成额外的幽灵特征图。幽灵特征图通常是低计算量的,可以通过简单的线性组合或卷积生成,且它们对原始特征图提供了补充信息。 3. **通道融合与特征拼接** : 最后,通过将真实的基础特征图与幽灵特征图结合,得到最终的特征图。这样可以在不增加太多计算量的情况下增加模型的表示能力。 4. **输出层** : 网络的最后通过全连接层或其他形式的输出层来进行分类或回归任务。 #### Ghost Bottleneck 模块 Ghost Bottleneck 是 GhostNet 的核心创新点,设计思路如下: * **生成真实特征图**:使用标准卷积(通常是 1x1 或 3x3 卷积)提取少量基础特征图。 * **生成幽灵特征图**:通过简单的深度可分离卷积或其他轻量级操作生成幽灵特征图。这些幽灵特征图对网络的推理性能贡献较大,但计算量非常小。 * **特征图拼接**:将基础特征图与幽灵特征图拼接在一起,形成新的特征图。这样,模型可以以较小的计算成本获取更多的特征信息。 #### GhostNet 的优势 1. **减少计算量** :通过 **Ghost Bottleneck** 模块,GhostNet 能在减少计算量的同时保留大部分有用的特征信息。这种方式使得它比传统卷积网络更加高效,特别是在计算资源有限的设备上。 2. **高效的特征图生成**:GhostNet 通过生成幽灵特征图来增加特征图的数量,从而增加模型的表达能力,同时避免了计算的冗余。 3. **适应移动端和嵌入式设备** :由于它在保持较高精度的同时显著降低了计算量,GhostNet 特别适合于 **移动端、嵌入式设备** 、**边缘计算** 等计算能力受限的场景。 4. **较低的内存和存储占用**:GhostNet 通过减少冗余计算和特征图的存储,使得模型的内存消耗和存储占用大大降低。 #### GhostNet 与其他轻量级网络的比较 GhostNet 与其他一些主流的轻量级网络(如 **MobileNetV2** 、**ShuffleNetV2**)相比,具有以下特点: * **GhostNet vs MobileNetV2**: * **MobileNetV2** 采用了 **深度可分离卷积** 和 **倒残差结构**(inverted residuals)来减少计算量,但计算量仍然相对较大,特别是在深层次网络中。 * **GhostNet** 通过引入 **Ghost Bottleneck**,在保持精度的同时,进一步减少了冗余计算,相比之下,GhostNet 更加高效。 * **GhostNet vs ShuffleNetV2**: * **ShuffleNetV2** 通过 **通道混洗操作**(channel shuffle)来优化计算过程,减少了内存和计算的开销。 * **GhostNet** 与 **ShuffleNetV2** 类似,都是为了高效地在移动设备和嵌入式设备上运行,但 GhostNet 的 **Ghost Bottleneck** 模块提供了一种新的方法来进一步优化计算效率。 #### 应用场景 由于 GhostNet 高效且适合计算资源有限的环境,它非常适用于以下场景: 1. **移动设备**:如智能手机、平板等,需要在设备上执行高效的推理任务。 2. **嵌入式设备**:如机器人、智能摄像头、无人机等需要快速处理图像的设备。 3. **边缘计算**:在需要实时处理数据并作出响应的应用中,GhostNet 可以在计算能力有限的设备上提供快速推理。 4. **计算密集型任务** :如实时图像分类、物体检测等,尤其是在 **延迟** 和 **效率** 有较高要求的应用中。 #### 总结 **GhostNet** 是一种轻量级的神经网络,主要通过 **Ghost Bottleneck** 模块减少冗余计算并提高效率。它在保持高精度的同时,显著降低了计算和存储开销,尤其适用于移动设备、嵌入式设备以及边缘计算等计算资源受限的场景。GhostNet 通过高效生成幽灵特征图,并结合基础特征图来增强网络表达能力,是当前轻量级神经网络研究中的一个重要进展。 ### 深度可分离卷积 玛德,一个唬人的名词,chatGPT一直犯傻,最后终于搞明白了 表面上看似 **深度可分离卷积** (Depthwise Separable Convolution)是由 **普通卷积** 加上一个 **1x1 卷积** ,计算量可能会更多。但实际上,**深度可分离卷积** 的核心优势在于它 **分离了空间卷积和通道卷积**,通过分开操作来减少参数和计算量,尤其是当输入的通道数较大时。 #### 普通卷积(标准卷积) 假设我们有一个输入特征图,其尺寸为 **H x W x D** (高度 H,宽度 W,通道数 D),并且使用一个 **K x K** 的卷积核来进行卷积,得到输出特征图的尺寸为 **H' x W' x F**(F 是输出通道数)。 普通卷积的计算量为: 运算量(普通卷积) = H ′ × W ′ × D × K × K × F \\text{运算量(普通卷积)} = H' \\times W' \\times D \\times K \\times K \\times F 运算量(普通卷积)=H′×W′×D×K×K×F 其中: * **H' 和 W'** 是输出特征图的尺寸(通常由输入尺寸 H 和 W 以及卷积核的大小和步幅决定)。 * **D** 是输入通道数。 * **K x K** 是卷积核的尺寸。 * **F** 是输出通道数。 #### 深度可分离卷积 深度可分离卷积将卷积操作分为两个部分: 1. **深度卷积(Depthwise Convolution)** :每个输入通道使用一个独立的卷积核进行卷积,卷积核的尺寸通常是 **K x K**。 2. **逐点卷积(Pointwise Convolution)** :使用 **1x1 卷积核** 对深度卷积的输出进行跨通道整合。 深度卷积的计算量是对每个输入通道进行卷积,因此计算量为: 运算量(深度卷积) = H ′ × W ′ × D × K × K \\text{运算量(深度卷积)} = H' \\times W' \\times D \\times K \\times K 运算量(深度卷积)=H′×W′×D×K×K 其中: * **H' 和 W'** 是输出特征图的尺寸。 * **D** 是输入通道数。 * **K x K** 是卷积核的尺寸。 ##### 逐点卷积的计算量 逐点卷积是 **1x1 卷积** ,它对每个位置的 **D** 个输入通道进行加权求和,生成一个新的输出通道。计算量为: 运算量(逐点卷积) = H ′ × W ′ × D × F \\text{运算量(逐点卷积)} = H' \\times W' \\times D \\times F 运算量(逐点卷积)=H′×W′×D×F 其中: * **H' 和 W'** 是输出特征图的尺寸。 * **D** 是输入通道数。 * **F** 是输出通道数。 ##### 总计算量 深度可分离卷积的总计算量是深度卷积和逐点卷积的计算量之和: 总运算量(深度可分离卷积) = H ′ × W ′ × D × K × K + H ′ × W ′ × D × F \\text{总运算量(深度可分离卷积)} = H' \\times W' \\times D \\times K \\times K + H' \\times W' \\times D \\times F 总运算量(深度可分离卷积)=H′×W′×D×K×K+H′×W′×D×F #### 对比计算量 接下来我们将 **深度可分离卷积** 与 **普通卷积** 的计算量进行对比。 1. **普通卷积** 的计算量是: H ′ × W ′ × D × K × K × F H' \\times W' \\times D \\times K \\times K \\times F H′×W′×D×K×K×F 2. **深度可分离卷积** 的计算量是: H ′ × W ′ × D × K × K + H ′ × W ′ × D × F H' \\times W' \\times D \\times K \\times K + H' \\times W' \\times D \\times F H′×W′×D×K×K+H′×W′×D×F #### 示例分析 假设: * 输入图像的尺寸为 **H = W = 224** ,通道数 **D = 64**。 * 输出通道数 **F = 128**。 * 使用 **3x3 卷积核**。 ##### 普通卷积 普通卷积的计算量为: 224 × 224 × 64 × 3 × 3 × 128 = 2 , 015 , 232 , 000 224 \\times 224 \\times 64 \\times 3 \\times 3 \\times 128 = 2,015,232,000 224×224×64×3×3×128=2,015,232,000 ##### 深度可分离卷积 1. **深度卷积** 的计算量为: 224 × 224 × 64 × 3 × 3 = 403 , 107 , 840 224 \\times 224 \\times 64 \\times 3 \\times 3 = 403,107,840 224×224×64×3×3=403,107,840 2. **逐点卷积** 的计算量为: 224 × 224 × 64 × 128 = 402 , 653 , 184 224 \\times 224 \\times 64 \\times 128 = 402,653,184 224×224×64×128=402,653,184 所以,深度可分离卷积的总计算量是: 403 , 107 , 840 + 402 , 653 , 184 = 805 , 761 , 024 403,107,840 + 402,653,184 = 805,761,024 403,107,840+402,653,184=805,761,024 #### 结论 从这个例子可以看出,**深度可分离卷积** 的计算量是 **普通卷积** 的大约 **1/2** 。即使表面上看似增加了一个 **1x1 卷积**,但通过深度卷积的分离操作,深度可分离卷积显著减少了计算量,特别是在输入通道数和输出通道数较大时,它的优势更加明显。 所以,深度可分离卷积通过将 **空间卷积** 和 **通道卷积** 分开,实际上能够大幅度减少计算量,尤其是在通道数较大时,它能够有效降低计算资源的消耗,适用于移动端和边缘设备等计算能力受限的场景。 哈哈哈,又被一个唬人的名词给骗了。傻逼chatGPT一直说不明白,发现chatGPT很多数学计算很多还是错的,就非常不理解,为什么AI的最基本数学运算还能出错。后来查了下,才发现,因为它用的是大模型本身自带的推理能力,而不是严格的数学计算过程。就是给道数学题,正常人应该是计算结果,他是看一大群正常人计算以后,猜结果。难怪那么不靠谱,以后它的数学结果只能用作参考。 ### CSPdarknet **CSPDarknet** 是一种基于 **Darknet** 网络结构的改进版本,采用了 **CSPNet** (Cross-Stage Partial Network)理念。CSPDarknet 是针对 **YOLOv4** 和 **YOLOv5** 等目标检测任务进行的网络结构优化。通过引入 CSP 的思想,CSPDarknet 提高了模型的计算效率,同时保持了较高的检测精度。 #### 背景 * **Darknet** :原本是 **YOLO** 系列网络的基础架构,它是一种高效的卷积神经网络(CNN)。目的减少了计算量。 * **CSPNet(Cross-Stage Partial Network)**:CSPNet 通过将网络分为多个部分(stage),并只使用部分网络进行计算,可以显著减少计算量和内存消耗,同时保持模型的性能。 CSPDarknet 就是在 **Darknet** 基础上引入 **CSPNet** 的设计理念,进一步提升了模型的效率和精度,特别是在处理高分辨率图像时。 #### CSPDarknet的设计思路 CSPDarknet 的主要创新点是引入 **CSPNet** 中的 **跨阶段部分连接**(Cross-Stage Partial Connections)。这意味着,在每一阶段(stage)中,网络不再全部参与计算,而是将一部分计算传递到下一个阶段,另一部分则通过一个新的连接路径进行处理。 #### CSPDarknet的关键组成部分 ##### 1. 跨阶段部分连接(CSP) 在传统的网络中,每一层的输出都会传递到下一层,而 CSPNet 则将网络分为两个部分,分别计算,然后将结果进行合并。这样,计算密集型部分和计算轻量部分的输出在每个阶段都进行***交替处理***,避免了在每一层都进行大规模计算,减少了冗余计算和内存消耗。 ##### 2. 深度可分离卷积(Depthwise Separable Convolution) 为了进一步减少计算量和模型参数,CSPDarknet 还引入了 **深度可分离卷积** ,该操作将标准卷积分解为两个操作:深度卷积和逐点卷积。深度卷积仅在每个通道上进行卷积操作,而逐点卷积使用 **1x1 卷积核** 来混合不同通道的信息,这样就大大减少了计算量。 ##### 3. 残差连接(Residual Connections) 与传统的网络一样,CSPDarknet 也使用了 **残差连接**。残差连接能够让梯度在反向传播时更容易传播,防止梯度消失问题,并且可以加速训练过程。 ##### 4. 多尺度特征融合 CSPDarknet 还支持 **多尺度特征融合**,即在不同层次上提取的特征可以被组合并用于最终的输出,这对于目标检测任务非常重要。 #### CSPDarknet与传统Darknet的对比 | 方面 | Darknet | CSPDarknet | |--------|---------------|------------------| | 计算量 | 较大 | 较小 | | 网络深度 | 深度较大,参数较多 | 通过 CSP 技术减少了冗余计算 | | 特征提取效率 | 良好,但对高分辨率图像较慢 | 高效的特征提取和计算能力 | | 适用场景 | 适用于一般的目标检测任务 | 特别适用于计算资源有限的设备 | #### CSPDarknet的优点 1. **计算效率高**:由于引入了跨阶段部分连接和深度可分离卷积,CSPDarknet 在计算资源受限的设备上也能较好地运行。 2. **参数少**:通过 CSP 的设计,网络的参数量比传统的 Darknet 少,从而减少了模型存储的需求。 3. **良好的特征提取能力**:CSPDarknet 保留了 Darknet 在目标检测中的优越特性,同时通过优化提高了其对高分辨率图像的处理能力。 4. **适应性强**:CSPDarknet 可以适应各种不同的硬件设备,特别适合在移动端和嵌入式设备上进行部署。 ### 动态Soft-NMS **动态 Soft-NMS (Dynamic Soft Non-Maximum Suppression)** 是 **Soft-NMS** 方法的改进版本,用于目标检测中的后处理步骤,特别是在目标检测框的筛选中。它的主要目的是改进标准 **Non-Maximum Suppression (NMS)** 方法,解决传统 NMS 在处理重叠目标时可能导致的误删问题。动态 Soft-NMS 在 **Soft-NMS** 的基础上引入了动态的调整机制,以提高模型的精度,尤其在目标密集的场景下。 #### 背景与传统 NMS **Non-Maximum Suppression (NMS)** 是一种常用的后处理方法,用于在目标检测中筛选最佳的边界框。NMS 的基本步骤如下: * 对所有候选框进行按得分(通常是置信度分数)排序。 * 选出得分最高的框,并将其作为最终的检测框。 * 计算这个框与其他框的 **IoU(Intersection over Union)**,并将与其有较高 IoU 的框去除(即认为这些框对应的是同一个目标)。 * 重复这个过程,直到所有框都被处理。 尽管 NMS 很有效,但它存在一些问题,尤其是当目标过于密集时,NMS 可能会错误地删除一些有用的检测框。这是因为传统的 NMS 仅通过阈值判断是否去除重叠框,且不考虑框之间的关系强度(如得分和重叠程度)。 #### Soft-NMS:改进的非最大抑制 **Soft-NMS** 是对传统 NMS 的一种改进,主要解决了在目标密集时误删框的问题。与传统 NMS 将重叠框直接删除不同,Soft-NMS 会根据 **IoU** 与当前框的重叠程度,动态地调整重叠框的得分,而不是直接删除它们。通俗的说,就是,交集越大,就打分降得越厉害。 Soft-NMS 的工作原理如下: * 对每个候选框,根据与得分最高的框的 **IoU** 值,动态地调整该框的得分。 * 设定一个阈值来控制当框之间的 IoU 较大时,得分应该降低多少。 * 如果 IoU 较小,则不对框进行抑制,保留该框的得分。 * 最终,选出剩余得分较高的框。 #### 动态 Soft-NMS 动态 Soft-NMS 是 Soft-NMS 的进一步改进,结合了 **自适应阈值** 和 **动态调整机制** 。与 Soft-NMS 固定的阈值不同,动态 Soft-NMS 根据每个目标的不同情况,动态调整 **抑制强度**(通常是与框的得分或框的大小相关)。这种方法通过根据目标密度和目标大小动态调整抑制规则,来进一步提高检测精度,特别是在目标密集和目标尺度变化较大的场景中。 #### 4. 动态 Soft-NMS 的工作原理 动态 Soft-NMS 的主要思路是在进行框的抑制时,根据具体情况 **动态地调整抑制强度**,而不是固定使用一个统一的阈值。这种动态调整通常基于以下几个因素: * **框的得分**:得分较高的框可能在抑制时应该保持较高的得分,而得分较低的框则可能需要更强的抑制。 * **框的大小**:目标的尺寸影响其与其他目标的重叠度,较小的目标可能会因为和大目标重叠较多而被错误删除,动态调整可以避免这种情况。 * **目标密度**:在目标密集的情况下,动态调整抑制强度可以帮助在多个相互重叠的目标中选择最合适的检测框。 #### 动态 Soft-NMS 的公式 假设我们有一个候选框 b i b_i bi 和一个参考框 b j b_j bj,其重叠度(IoU)为 I o U ( b i , b j ) IoU(b_i, b_j) IoU(bi,bj)。传统 NMS 会根据阈值直接抑制掉重叠框,而 Soft-NMS 会根据以下公式来调整 b i b_i bi 的得分: S i = S i × exp ( − I o U ( b i , b j ) 2 σ ) S_i = S_i \\times \\exp(-\\frac{IoU(b_i, b_j)\^2}{\\sigma}) Si=Si×exp(−σIoU(bi,bj)2) 框 b i 的最终得分 = 框 b i 的原始得分 × exp ( − 框 b i 与框 b j 的 I o U 值 ) 2 σ ) 框 b_i 的最终得分 = 框 b_i的原始得分\\times \\exp(-\\frac{框 b_i 与框 b_j 的 IoU 值)\^2}{\\sigma}) 框bi的最终得分=框bi的原始得分×exp(−σ框bi与框bj的IoU值)2) 其中: * S i S_i Si 是框 b i b_i bi 的原始得分。 * I o U ( b i , b j ) IoU(b_i, b_j) IoU(bi,bj) 是框 b i b_i bi 与框 b j b_j bj 的 IoU 值。 * σ \\sigma σ 是一个控制抑制强度的参数,通常是一个超参数,可以根据具体情况动态调整。 在动态 Soft-NMS 中, σ \\sigma σ 的值可以根据每个框的特征动态调整,而不固定。 #### 动态 Soft-NMS 的优势 * **避免过多误删框**:动态 Soft-NMS 能够在目标密集时避免传统 NMS 中的误删问题,保留更多有用的框。 * **自适应性强**:通过动态调整抑制强度,能够适应不同场景和目标密度,从而提高精度。 * **提高检测精度**:尤其在密集目标和多尺度场景下,动态 Soft-NMS 能够更准确地选择目标框,减少漏检和误检。