pycharm基本使用
pycharm debug怎样调试代码
深度学习 CNN RNN 5天
计算机视觉CV理论基础 14天
YOLOv5目标检测原理和源码4天
计算机视觉之目标检测、目标分割、目标跟踪7天 14h
计算机视觉之车道线检测 3天
计算机视觉之车道线分割 8天
指示交通灯识别 1天
李沐学ai看个5p 30h
小土堆yolo 5p 2.5h
0805
开始每天三小时学习
第一小时:看买的课
pycharm基本使用
【零基础】PyCharm基本功能入门详解_哔哩哔哩_bilibili
解释了什么是:解释器(python)、编辑器(pycharm),推荐安装annacanda(集成了很多库)
ctrl + alt + l可以自动帮你给代码排版
keymap可以看快捷键,PEP 8规范、文件模板、editor里的live templat里有一些代码快捷模板、open in explore、TODO的作用、常用快捷键、安装Virtualenv虚拟环境时,会有一个base环境进行拷贝,可以选择是否继承全局环境里的包和库。(意味着Virtualenv虚拟环境可以继承系统环境里的配置)
而conda是从网上重新下载一个解释器,另外不同在于,Virtualenv会把venv文件放在项目文件夹里,而conda会把venv文件放在annocanda里。
两点不同:基础解释器来源;venv文件位置
-----------------------
pycharm debug怎样调试代码
Pycharm debug 怎样使用Pycharm调试代码_哔哩哔哩_bilibili
step into, step out(跳出时会把这个函数运行完,返回result)
step into my code:区别在于只有在当前脚本定义了函数才会into
step over
run to cursor运行到光标指定的位置
控制台调试
-----------------------
计算机视觉之目标检测、目标分割、目标跟踪7天
迁移学习
11.1 迁移学习【斯坦福21秋季:实用机器学习中文版】_哔哩哔哩_bilibili
看下迁移学习 李沐,重点是找到目标构架是否有预训练好的模型(tensorflow hub 和 TIMM)
基本思想:每一个完整的神经网络都可以分为编码器(提取特征)和解码器(线性层分类器)。
基本步骤:
初始化模型:(注意!!!你的模型要和预训练的模型构架一致)
初始化特征提取器,其权重为预训练模型权重,
随机初始化分类器
在本地最小值附近进行参数优化
用小的学习率和小的epoch进行训练(这也是为什么叫微调)
标准化搜索空间
微调期间冻结底层网络(把layer1等层的学习率变成0)超参数加一!!!
基本思想:底层网络学习的是比较底层的特征,可以从感受野进行理解。底层特征是通用的,包括曲线、边缘等。而高层网络对应的高层特征更加特定于任务和数据集,例如标签分类。
步骤:
保证底层通用网络不变
专注于学习特定的任务
强大的正则化器
例子
import timm
from torch import nn
model = timm.ccreat_model('resnet18', pretrained)
model.fc = nn.Linear(model.fc.in_features, n_class)
好处:收敛更快,精度不会变坏
-------------------------------------
0806
李沐学ai
2p 1.5h
p04
x+=1 是原地操作
x = x+1新内存
p5
axis=1很有意思。可以这样理解:把[2,5,4]中的第二维“5”给“吃掉”了,结果是[2,4],这样会好理解些。
a = torch.arange(20*2).reshape(2,5,4)
a.shape, a.sum(), a
a_sum_0 = a.sum(axis=0)
a_sum_0,a_sum_0.shape
a_sum_1 = a.sum(axis=1)
a_sum_1,a_sum_1.shape
L1 和 L2范数
矩阵的 F范数
??torch中确实不区分行向量和列向量
小土堆yolo 5p
5p 1.2h [1:3,1:]左闭右开
cv慕尼黑
5p 3.5h
p 3
Problems of 1. Template matching + sliding window
– Occlusions: we need to see the WHOLE object
– This works to detect a given instance of an object but not
a class of objects
– Objects have an unknown position, scale and aspect
ratio, the search space is searched inefficiently with
sliding window
1. 模板匹配 + 滑动窗口的问题
– 遮挡:我们需要看到整个物体
– 这种方法可以检测物体的给定实例,但不能检测物体的类别
– 物体的位置、比例和纵横比未知,使用滑动窗口搜索搜索空间效率低下
2. Feature extraction + classification – Learning multiple weak learners to build a strong classifier – That is, make many small decisions and combine them for a stronger final decision
2. 特征提取 + 分类
– 学习多个弱学习器以构建强分类器
– 即做出许多小决策并将它们结合起来
以做出更强大的最终决策
比如haar feature:眼睛这里比较黑,所以是黑线,最简陋的机器学习检测
步骤
– Step 1: Select your Haar-like features – Step 2: Integral image for fast feature evaluation • I can evaluate which parts of the image have highest crosscorrelation with my feature (template) – Step 3: AdaBoost for to find weak learner
• I cannot possibly evaluate all features at test time for all image locations
• Learn the best set of weak learners • Our final classifier is the linear combination of all weak learners
– 步骤 1:选择类似 Haar 的特征(小波变换)
– 步骤 2:积分图像以进行快速特征评估(其实就是色素加减)
• 我可以评估图像的哪些部分与我的特征(模板)具有最高的互相关性
– 步骤 3:AdaBoost 用于查找弱学习者,级联分类器
• 我不可能在测试时评估所有图像位置的所有特征
• 学习最佳弱学习者集
• 我们的最终分类器是所有弱学习者的线性组合
Haar特征和级联分类器目标检测介绍及代码_haar特征分类器-CSDN博客
2. 特征提取
HOG方向梯度直方图
2. 分类
– Step 1: Choose your training set of images that contain the object you want to detect. – Step 2: Choose a set of images that do NOT contain that object. – Step 3: Extract HOG features on both sets. – Step 4: Train an SVM classifier on the two sets to detect whether a feature vector represents the object of interest or not (0/1 classification).
– 步骤 1:选择包含要检测的对象的图像训练集。
– 步骤 2:选择不包含该对象的图像集。
– 步骤 3:在两个集合上提取 HOG 特征。
– 步骤 4:在两个集合上训练 SVM 分类器以检测特征向量是否代表感兴趣的对象(0/1 分类)。
可变形部分模型
对更多人体姿态更鲁棒
如何定义对象
We need a generic, class-agnostic objectness measure: how likely it is for an image region to contain an object
我们需要一个通用的、与类别无关的物体性度量:图像区域包含物体的可能性
Using this measure yields a number of candidate object proposals or regions of interest (RoI) where to focus.
使用此方法可以产生许多值得关注的候选对象提案或感兴趣区域 (RoI)。
(现在是两个阶段:先找RoI,然后分类器)
两种找RoI方法:selective search , edge boxes
找到最好的box:NMS--None-Maximum Suppression
所以非极大值抑制的真正作用是在很多人脸场景下,可以设置一个0-0.5之间的阈值,把重叠的锚框删掉,剩下的就是各个人脸的锚框
https://www.cnblogs.com/oliyoung/p/nms.html
NMS牵涉到IOU的概念:Intersection over Union or Jaccard Index
one-stage and two-stage detection
------------------------------
0807
jeston nano 和 tx2都是嵌入式计算平台,树莓派是小型计算板。tx2性能是最强大的。
蒸馏学习 1h
原理:
若是把马的图片喂给已经训练好的网络里面,网络给出soft targets这个结果,是马的概率为0.7,为驴的概率为0.25,为车的概率是0.05,所以soft targets就传递了更多的信息
所以训练教师网络的时候就可以用hard targets训练,训练出了教师网络之后,教师网络对这张图片的预测结果soft targets能够传递更多的信息,就可以用soft targets去训练学生网络
Soft Label包含了更多“知识”和“信息,像谁,不像谁,有多像,有多不像
步骤:
蒸馏温度T
引入蒸馏温度T,把原来比较硬的soft targets变的更软,更软的soft targets去训练学生网络,那些非正确类别概率的信息就暴露的越彻底,相对大小的知识就暴露出来,让学生网络去学
T为1,就是原softmax函数,softmax本来就是把每个类别的logic强行变成0-1之间的概率,并且求和为1,是有放大差异的功能,如果logic高一点点,经过softmax,都会变的很高。
T越小,非正确类别的概率相对大小的信息就会暴露的更明显;T越大,曲线就会变得更soft,高的概率给降低,低的概率会变高,贫富差距就没有了。
计算hard loss:
学生网络和hard label之间的传统交叉熵为-log(0.88)
计算soft loss:
通过蒸馏后的学生网络和教师网络的softmax概率求交叉熵
将两个损失函数求和,
作为最终学生网络的损失函数,去训练学生网络
李沐学ai
2p 1.5h
6 p:数学求导
7p:.detach() 把这个变量变为常量,用于神经网络中固定参数
小土堆yolo 5p
5p 1.2h
0808
AlexNet是首先提出反向传播的
抽象:可以让c知道给你写代码
例子:
我现在要用VGG 16提取MNIST数据集中的特征,jiyupytorch框架,最后经过一个全局平均池化层
cv慕尼黑
2p 2.5h
4p:
定位和分类:
CNN+FC,和GT比较,L2loss
两个检测头:输出一:检测框(通过回归)(L2loss);输出二:分类得分(Softmax loss)
但不管是分类,还是回归,其本质是一样的 都是建立映射关系
目标检测中的边框回归(Bounding Box Regression)_目标识别的regression是什么-CSDN博客
步骤
It was typical to train the classification head first, freeze the layers
• Then train the regression head
• At test time, we use both!
通常先训练分类头,然后冻结各层
• 然后训练回归头
• 在测试时,我们同时使用两者!
Overfeat
简析Overfeat(部分引用) | TwistedW's Home
https://www.cnblogs.com/liaohuiqiang/p/9348276.html
Sliding window + box regression + classification
Sliding window
产生多个预测框,然后贪心算法
In practice: use many sliding window locations and multiple scales
实践中:使用多个滑动窗口位置和多个尺度
目的是更好的检测大物体小物体
OverFeat的另一个重要贡献是它的滑动窗口分类回归非常高效
多尺度滑窗
简析Overfeat(部分引用) | TwistedW's Home
6种
offset池化
offset池化
offset max-pooling 介绍_offset pooling-CSDN博客
二维就可以得到9张图片。所以是6*9个滑窗
全卷积网络FCN
通过池化得到了5x5大小的图片。OK,关键部分来了,接着要从:5x5大小的图片->1x1大小的图片:
(1)传统的CNN:如果从以前的角度进行理解的话,那么这个过程就是全连接层,我们会把这个5*5大小的图片,展平成为一个一维的向量, 进行计算(写cnn代码的时候,这个时候经常会在这里加一个flatten函数,就是为了展平成一维向量)。
(2)FCN:FCN并不是把5x5的图片展平成一维向量,再进行计算,而是直接采用5x5的卷积核,对一整张图片进行卷积运算。
其实这两个本质上是相同的,只是角度不同,FCN把这个过程当成了对一整张特征图进行卷积,同样,后面的全连接层也是把它当做是以1x1大小的卷积核进行卷积运算。
然后我们就只需要在后面把它们拉成一维向量摆放就ok了,这样在一个尺度上,我们可以得到一个C*N个预测值矩阵,每一列就表示图片属于某一类别的概率值, 然后我们求取每一列的最大值,作为本尺度的每个类别的概率值。
最后我们一共用了6种不同尺度(文献好像用了12张,另外6张是水平翻转的图片),做了预测,然后把这六种尺度结果再做一个平均,作为最最后的结果。
好处:这个时候,我们就可以发现采用FCN网络,可以输入任意大小的图片。 同时需要注意的是网络最后输出的图片大小不在是一个1x1大小的图片,而是一个与输入图片大小息息相关的一张图片了。
简析Overfeat(部分引用) | TwistedW's Home
卷积计算共享(其实是由全卷积带来的)
OverFeat的另一个重要贡献是它的滑动窗口分类回归非常高效,在此之前,很多滑动窗口技术都是为每个窗口重复进行所有的计算,这对计算资源的消耗是巨大的。而OverFeat通过将全连接层改造成卷积层的方式,使得相同区域的计算结果可以共享,如下图所示。
全卷积的好处:下图中第一个图是训练时用14*14的图像,最后产生一个输出,下面的图是测试时,可以用16*16的图像产生了“2*2”个输出,以此类推我们可以在测试时使用更大的图像(使用多scale),产生“更多”的输出进行(取最大)预测。这个做法相对于传统的滑动窗口(用14*14大小,步长为2的滑动窗口在16*16的图像上执行4次卷积操作进行分类)的优点是,只需要执行一次,保证了效率同时可以建模用各种不同尺度图像,不局限于固定的裁剪翻转方式(相对于alexNet测试阶段的做法),而且消除了很多冗余计算,提高了模型的鲁棒性又保证了效率。
总结:
FCN很简单,6个尺度的滑窗,每个又有offset池化产生9张图,9个图每个图拉成一维向量,取最大值为该类概率,然后6个尺寸求平均概率。
接下来:怎么处理不同尺寸大小的图片
There are a couple of workarounds: – RNN: Romera-Paredes and Torr. Recurrent Instance Segmentation. ECCV 2016. – Set prediction: Rezatofighi, Kaskman, Motlagh, Shi, Cremers, Leal-Taixé, Reid. Deep Perm-Set Net: Learn to predict sets with unknown permutation
有几种解决方法:
– RNN:Romera-Paredes 和 Torr。循环实例分割。ECCV 2016。
– 集合预测:Rezatofighi、Kaskman、Motlagh、Shi、Cremers、Leal-Taixé、Reid。Deep Perm-Set Net:学习预测具有未知排列的集合
RCNN家族
2014年RCNN
都是两阶段方法。先找RoI,然后分类和回归。
Training scheme: – 1. Pre-train the CNN on ImageNet – 2. Finetune the CNN on the number of classes the detector is aiming to classify (softmax loss) – 3. Train a linear Support Vector Machine classifier to classify image regions. One SVM per class! (hinge loss) – 4. Train the bounding box regressor (L2 loss)
训练方案:
– 1. 在 ImageNet 上预训练 CNN – 2. 根据检测器要分类的类别数量对 CNN 进行微调(softmax 损失) – 3. 训练线性支持向量机分类器对图像区域进行分类。每个类别一个 SVM!(hinge 损失) – 4. 训练边界框回归器(L2 损失)
优点
PROS: – The pipeline of proposals, feature extraction and SVM classification is well-known and tested. Only features are changed (CNN instead of HOG). – CNN summarizes each proposal into a 4096 vector (much more compact representation compared to HOG) – Leverage transfer learning: the CNN can be pre-trained for image classification with C classes. One needs only to change the FC layers to deal with Z classes.
优点: – 提议、特征提取和 SVM 分类的流程众所周知且经过测试。只更改了特征(用CNN 替代是 HOG)。 – CNN 将每个提议汇总为 4096 向量(与 HOG 相比,表示更加紧凑) – 利用迁移学习:CNN 可以预先训练用于 C 类图像分类。只需更改 FC 层即可处理 Z 类。
缺点
• CONS: – Slow! 47s/image with VGG16 backbone. One considers around 2000 proposals per image, they need to be warped and forwarded through the CNN. – Training is also slow and complex – The object proposal algorithm is fixed. Feature extraction and SVM classifier are trained separately à not exploiting learning to its full potential.
• 缺点: – 速度慢!使用 VGG16 主干时每张图片耗时 47 秒。每张图片大约有 2000 个提议,需要通过 CNN 进行扭曲和转发。 – 训练速度慢且复杂 – 对象提议算法是固定的。特征提取和 SVM 分类器是分开训练的 à 无法充分利用学习的潜力(在最后的SVM中没有反向传播)。
R-CNN进行目标检测的训练流程:
- 使用区域生成算法,生成2000个候选区域,这里使用的是Selective search.
- 对生成的2000个候选区域,使用预训练好的AlexNet网络进行特征提取。
- 将候选区域变换到网络需要的尺寸(227×227227×227)。 在进行变换的时候,在每个区域的边缘添加p𝑝个像素,也就是手工的添加个边框,设置p=16𝑝=16。
- 改造预训练好的AlexNet网络,将其最后的全连接层去掉,并将类别设置为21(20个类别,另外一个类别代表背景).
利用上面提取到的候选区域的特征,对每个类别训练一个SVM分类器(而分类)来判断,候选框里物体的类别,是给类别就是positive,不是就是negative。比如,下图针对狗的SVM分类器
对于面只是得到了每个候选框是不是包含某个目标,其得到的区域位置不是很准确。这里需要再训练一个线性回归模型判断,候选区域框出的目标是不是完美。对于某个类别的SVM是Positive的候选区域,来判断其框的目标区域是不是很完美。
https://www.cnblogs.com/wangguchangqing/p/10384058.html
缺点总结
训练分为多个步骤,比较繁琐。 需要微调CNN网络提取特征,训练SVM进行正负样本分类,训练边框回归器得到正确的预测位置
- SVM分类器和边框回归器的训练过程,和CNN提取特征的过程是分开的,并不能进行特征的学些更新。
2015年 SPP-NET
对整张图片做卷积然后提取出尺寸不同的特征,然后SPP空间金字塔池化把特征变换到需要的尺寸。
使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。
It solved the R-CNN problem of being slow at test time
• It still has some problems inherited from R-CNN: – Training is still slow (a bit faster than R-CNN) – Training scheme is still complex – Still no end-to-end training
它解决了 R-CNN 在测试时速度慢的问题
• 它仍然继承了 R-CNN 的一些问题: – 训练速度仍然很慢(比 R-CNN 快一点) – 训练方案仍然很复杂 – 仍然没有端到端训练(最后SVM无反向传播)
2015年 Fast R-CNN
和SPP类似,也是在全图上做了卷积;然后提取RoI区域;RoI Pooling(因为全连接层对输入有要求),然后全连接层,再分类和回归。
RoI Pooling
而且事实证明,这个RoI是对应像素块的最大池化,反向传播也很简单
优点:
实现了端到端
快很多,训练快8倍,测试快146倍,但测试时间不包括生成提议区域的时间
实际上每个图片要2s
缺点:生成提议没有端到端
Faster R-CNN 2015
深度学习系列(五):Faster RCNN算法理论 | 小切的博客
提出了Region Proposal Network(RPN),除此之外和Fast R-CNN都一样
RPN集成到了网络内部;每个位置取9个锚框,三个形状和三个尺度,3*3=9(3 sacals * 3 aspect ratios)
有4*9个锚框坐标,然后锚框回归
2*9个分数,用于指示该锚框含有目标和不含目标的分数(前景概率和后景概率)
0809
cv慕尼黑
4p
Faster R-CNN
深度学习系列(五):Faster RCNN算法理论 | 小切的博客
RPN
• Classification ground truth: We compute p which indicates how much an anchor overlaps with the ground truth bounding boxes
1 indicates the anchor represent an object (foreground) and 0 indicates background object. The rest do not contribute to the training.
• 分类基本事实:我们计算 p,它表示锚点与基本事实边界框的重叠程度
1 表示锚点代表一个对象(前景),0 表示背景对象。其余0.3-0.7对训练没有贡献。
RPN训练步骤
For an image, we randomly sample 256 anchors to form a mini-batch (balanced objects vs. non-objects) • We calculate the classification loss (binary crossentropy). • Those anchors that do contain an object are used to compute the regression loss
对于一幅图像,我们随机抽取 256 个锚点来形成一个小批量(平衡含对象与非对象)• 我们计算分类损失(二元交叉熵)。• 那些包含对象的锚点用于计算回归损失
训练时回归的实际上是归一化的参数
smooth L1损失用于回归
优点
• 10x faster at test time wrt Fast R-CNN
• Trained end-to-end including feature extraction, region proposals, classifier and regressor
• More accurate, since proposals are learned. RPN is fully convolutional
• 测试时间比 Fast R-CNN 快 10 倍
• 端到端训练,包括特征提取、区域提议、分类器和回归器
• 更准确,因为提议是经过学习的。RPN 是完全卷积的
0810
cv慕尼黑
5p
one-stage method
主要优点:很快
YOLO 2016
Recall sliding window object detection
• To make it efficient, we will “slide our window” only on certain locations of the image
• We divide our image in a grid.
有点像滑动窗口物体检测
• 为了提高效率,我们将仅在图像的某些位置“滑动窗口”
• 我们将图像划分为网格。
步骤
和RPN很像,但不止回归锚框,而且要预测里边的语义
SSD 2016
和yolo很像
但SSD是在不同尺度进行预测
基本思想:
在最深的层(小分辨率)检测大物体,在浅层检测小物体
好处
不需要额外操作,只需要加一些连接
PROS:
– Very fast
– End-to-end trainable and fully convolutional
– SSD detects more objects than YOLO •
优点:
– 非常快
– 端到端可训练且完全卷积(全卷积),可以处理任何尺寸的图片
– SSD 比 YOLO 检测更多物体 •
CONS:
– Performance is not as good as two-stage detectors
– Difficulty with small objects
缺点:
– 性能不如两阶段检测器
– 难以检测小物体
问题
Two-stage detectors:
– Classification only work on “interesting” foreground regions (proposals, ~1-2k). Most background examples are already filtered out.
– Class balance between foreground and background objects is manageable.
– Classifier can concentrate on analyzing proposals with rich information content
两阶段检测器:
– 分类仅适用于“有趣”的前景区域(提案,约 1-2k)。大多数背景示例已被过滤掉。
– 前景和背景对象之间的类别平衡是可管理的。
– 分类器可以专注于分析具有丰富信息内容的提案
One-stage detectors:
– Many locations need to be analyzed (100k) densely covering the image à foreground-background imbalance
– Hard negative mining is useful, but not sufficient
单阶段检测器:
– 需要分析许多位置(100k)密集覆盖图像à前景-背景不平衡
– 硬负挖掘很有用(需要用),但还不够
RetinaNet 2017
使用改进后的交叉熵损失函数Focal Loss
使简单例子的损失降低,难例损失上升,更加重视难例
无锚框检测
CornerNet :2018基于点的检测
预测 左上和右下点,然后生成框
heatmaps
需要embedding里两组相似的向量,代表着左上角和右下角
Hourglass network 2016年提出的,被Corrner Net用了
Corner Pooling
缺点:
What is the problem with CornetNet?
• Many incorrect bounding boxes (especially small) à too many False Positives
• Hypothesis: It is hard to infer the class of the box if the network is focused on the boundaries
CornetNet 的问题是什么?
• 许多不正确的边界框(尤其是小的)à 太多误报
• 假设:如果网络专注于边界,则很难推断出边界框的类别
Center Net 2018
Idea: focus on the center of the object to infer its class
想法:关注物体的中心来推断其类别(多加一个检测头来利用中心来判别类)
• Use the corners as proposals, and the center to verify the class of the object and filter out outliers
• 使用角作为建议,并使用中心来验证物体的类别并过滤掉异常值
ExtremeNet 2019 (其实也广泛用于语义分割)
原理:基于角点,有角点其实和对象并无接触,对CNN很难预测
用extreme点来表示
评估方法
Precision
Recall
对于NMS
高重叠物体时,阈值很重要
李沐学ai
2p 1.5h
小土堆yolo 5p
5p 1.2h
PhD-Vlog
Ph-D-Vlog的个人空间-Ph-D-Vlog个人主页-哔哩哔哩视频
看下沈鑫、吴国、徐洋的文章
同济子豪兄 两天毕业 图像分类