YOLOv4学习摘要

本文主要是学习yolov4论文的一些学习笔记,可能不会那么详细。所以在文章最后列出了一些参考文献,供大家参考 yolo系列发展历程 yolo系列 发表时间 作者 mAP FPS mark yolov1 2016 Joseph Redmon 63.4 (VOC 2007+2012) 45 (448*448) yolov2 2016 Joseph Redmon 21.6 (coco test-dev2015) 59(480*480) yolov3 2018 Joseph Redmon 33 (coco) 20(608608), 35(416416) yolov4 2020 Alexey Bochkovskiy、Chien-Yao Wang 43.5 (coco) 65(608*608) yolov5 2020 Glenn Jocher (Ultralytics CEO) 48.2 (coco) 没有实测数据 没有论文,学术界不认可;该模型有不同大小的模型 scaled-yolov4 2021 Chien-Yao Wang、 Alexey Bochkovskiy 47.8 (coco) 62(608*608) 该模型有不同大小的模型 插曲,与中心思想无关 我们看到yolov1到v4 是由不同作者完成的,因为yolo 原作者已经在2018年推出CV界了,在yolov3论文的最后作者是这么写的 他发现他的研究成果被应用于战争,还有一些隐私的问题,所以他决定推出了…… yolo系统v1-v3由原作者Joseph Redmon完成,v4由AB(Alexey Bochkovskiy)完成,AB是参与前几个系列yolo代码的开发的,并且yolov4是得到原作者的认可的,在作者的原网页上有引用。 代码实现...

九月 27, 2022 · 2 分钟 · Pan

Transformer in pytorch

一 Transformer overview 本文结合pytorch源码以尽可能简洁的方式把Transformer的工作流程讲解以及原理讲解清楚。全文分为三个部分 Transformer架构:这个模块的详细说明 pytorch中Transformer的api解读 实际运用:虽然Transformer的api使用大大简化了打码量,但是还有需要自已实现一些代码的 Transformer架构 Transformer结构如下: ![image.png](/Transformer in pytorch/8596800-4764969fee815f44.png) Transformer的经典应用场景就是机器翻译。 整体分为Encoder、Decoder两大部分,具体实现细分为六块。 输入编码、位置编码 Encoder、Decoder都需要将输入字符进行编码送入网络训练。 Input Embeding:将一个字符(或者汉字)进行编码,比如“我爱中国”四个汉字编码后会变成(4,d_model)的矩阵,Transformer中d_model等于512,那么输入就变成(4,512)的矩阵,为了方便叙述,后面都用(4,512)来当成模型的输入。 positional encoding:在Q、K、V的计算过程中,输入单词的位置信息会丢失掉。所以需要额外用一个位置编码来表示输入单词的顺序。编码公式如下 $PE_{pos,2i}=sin(pos/1000^{2i/d_{model}})$ $PE_{pos,2i+1}=cos(pos/1000^{2i/d_{model}})$ 其中,pos:表示第几个单词,2i,2i+1表示Input Embeding编码维度(512)的偶数位、奇数位。 论文中作者也试过将positional encoding变成可以学习的,但是发现效果差不多;而且使用硬位置编码就不用考虑在推断环节中句子的实际长度超过训练环节中使用的位置编码长度的问题;为什么使用sin、cos呢?可以有效的考虑句中单词的相对位置信息 多头注意力机制(Multi-Head Attention) 多头注意力机制是Transformer的核心,属于Self-Attention(自注意力)。注意只要是可以注意到自身特征的注意力机制就叫Self-Attention,并不是只有Transformer有。 示意图如下 ![image.png](/Transformer in pytorch/8596800-993737ea7c1e190a.png) Multi-Head Attention的输入的Q、K、V就是输入的(4,512)维矩阵,Q=K=V。然后用全连接层对Q、K、V做一个变换,多头就是指的这里将输入映射到多个空间。公式描述如下: $MultiHead(Q,K,V)=Concat(head_1, head_2,…, head_n)W^o$ 其中 $head_i=Attention(QW^Q_i, KW^K_i, VW^V_i)$ 其中 $Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V$ 其中$W^Q_i\in R^{d_{model}*d_k}, W^K_i\in R^{d_{model}*d_k}, W^V_i\in R^{d_{model}d_v}, W^o\in R^{hd_vd_{model}}$, 论文中h=8, $d_k=d_v=d_{model}/h=512/8=64$ $QK^T$称为注意力矩阵(attention),表示两个句子中的任意两个单词的相关性。所以attention mask不一定是方阵。 前向传播模块 Q、K、V经过Multi-Head Attention模块再加上一个残差跳链,维度不变,输入维度是(4,512),输出维度还是(4,512),只不过输出的矩阵的每一行已经融合了其他行的信息(根据attention mask)。 这里前向传播模块是一个两层的全连接。公式如下: $FFN(x)=max(0, xW_1+b_1)W_2+b_2$, 其中输入输出维度为$d_model=512$, 中间维度$d_{ff}=2048$ 带Mask的多头注意力机制 这里的Mask Multi-head Attention与步骤2中的稍有不同。“我爱中国”的英文翻译为“I love china”。 在翻译到“love”的时候,其实我们是不知道“china”的这个单词的,所以在训练的时候,就需要来模拟这个过程。即用一个mask来遮住后面信息。这个mask在实际实现中是一个三角矩阵(主对角线及下方为0,上方为-inf), 定义为$attention_mask$大概就长下面这个样子 !...

九月 17, 2022 · 7 分钟 · Pan

机器学习基础之参数估计

机器学习基础之参数估计 一、参数估计 对所要研究的随机变量$\xi$,当它的概率分布的类型已知,但是参数未知,比如$\xi$服从正太分布$N(\alpha, \sigma)$。但是$\alpha, \sigma$这两个参数未知。那么这么确定这些未知参数呢?我们可以通过采样的方式,得到一批样本数据,用样本的统计量来估计总体的统计量。那么这种方式就是参数估计。 我们先来看一种简单的估计。 矩法估计:设总体$\xi$的分布函数$F(x; \theta_1,\theta_2, …, \theta_l)$中$l$个未知参数$\theta_1,\theta_2, …, \theta_l$。假定总体$\xi$的$l$阶原点绝对矩有限,并记$v_k=E(\xi^k) (k=1,2,…,l)$。现用样本的k阶原点矩来作为总体的k阶矩的估计量$\hat{v}_k$。即 $v_k=\hat{v}k=\frac{1}{n}\sum{i=1}^n\xi_i^k$ 那么通过样本的估计量,我们就可以估计出总体的一些参数。 比如假设$\xi$服从一个分布(不管什么分布),$E(\xi)=\alpha, D(\xi)=\sigma^2$。但其值未知,则由样本的一阶矩、二阶矩 $\hat{v}1=\frac{1}{n}\sum{i=1}^n\xi_i=\overline{\xi}$ $\hat{v}2=\frac{1}{n}\sum{i=1}^n\xi^2_i$ 总体的一阶矩、二阶矩 $v_1=E(\xi^1)=\alpha, v_2=E(\xi^2)=D(\xi)+(E(\xi))^2=\sigma^2+\alpha^2$ 令$v_1=\hat{v}_1, v_2=\hat{v}_2$, 就可以解出参数$\alpha, \sigma$的值. $\hat{\alpha}=\overline{\xi}\ \hat{\sigma^2}=\frac{1}{n}\sum_{i=1}^n\xi^2_i-(\overline{\xi}^2)=\frac{1}{n}\sum_{i=1}^n(\xi_i-\overline{\xi})^2=S^2$ 二、极大似然估计(Maximum Likelihood Estimate) 矩法估计要求随机变量$\xi$的原点矩存在。再者,样本矩的表达式用总体$\xi$的分布函数表达式无关,因此矩法估计没有充分利用分布函数对参数提供的信息。所以很多时候我们采用极大似然估计 (极大似然估计)设总体的$\xi$的密度函数为$f(x;\theta_1, \theta_2, …, \theta_l)$,其中$\theta_1, \theta_2, …, \theta_l$为未知参数。$\xi_1, \xi_2, …, \xi_n$为样本,它的联合密度函数为$f(x_1, x_2, …, x_n;\theta_1, \theta_2, …, \theta_l)$。 称 $L(\theta_1, \theta_2, …, \theta_l)=\prod_{i=1}^nf(x_i; \theta_1, \theta_2, …, \theta_l)$为$\theta_1, \theta_2, …, \theta_l$的似然函数。若有$\hat{\theta_1}, \hat{\theta_2}, …, \hat{\theta_l}$使得下试成立: $L(\hat{\theta_1}, \hat{\theta_2}, …, \hat{\theta_l})=max {L(\theta_1, \theta_2, …, \theta_l)}$, 则称$\hat{\theta_1}, \hat{\theta_2}, …, \hat{\theta_l}$为为参数$\theta_1, \theta_2, …, \theta_l$的极大似然估计量...

九月 4, 2022 · 1 分钟 · Pan

机器学习基础之反向传播

机器学习基础二-反向传播 神经网络之所以可以训练,得益于与Hinton在1986年提出的反向传播算法。反向传播背后的数学原理就是链式法则。本文会具体的实例来演示反向传播具体的计算过程,让大家有一个实际的印象。文中公式都是一个字符一个字符敲出来的,转载请注明出处。文中参考了其他作者的一些例子和数据,均在参考文献中列出。 一个简单的两层神经网络如上图所示。其中 $i_1, i_2$ : 训练时候实际的输入 $o_1, o_2$ : 训练时候实际的输出(ground truth) $out_{o1}, out_{o2}$: 模型预测的结果 我们的目的就是通过反向传播,更新模型的参数$w_i,b_i$, 使得$out_{o1}, out_{o2}$尽可能的逼近$o_1, o_2$。 本例中激活函数用$sigmod(x)=\frac{1}{1+e^{-x}}$; 损失函数用$L_2=\frac{1}{2} \times (target-output)^2$ 前向传播 隐藏层计算 $net_{h1}=w_1 \times i_1+w_2 \times i_2+b_1=0.15 \times 0.05+0.2 \times 0.1+0.35=0.3775$ $out_{h1}=sigmod(net_{h1})=\frac{1}{1+e^{-0.3775}}=0.593269992$ 同理 $out_{h2}=0.596884378$ 输出层计算 $net_{o1}=w_5 \times out_{h1}+w_6m \times out_{h2}+b_2\=0.4 \times 0.593269992+0.45 \times 0.596884378=1.105905967$ $out_{o1}=sigmod(net_{o1})=0.75136507$ 同理 $out_{o2}=0.772928465$ 最终我们看到前向传播的结果为(0.75136507,0.772928465)与我们的目标(0.01,0.99)差的比较多,所以接下来用反向传播算法学习 反向传播 要想反向传播,还需要两步(1)计算损失,(2)计算梯度。过程如下图所示 总的损失$E_{total}=E_{o1}+E_{o2}$,其中 $$\begin{align} E_{o1} &=\frac{1}{2}(target_{o1}-out_{o1})^2 \\ &= \frac{1}{2}(0.01-0.75136507)^2=0.274811083 \end{align}$$ $$E_{o2}=\frac{1}{2}(target_{o2}-out_{o2})^2=0.023560026$$ $$E_{total}=E_{o1}+E_{o2}=0.274811083+0.023560026=0.298371109 $$ 计算参数$w_5$的梯度 根据链式法则,公式如下: $\frac{\partial E_{total}}{\partial w_5}=\frac{\partial E_{total}}{\partial out_{o1}} \times \frac{\partial out_{o1}}{\partial net_{o1}} \times \frac{\partial net_{o1}}{\partial w_5}$...

九月 4, 2022 · 2 分钟 · Pan

深度学习中的各种tricks

深度学习tricks汇总 网络结构 FPN(Feature Pyramid Networks )、SPP(spatial pyramid pooling)、ASPP(atrous spatial pyramid pooling)、FPN(Feature Pyramid Networks )、PAN(Pyramid Attention Network)、PSP(Pyramid Scene Parsing)或者Pyramid pooling module SPP 主要用于图像分类和目标检测中,其实和PSP网络结构设计思想一样(SPP提出在前,PSP提出在后),PSP用于语义分割 PSP、PPM 使用不同尺度的pooling操作(论文中最终输出的特征图尺寸为1*1,2*2,3*3,6*6),然后使用1*1的卷积将channel数降为原来的1/N (这里的N为4,目前是不过多的增加计算量),然后分别将输出上采样到原特征图大小,再concat拼接到一起 FPN FPN如上图(d)所示 PAN 整体结构: 其中 FPA结构: 其中: GAU结构: 参考文档: https://medium.com/mlearning-ai/review-pan-pyramid-attention-network-for-semantic-segmentation-semantic-segmentation-8d94101ba24a 参考代码: https://github.com/JaveyWang/Pyramid-Attention-Networks-pytorch 深度可分离卷积 损失函数 focal loss $FL(p)=-(1-p)^\gamma log(p)$ 其中p为经过softmax后的输出。 当预测结果p越接近正确分类(接近1)的时候,会在原损失的基础上乘上$(1-p)^\gamma$的权重,该权重是一个比较小的值;相反如果预测结果p偏离正确分类的比较离谱,比如p结果0,那么$(1-p)^\gamma$就会比较大(相比于容易分的样本权重)。所以focal loss 在处理样本不均衡时候是一个比较不错的选择 smooth l1 loss $$loss = \left{ \begin{matrix} 0.5x^2, 当 x<1\ |x|-0.5, otherwise \end{matrix} \right. $$ 改进了l2loss对异常比较敏感的问题(因为平方放大异常点的损失) 改进l1loss在零点不可能的问题 训练策略 学习率warmup Warmup策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值 学习率 在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。 参考百度总结的一些训练技巧...

四月 27, 2022 · 1 分钟 · Pan