基础知识点 | 记忆点 | 备注 |
Batch Norm | 达到的效果 | BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布。 |
出发点 | 解决covariate shift:如果ML系统实例集合 问题:分布变化=>非线性输出向两端移动=>梯度消失=>网络收敛慢 解决:BN=>将隐藏层的输入拉回到(0,1)正态分布=>使激活值落在非线性区域=>使得梯度变大=>加快网络收敛 |
|
保障非线性 | BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift) 核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。 |
|
推理时的参数 | 推理的时候可能bs是1,那么α,γ,μ和σ从何而来呢? 参数α和γ是最后收敛的参数,而μ和σ则在训练的时候记住每个batch内的参数,然后求出平均值和方差的期望,这样在全局上估计的这组参数更加准确。 如何减少这些参数的存储量? 可以采用训练收敛最后几批mini batch的 μ和σ的期望,作为预测阶段的μ和σ |
|
正则化作用 | 在BN层中,每个batch计算得到的均值和标准差是对于全局均值和标准差的近似估计,这为我们最优解的搜索引入了随机性,从而起到了正则化的作用。 | |
BN的缺陷 | 带有BN层的网络错误率会随着batch_size的减小而迅速增大,当我们硬件条件受限不得不使用较小的batch_size时,网络的效果会大打折扣。 | |
BN/LN/IN/GN | 示意图 | |
均值方差的作用位置 |
|
|
相比BN为什么好? | LN/IN和GN都没有对batch作平均,所以当batch变化时,网络的错误率不会有明显变化 | |
经验表现 | LN和IN 在时间序列模型(RNN/LSTM)和生成模型(GAN)上有很好的效果,而GN在视觉模型上表现更好。 |
基础知识点 | 记忆点 | 备注 |
dropout | 概念 | 在每个训练批次中,神经元的激活值以一定的概率p停止工作 |
目的 | 起到正则化作用,可以使模型泛化性更强,因为模型不会太依赖某些局部的特征。 | |
示意图 | 面试问到是冻结权重还是冻结神经元? 答冻结神经元。 |
|
为什么缓解过拟合? 为什么有人说dropout类似model ensemble的效果? |
1.dropout每次隐藏部分神经元,就像是在训练不同的模型,因为每次网络的结构都不同。整个dropout就像是在对多个模型进行了ensemble。不同模型可能产生不同的过拟合,互相之间进行ensemble,就会起到平均效果更好。 2.dropout有可能减少密集的局部连接,迫使模型去学习更为全局更为robust的特征,而模型不应该因为局部的细节而产生大的变化。 |
方法 | 知识点 | 备注 |
输入数据 | 增大采集图像分辨率 | 相当于给框增加更为丰富的信息,以便提取到更复杂的特征。 |
增大模型图像输入分辨率 | 增大输入分辨率来提升小目标的检测能力。 | |
模型与模块 | 图像金字塔 | MTCNN使用了图像金字塔;缺点是多次特征提取,慢。 |
FPN/PAN/BiFPN | 一次forward就可以识别多个尺度,可以提升小尺度的识别。 | |
ASPP/SPP/RFBNet | 不同尺度的特征融合,在扩大感受野的同时,也融合多个尺度的特征,增强了模型对于小目标的检测能力。 | |
2-stage目标检测 | ROI pooling => ROI Align ,因为ROI pooling对于小目标的定位损失是巨大的。 | |
Perceptual Generative Adversarial Networks for Small Object Detection | Perceptual Generative Adversarial Networks for Small Object Detection中用使用感知生成式对抗网络(Perceptual GAN)提高小物体检测率,generator将小物体的poor表示转换成super-resolved的表示,discriminator与generator以竞争的方式分辨特征。Perceptual GAN挖掘不同尺度物体间的结构关联,提高小物体的特征表示,使之与大物体类似。包含两个子网络,生成网络和感知分辨网络。生成网络是一个深度残差特征生成模型,通过引入低层精细粒度的特征将原始的较差的特征转换为高分变形的特征。分辨网络一方面分辨小物体生成的高分辨率特征与真实大物体特征,另一方面使用感知损失提升检测率。在交通标志数据库Tsinghua-Tencent 100k及Caltech上实验。 | |
Data Augmentation | 《Augmentation for small object detection》 |
|
anchor | anchor-based |
|
自适应Anchor阈值调整 | ||
finetune | 对小分辨率单独finetune | 在正常数据上做训练,再在小目标上做微调。 |
一种自己独创的方法 | 根据mask来识别小目标,做loss加权 | 对mask图使用opencv来标记轮廓。 code as follow: import cv2 """ contours, hierarchy = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) |
loss函数 | 记忆点 | 备注 |
CE | 交叉熵的推理 | 1.信息量的表示 2.熵是信息量的期望 3.相对熵(KL散度)表示两个分布的差异 4.交叉熵是相对熵的数学变形 前面是p(x)的熵,是一个常量。后面就是交叉熵。 |
loss的形式 | ||
分类loss为什么prefer交叉熵than MSE? | MSE不能保证误差越大,梯度越大,学习越快。而交叉熵可以,因此收敛更好更快。 | |
Focal | 解决的问题 | 1.解决类别不平衡 2.难易样本分布不平衡 |
loss的形式 | ||
loss的参数 | 1.基于交叉熵演变而来。 2.γ用来调节样本难易程度,一般取2。γ提升了预测与GT差距大的样本对loss的贡献比(困难样本)。 3.α用来调节样本类别的比例,默认α=0.25,将前景的loss放大而背景的loss缩小。 |
|
Dice | 解决的问题 | 语义分割中正负样本不平衡 |
loss的形式 | Dice系数: Dice loss: Laplace Smoothing: |
|
Dice的优势劣势 |
|
指标名称 | 记忆点 | 备注 |
MAP(目标检测) | TP、TN、FP、FN | |
Precision & Recall | Precision = TP / (TP + FP) Recall = TP / (TP + FN) | |
AP | 按照模型给出的置信度,对每个类的所有预测框进行排序: 逐个计算Precision 和 Recall,绘制PR曲线,AP就是PR曲线上的Precision值求均值。 实际应用中就会对PR曲线最做平滑: |
|
MAP | MAP就是对所有类的AP做平均值。 | |
MIOU(语义分割) | IOU | IOU的定义:计算真实值和预测值两个集合的交集和并集之比 IOU=TP/(FP+FN+TP) |
MIOU | 对于不同类别的IOU求平均值 | |
MIOU的数学表达 | pij表示真实值为i,被预测为j的数量, K+1是类别个数(包含空类)。pii是真正的数量。pij、pji则分别表示假正和假负。 |
基础知识点 | 记忆点 | 备注 |
图像基础知识 | 数字图像 | 数字图像又称数码图像或者数位图像,是二维图像用有限数字数值像素的表示,由数组或者矩阵表示。数字图像可以理解为一个二维函数f(x, y),其中x,y是空间的坐标,而任意位置的幅值f称为图像在该点的强度或者灰度。 |
常见的电磁波成像特点 (按照频率从高到低) |
γ射线成像:波长最短,频率最高,是由原子核内发射出来的电磁波。放射性物质或者原子核反应中常有这种辐射。γ射线穿透力强,对生物破坏性大。 x射线成像:CT就是用x射线照射物体。由于生物组织或者工程组件的不同部位对x射线的吸收率不同,从而得到不同的衰减以成像(密度越高,吸收的越多)。 紫外线成像:具备化学效应和荧光效应,常用于生物医学。 可见光波段成像 红外线成像:一切物体都可以辐射出红外线,可利用探测仪测量目标本身与背景间的红外线差得到红外图像。 微波成像:用于雷达以及生成地表情报图。 射频成像:电视、无线电、手机的波段。也可以用于医学,比如磁共振。 |
|
常见的图像格式 | ||
读取图像 | # cv2读取 & 直接呈现
tips: flags=0代表灰度图,flages=1代表彩图,默认是三通道彩图。 |
|
图像直方图 | 图像直方图是以表示数字图像中亮度分布的直方图,表达了图像亮度的整体分布。常用来二值化。
|
|
颜色空间 | RGB:依据人眼的颜色空间。有RGB三通道,范围都是0-255。 HSV:H(色调),代表色彩;S(饱和度),取值是0-100%,值越大,颜色越饱和;V(明度),从0%(黑)到100%(白)。 HSI:H(色调),S(饱和度),I(强度)。 CMYK:C(青)、M(品红)、Y(黄),常用于印刷行业。 opencv中颜色空间的改变也是cv2.cvtcolor() |
|
opencv绘图 | # 1,绘制线段 if show_control == 1: img = np.zeros((512, 512, 3)) cv2.imshow("origin photo", img) cv2.waitKey(2000) cv2.line(img, (0, 0), (250, 250), color=(0, 0, 255), thickness=1) cv2.imshow("photo with a line", img) cv2.waitKey(2000) cv2.destroyAllWindows() #2. 绘制矩形 需要左上角 右下角的坐标 if show_control == 2: img = cv2.imread("../test.jpg", flags=1) cv2.rectangle(img, (251, 402), (373, 464), color=(0, 0, 255), thickness=2) cv2.putText(img, "bobbies", (253, 400), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(25, 0, 0), thickness=2) cv2.imshow("rectangle photo", img) cv2.waitKey(2000) cv2.destroyAllWindows() #3. 绘制圆形 需要圆心和半径 if show_control == 3: img = np.zeros((512, 512, 3)) cv2.circle(img, (100,100), 20, color=(0, 0, 255)) cv2.imshow("circle", img) cv2.waitKey(2000) cv2.destroyAllWindows() |
|
图像基础处理 | 图像平移 | img = cv2.imread("../test.jpg") # x方向移动多少, y方向移动多少 H = np.float32([[1, 0, 50], [0, 1, 25]]) rows, cols = img.shape[: 2] # 注意这里rows和cols需要反置,先列后行 res = cv2.warpAffine(img, M=H, dsize=(cols, rows)) cv2.imshow("origin pic", img) cv2.imshow("affine pic", res) cv2.waitKey(0) |
图像缩放 | 常见的插值方法:
|
|
图像旋转 | # 旋转 if control == 2: img = cv2.imread("../test.jpg") h, w = img.shape[:2] # scale >0 逆时针旋转 scale<0 顺时针旋转 angle旋转角度 H = cv2.getRotationMatrix2D(center=(h/2, w/2), angle=45, scale=0.5) res = cv2.warpAffine(img, M=H, dsize=(w, h)) cv2.imshow("rotation", res) cv2.waitKey(0) cv2.destroyAllWindows() |
|
仿射变换 | if control == 3: img = cv2.imread("../test.jpg") h, w = img.shape[:2] # 用三个点来确定仿射变换 pos1 = np.float32([[50, 50], [200, 50], [50, 200]]) pos2 = np.float32([[10, 100], [200, 50], [100, 250]]) H = cv2.getAffineTransform(pos1, pos2) res = cv2.warpAffine(img, M=H, dsize=(w, h)) cv2.imshow("affine", res) cv2.waitKey(0) cv2.destroyAllWindows() |
|
透视变换 | img = cv2.imread("../test.jpg") h, w = img.shape[:2] pos1 = np.float32([[114, 82],[287, 156], [8, 100], [143, 177]]) pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]]) H = cv2.getPerspectiveTransform(pos1, pos2) #图像透视变换 result = cv2.warpPerspective(img, H, dsize=(w, h)) cv2.imshow("origin pic", img) cv2.imshow("warp pic", result) cv2.waitKey(0) cv2.destroyAllWindows() |
|
图像滤波操作 | 滤波基本原理 | 基本原理:图像可以看作是二维的信号,像素点的灰度值代表着信号的强弱。图像中变化强烈的部分称为高频部分,图像中变化缓慢的部分称为低频部分。可以根据图像的高低频,设置高通或者低通滤波器。高通可以检测变化尖锐明显的部分,低通可以让图像变得平滑,消除噪声。高通滤波器常用于边缘检测,低通滤波器常用于图像平滑去噪。 |
方框滤波 | img = cv2.imread("../test.jpg", flags=1)
kernel内元素全部是1。 注意进行normalize,否则图像会因为超过255,变白,另外kernel越大,模糊的效果越明显。 |
|
均值滤波(平均模糊) | if control == 2: kernel内元素全部是1。 等同于加了normalize的方框滤波。 |
|
高斯滤波 | if control == 3:
|
|
中值滤波 | 中值滤波是一种非线性滤波,是用像素点邻域灰度的中值代替该点的灰度值。,中值滤波可以取出椒盐噪声和斑点噪声。
if control == 4: |
|
双边滤波 | 双边滤波是一种非线性滤波,是结合像素的空间邻近度和像素值相似度的一种折中处理。同时考虑空间信息和灰度的相似性,达到保边去噪的目的。具有简单、非迭代、局部处理的特点。双边滤波可以有效保证边缘信息。
# 双边滤波 |
|
图像增强 | 灰度直方图均匀化 | 直方图均匀化就是将原图像经过某种变化,得到一副灰度直方图均匀的图像。直方图均匀化的思想就是对图像中像素个数较多的灰度级进行展宽,从而对像素较少的灰度级进行缩减。从而达到清晰图像的目的。工业上常用来解决过曝的情况。
img = cv2.imread("../dark_girl.jpg",flags=0) |
彩色直方图均匀化 | if control == 2: img = cv2.imread("../dark_girl.jpg") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) r, g, b = cv2.split(img) equal_r = cv2.equalizeHist(r) equal_g = cv2.equalizeHist(g) equal_b = cv2.equalizeHist(b) img_equal = cv2.merge((equal_r, equal_g, equal_b)) plt.figure(figsize=(12, 6)) plt.subplot(121) plt.title("origin") plt.imshow(img) plt.subplot(122) plt.title("equalize") plt.imshow(img_equal) plt.show() |
|
Gamma变化 | Gamma变化是对输入图像灰度值进行的非线性操作。使输出图像的灰度值和输入图像的灰度值呈现指数的关系。 Gamma变化用来进行图像增强,让图像从曝光强度的线性响应变得更接近人眼感受的响应。既对相机曝光或者光照不足的情况进行调节。
img = cv2.imread("../guobao.jpg") |
|
形态学操作 | 什么是形态学? | 形态学是最为常见的图像技术,主要从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域。 |
腐蚀 | 针对图像的白色部分,膨胀进行扩张,白色区域变大,腐蚀进行收缩,白色区域变小。 腐蚀:用模板B来腐蚀A就是用B来逐步卷积A,模板B有一个锚点和锚框,如果锚点落在前景内,且锚框都落在前景内,则保留锚点像素。如果锚点落在前景内,锚框没有完全包含在前景内,则去除锚点像素改为背景。 img = cv2.imread("../erode.jpg") |
|
膨胀 | 腐蚀的对偶运算。 同样使用模板B来卷积A,模板内包含锚点和锚框。如果锚框和前景有交集,如果此时锚点对应着背景,那么就把背景膨胀为前景。 |
|
开运算 | 先腐蚀后膨胀,把细微连在一起的物体分开,把物体的表面进行平滑。 换句话说开运算能够去除孤立的小点,毛刺和小桥,但总的位置和形状不变。
if control == 3: |
|
闭运算 | 先膨胀运算再腐蚀运算。 闭运算能够将两个细微连接的图封闭到一起,可以去除孔洞和弥补小裂缝,并且保持整体的位置形状不变。
if control == 4: |
|
形态学梯度 | ||
顶帽和黑帽 |
# 形态学梯度 膨胀-腐蚀 |
|
图像分割 | 分割原则 | 分割的原则就是使划分后的子图在内部保持相似度最大,而子图之间的相似度保持最小。 |
固定阈值分割 | if control == 1: |
|
自适应阈值分割 | 自适应阈值法会每次取出图像的一小部分计算阈值,这样不同区域的阈值就不尽相同,适用于明暗分布不均的图片。
|
|
迭代法阈值分割 | 求出图像的最大灰度和最小灰度值,分别记为Zmax和Zmin,令初始阈值T0 = 1/2(Zmax + Zmin)。 根据阈值Tk,将图像分为前景和背景,分别求出两者的平均灰度值ZO和ZB。 求出新阈值Tk+1 = 1/2(ZO + ZB)。 若TK = TK + 1,则得到最终阈值,否则继续迭代2。 使用最后的阈值。 |
|
大津阈值分割法 | # 大津法阈值分割 |
|
边缘检测 |
常见的梯度算子:
优点:边缘定位较为准确,适用于边缘明显且噪声少的图像。 缺点:没有描述水平和竖直方向的灰度变化,只关注了对角线方向,容易造成边缘的遗漏;鲁棒性差,因为点本身参与梯度的计算,不能有效抑制噪声的干扰。
Prewitt算子引入了类似局部平均的运算,对噪声更有平滑作用,可以抑制噪声。
|
|
|
||
连通区域 | 连通区域:一般指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域。连通区域分析是将图像中各自联通区域找到并且标记。 Two-pass算法: |
|
区域生长 | 区域生长:是一种串行区域分割的方法。从某个像素出发,按照一定的准则,逐步加入邻近像素。当满足一定的条件的时候,区域停止生长。 |
|
分水岭算法 | 原理:任意的灰度图像。高亮度的是山峰,低亮度的是山谷。 |