yolov5目标检测原理探究(2)
本篇主要记录学习yolov5的原理,包括一些代码细节以及代码的复现。参考薛定谔的AI。
一、正样本采样细节
相关源代码位置:utils/loss.py/class ComputeLoss/def build_targets(self, p, targets)
对于如图所示的8个目标边框的中心点:
在代码中的如图位置会对目标边框的grid作正采样:
第一部分经过筛选之后得到如图结果(灰色),j,k是所得的布尔矩阵;l,m是以tensor右上角为原点之后作同样的筛选得到。
将所得点作对应的偏移:
最终所得如图所示;其中深灰色即原ground truth对应边框数据,绿色为补充正样本边框数据。
二、损失计算细节
相关源代码位置:utils/loss.py/class ComputeLoss
如图是GIOU,前两点比较好理解,第三点“偏离趋势度量能力”是左下角图2,如果此时采用传统IOU则两者数值都是0,则无法对训练过程作出很好的指导作用;当然当目标框和预测框处于水平或者垂直位置时,GIOU则退化成了传统的IOU,不具备优势,为了解决这一问题, ...
yolov5目标检测原理探究(1)
本篇主要记录学习yolov5w的原理,包括一些代码细节以及代码的复现。参考薛定谔的AI。
一、数据增强
源码中位置:train.py->create_dataloader->LoadImagesAndLabels;
参数配置:data/hyps/hyp.scratch.yaml
rectangular:同个batch里做rectangle宽高等比变换,加快训练
hsv h:0.015#image HSV-Hue augmentation(fraction),色调
hsv_s:0.7#image HSV-Saturation augmentation(fraction),饱和度
hsv_v:0.4#image HSV-Value augmentation(fraction),曝光度
degrees:0.0#image rotation(+/-deg),旋转
translate:0.1#image translation(+/-fraction),平移
scale:0.5#image scale(+/-gain),缩放
shear:0.0#image shear( ...
yolov3目标检测原理探究
本篇主要记录学习yolov3的原理,主要是对yolov3论文的精读。参考:同济子豪兄
一、骨干网络 DarkNet53
yolov3的骨干网络(backbone)从yolov2的darknet19改成了darknet53,如图:前面的1x/2x代表重复这个block。输入可以是不同尺度的图像,但是必须是32的倍数,因为最后会对feature map进行32,16和8的下采样。然后输送给检测部分。
二、网络结构
255 = 3 x 85(80 + 5)
每个grid cell有三个anchor;
每个anchor有(x, y, w, h, objectiveness)五个基本参数,加上coco数据集的80个类别的条件概率信息(在假设这个框的是物体的情况下,它是猫/狗/...的概率)。
而前面则是grid cell的数量,13x13个,26x26个
在yolov3中输出是三个尺度的,而显然,某个物体可能同时落在三个尺度的三个grid cell所产生的9个anchor,那此时,将由与ground truth的IOU最大的anchor去作拟合 ...
yolov2目标检测原理探究
本篇主要记录学习yolov2的原理,主要是对yolov2论文的精读。参考:同济子豪兄
一、Better
1. Batch Normalization
如图,BN层会把输入进行一个减去均值,除以方差的操作。得到的结果就是把输入集中在0附近,这么做的好处是之后的一些激活函数,比如sigmoid函数,他在0附近是非饱和区。在更大的地方是饱和区,会出现梯度消失,难以训练的情况。
在训练阶段,比如batch size是32,某层的神经元会输出32个相应值,对这32个响应值求均值,标准差,再作归一化,把归一化后的响应值乘γ再加上β(对归一化结果作一个线性输出,尽可能减少归一化带来的信息损失),每个神经元都训练一组γ,β。
测试阶段的均值,方差用训练阶段所得结果处理得到,此时的BN层是相当于作了一个线性变换。
2. High Resolution Classifier
aka:高分辨率分类器。先在224x224的ImageNet上训练,再在448x448上训练。
3. Anchor
在yolov1中每个grid所生成的两个bbox都是随机的,然后根据哪个和目标的IOU ...
yolov1目标检测原理探究
本篇主要记录一下学习目标检测的原理到yolov1的原理,是理解之后版本的基础。参考:同济子豪兄
一、目标检测
如图,目标检测包括了分类以及各类别目标的定位
分割(segmentation)包括了语义分割和实例分割,前者对像素进行按类别分割,后者是把同一类别的不同实例作分割。
1. one-stage / two-stage detector
两阶段检测模型就是先从图像提取若干候选框,再逐一地对这些候选框进行分类、甄别等任务,最后得出结果;与此相对,单阶段检测模型直接把全图喂给算法,然后出结果,是一个统一的端到端(end to end)的过程。yolo是典型的单阶段模型。一般而言,前者比较准确而速度相对慢,后者可能效果差一些,但是速度快,yolo尤以快速闻名(yolov1时对小目标,密集目标的检测效果相对差一些,经过发展,目前的效果已经非常不错)。
两阶段检测模型的典型RCNN,发展到Fast-RCNN最主要的改变是首先不作候选框的提取,先把整张图喂给卷积层,提取出一个共同的特征,然后在重复之前RCNN的操作。这能够一定程度上提高速度。
然而两阶段检测 ...
pytorch学习笔记-高阶篇(无监督学习)
本篇主要是记录无监督学习相关知识
一、监督学习
像之前的分类和回归问题,比如分类问题,要提前人工写好label告诉它这张图片里是数字9,但是这种labeling实际上可能非常耗时耗力,现实生活中存在着大量没有labeling的数据,如何利用这些数据是无监督学习一直想要做的。
二、auto-encoder
无监督学习的目标的重建他自己
三、无监督学习的训练
无监督学习的损失函数和监督学习一样,不管是Crossentropy或者均方差等都可以,训练方法一致。
四、autoencoder实战
1. autoencoder类
同样继承自nn.module,里面有encoder和decoder两大部分
import torch
from torch import nn
class AutoEncoder(nn.Module):
def __init__(self):
super(AutoEncoder, self).__init__()
# [b, 784] => [b, 20]
self.encode ...
pytorch学习笔记-高阶篇(卷积神经网络实战3)
本篇主要是卷积神经网络的实战,网络结构主要是resnet,数据集用的是自建pokemon数据集,包含了整个流程,从数据集的处理,训练,测试等。
一、加载数据
数据预处理
Image Resize
·224×224 for ResNet18
Data Argumentation
·Rotate
·Crop
Normalize
·Mean,std
ToTensor
import torch
import os
import glob
import random
import csv
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
from torchvision import transforms
from PIL import Image
class Pokemon(Dataset):
def __init__(self, root, resize, mode):
"""
Args:
...
pytorch学习笔记-高阶篇(RNN训练难题)
本篇主要是说明RNN在训练过程中会遇到的一些问题,包括梯度弥散和梯度爆炸。以及怎么用改进的LSTM来解决
梯度弥散和梯度爆炸简单理解就是0.99^100和1.01^100这种概念。
一、梯度爆炸
如图所示,在正常的梯度下降方向,到达某个位置的时候,一个微小的动作都会让梯度偏离原来的路线。为此,我们可以设置一个阈值,当大于这个阈值的时候,就硬性地把它扳回原来的方向。
loss = criteon(output, y)
model.zero_grad()
loss.backward()
for p in module,parameters():
print(p.grad.norm())
# 最大值设置为10,会把模限制在10以内
torch.nn.utils.clip_grad_norm_(p, 10)
optimizer.step()
一、梯度弥散=>LSTM
如图所示。对此,提出了改进的LSTM网络,与RNN的short term memery相比,不仅改善了梯度弥散,还延长了语境记忆的长度。所以称为long short ter ...
pytorch学习笔记-高阶篇(时间序列预测)
本篇主要是结合前面所学作一个时间序列预测的小实战,给一段正弦曲线的波形,预测接下来的波形
一、背景
这样,给出一些初始点,让网络预测出整个曲线,也即预测正弦曲线的参数。
二、代码
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from matplotlib import pyplot as plt
num_time_steps = 50
input_size = 1
hidden_size = 16
output_size = 1
lr=0.01
class Net(nn.Module):
def __init__(self, ):
super(Net, self).__init__()
self.rnn = nn.RNN(
input_size=input_size,
hidden_size=hidden_size,
...
pytorch学习笔记-高阶篇(循环神经网络)
本篇主要记录一下循环神经网络的原理相关知识
一、案例分析
对于图示的一句话i hate this boring movie,现在要分析这句话的感情色彩。
整句话可以用[5, 100]的tensor表示,对于每个时间戳是一个[100]的tensor,把这个100维的tensor作为线性层的输入,最后再用一个线性层把5个特征输入,作为一个二分类的问题(好/不好)
但是这种方式带来的问题也很明显
过长的句子会带来大量的参数
没有上下文的语境信息
比如 i do not like you 这句话,可能仅仅通过Like这个单词就把这句话定义为一个正面的话。下面是一些改进的手段:
1. 权值共享
2. 持续记忆
二、公式化
三、使用RNN层
需要注意的是,初始的h初始化的时候要带上batch信息,方便相加.
# 100表示word dim,用一个100维的向量表示一个单词
# 10表示记忆模块是10维的向量
rnn = nn.RNN(input_size=100, hidden_size=10)
rnn._parameters.keys()
# Out[4 ...