每月笔记之2019年10月

1、https://github.com/fengdu78/machine_learning_beginner

2、CornerNet作者的思路其实来源于一篇多人姿态估计的论文[1]。基于CNN的2D多人姿态估计方法,通常有2个思路(Bottom-Up Approaches和Top-Down Approaches):

(1)Top-Down framework,就是先进行行人检测,得到边界框,然后在每一个边界框中检测人体关键点,连接成每个人的姿态,缺点是受人体检测框影响较大,代表算法有RMPE。

(2)Bottom-Up framework,就是先对整个图片进行每个人体关键点部件的检测,再将检测到的人体部位拼接成每个人的姿态,缺点就是可能将,代表方法就是openpose。

3、Faster rcnn这类算法,可以根据anchor与ground truth的IOU大小来安排同一个cell的anchor负责预测哪个物体,所以后来yolo2也采用了anchor思想,同个cell才能预测多个目标。

4、感觉yolo和ssd还是不一样的,他俩不仅仅是一个box和多个先验box的区别,yolo其实是无anchor的网络,也就是19年比较热门的anchor free目标检测网络,因为Yolo的预测的 x y w h在训练时候是随机初始化的,然后根据标注慢慢收敛的,所以它能根据整张图片的context进行预测这个目标的种类,而ssd是不行的,ssd的每个先验框的尺寸和长宽比是固定的,然后只是根据标注进行回归而已,所以ssd预测某个目标的时候只能根据这个目标周围的局部区域进行推测。

至于yolov1为啥效果不好,我觉得可能是因为它这种对框的编码方式,即(x y w h)这种编码方式比较时候有anchor的网络,而yolo无anchor的话,这种编码方式预测起来太难了,比如Cornernet,它也是anchor free,它效果相对来说好一点,因为他对框的编码方式改进了 ,直接预测对角点

5、 复杂度对模型的影响
时间复杂度决定了模型的训练/预测时间。如果复杂度过高,则会导致模型训练和预测耗费大量时间,既无法快速的验证想法和改善模型,也无法做到快速的预测。
空间复杂度决定了模型的参数数量。由于维度诅咒的限制,模型的参数越多,训练模型所需的数据量就越大,而现实生活中的数据集通常不会太大,这会导致模型的训练更容易过拟合。
当我们需要裁剪模型时,由于卷积核的空间尺寸通常已经很小(3x3),而网络的深度又与模型的表征能力紧密相关,不宜过多削减,因此模型裁剪通常最先下手的地方就是通道数。

6、卷积层:总参数量只与卷积核的尺寸 K、通道数C、层数 D 相关,而与输入数据的大小无关。
全连接层:与真正的卷积层不同,全连接层的空间复杂度与输入数据的尺寸密切相关。、

InceptionV1 中使用的全局平均池化 GAP 改善了这个问题。由于每个卷积核输出的特征图在经过全局平均池化后都会直接精炼成一个标量点,因此全连接层的复杂度不再与输入图像尺寸有关,运算量和参数数量都得以大规模削减。

7、通过上面的推导和经典模型的案例分析,我们可以清楚的看到其实很多创新点都是围绕模型复杂度的优化展开的,其基本逻辑就是乘变加。模型的优化换来了更少的运算次数和更少的参数数量,一方面促使我们能够构建更轻更快的模型(例如MobileNet),一方面促使我们能够构建更深更宽的网络(例如Xception),提升模型的容量。

8、即使可以将规则嵌入到 DNN 中,这些规则的效果也只是能与学习一样好。Bengio 说,AI 智能体需要在更丰富的可探索环境中学习。例如,大多数计算机视觉系统无法识别一罐啤酒是圆柱形的,因为它们只在 2D 图像数据集上进行训练。这就是 Nguyen 等研究者发现我们可以通过不同角度的对象来愚弄 DNN 的原因。

9、伯克利实验室的研究员 Chelsea Finn 认为,一般而言,这种学习可以使得 AI 更深入地了解物体和世界。如果你曾经只在照片上见过水壶或海绵,则或许能够在其他图像中识别出它们。但是,你不会真正地理解它们是什么或它们用来做什么。因此,Finn 表示,只有你真正地与它们接触才可以更深入地了解它们。(这也是人类识别图像与CNN识别图像的区别,CNN只在2维图像中看见过这个目标,但人类在现实世界中有好多先验知识,看多过它的3D版本)

10、一种极端形式的迁移学习旨在通过向新网络展示少量示例(有时甚至只有一个示例)来训练它。此类已知的 one-shot 或 few-shot 学习极度依赖预训练的 DNN。举例而言,如果你想要构建一个能够识别出犯罪数据库中人的人脸识别系统,则利用包含数以百万计人脸(并不一定是数据库中的那些人)的 DNN 可以帮助该识别系统了解主要特征,如鼻子和下巴的形状。

11、
也就是说,特征点标注也有其他用法。将重点特征点结合起来便能创建目标轮廓,就像是连点拼图的游戏。这些点形成的轮廓能用来识别面部特征,或者分析人的动作或姿势。
计算机视觉的特征点标注常见用例:
面部识别,追踪多个特征点能轻松识别出面部表情和其他面部特征。
特征点标注还能用在生物学领域进行几何形态测量。

12、
除了自动驾驶,计算机视觉的语义分割还能用于:
分析农田,检测杂草和特定的作物类型。
在诊断中识别医学图像,检测细胞,分析血流。
检测森林和雨林的毁坏和生态系统破坏,促进生态保护。

13、与RepPoints同期还出现了不少anchor-free方法,包括FoveaBox,CenterNet,FCOS等等,它们也都发现anchor-free方法在现阶段能和anchor-based方法的性能比肩了。

我们论文里面仔细界定并分析了anchor-free方法和anchor-based方法,界定原则是:如果把物体用4d来表示,则是anchor-based,如果是把物体用2d来表示,则属于anchor-free。

通常来说,用anchor去覆盖4d空间是困难的,所以一般需要不同尺度和不同长宽比的多种anchor,而且赋予这个anchor box类别标签也相对麻烦,需要计算和ground-truth box的IoU。与之对应的,要覆盖2d空间和赋予类别都很容易,典型的2d表示包括center point,corner point等等。

14、这是一个很古老的问题,通常来讲求解验证问题比求解回归问题更容易,但是效率更低。在物体检测里面,通常的做法是先做粗验证,后用回归方法来做精确定位。基于anchor的设计就是典型的验证思路,后续回归只在一个很小的范围内进行。而anchor-free方法更多依赖回归来求解问题,通常讲更难学习,但是因为有了deep的特征,以及多阶段的定位方法,效果能比肩依赖验证更多的anchor-based方法,同时框架更简洁。

15、多人姿态估计
2018年ECCV上的一篇名为《Pose Proposal Networks》结合了去年CVPR上的YOLO和CMU的OpenPose,而其他方法,比如NIPS 2017 的AE(Associative embedding)、ICCV 2017的RMPE(Regional multi-person pose estimation)、CVPR 2017的PAF(Realtime multi-person 2D pose estimation using part affinity fields),都无法实现高帧数尤其是100以上帧数视频的姿态检测。

16、那么思考下,为什么CornerNet 的 corner point定不准呢?在这里我们认为,corner point定位需要的语义信息并不充足。角点并不像人脸的关键点、人体骨骼点那样,特征表达明显且语义及上下文信息充分。

17、ExtremeNet 所谓extreme point就是在某个方向上的一个极大坐标边界,文章即在目标的left、right、top、bottom四个方向上预测4个extreme points, Sense的点在于不要corner point,center point这类语义及上下文信息不充分的“easy point”,而是找到extreme point这种天然就依附在目标上的点,这使得网络在找点阶段的任务轻松许多。但是插播一句,对于extreme point检测,算法是需要使用segmentation label的,这种“辅助”操作是不是有点unfair啊…

18、Associative Embedding
应该是没有groundtruth embedding这个东西的吧,GT只有同一个人的关节点的位置,而没有具体‘tag’,这点论文里也说了,‘tag’具体数值不重要,关键是同一个人的关节点对应的TAG差不多,然后对相似的tag进行分组,组成一个人,reference embedding就是根据GT的位置产生的’tag’取平均得到的,这样训练时候就可以让同一组的关节点都朝着一个数值收敛,所以这个数值是提前不知道的,但是通过训练可以同一组的关节点让他们产生相似的数值。

为了实现对图像中所有尺度的个体进行姿态预测,论文将不同scale尺度下所得heatmap加到一起,然后将不同尺度下的标签对应坐标点融合到一块组成vector,然后计算vector的距离。

19、人体姿态识别主要需要解决的问题是:“你需要通过我的姿势判断我在干什么?”
二维图像姿态估计基于CNN的单人姿态估计方法,主要有Deep Pose、CPM,hourglass以及各种hourglass结构引申之作。
二维图像姿态估计基于CNN的多人姿态估计方法,通常有2个思路(Bottom-Up Approaches和Top-Down Approaches)::
(1)two-step framework,就是先进行行人检测,得到边界框,然后在每一个边界框中检测人体关键点,连接成一个人形,缺点就是受检测框的影响太大,漏检,误检,IOU大小等都会对结果有影响,代表方法就是RMPE。
(2)part-based framework,就是先对整个图片进行每个人体关键点部件的检测,再将检测到的部件拼接成一个人形,缺点就是会将不同人的不同部位按一个人进行拼接,代表方法就是openpose。

20、多个任务级联,前面的任务性能会对后面的任务造成制约,它不好的话 后面的任务根本没办法乏力。

21、作者认为可形变卷积的优势还是很大的,包括:
对物体的形变和尺度建模的能力比较强感受野比一般卷积大很多,因为有偏移的原因,实际上相关实验已经表明了DNN网络很多时候受感受野不足的条件制约;但是一般的空洞卷积空洞是固定的,对不同的数据集不同情况可能最适合的空洞大小是不同的,但是可形变卷积的偏移是可以根据具体数据的情况进行学习的
另外值得一提的是,作者发现可形变卷积可以适应物体的尺度,而背景类的尺度一般在medium和large尺寸的物体之间,作者认为这说明large的目标可以更有效帮助我们识别干扰,也算是无心插柳吧。

22、DCN介绍v2之前,需要先了解本文的核心观点。文章认为,对于positive的样本来说,采样的特征应该focus在roi内,如果特征中包含了过多超出roi的内容,那么结果会受到影响和干扰。而negative样本则恰恰相反,引入一些超出roi的特征有助于帮助网络判别这个区域是背景区域。

学习每个采样点的权重mk 并不完全可以通过wk学到,mk+wk可以看作一个data dependent的参数,也就是对于不同的input image的mk是可以改变的

23、
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

24、
所谓的有监督预训练也可以把它称之为迁移学习。比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务时:人脸性别识别,那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练,让它输出性别。这就是所谓的迁移学习,说的简单一点就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。

25、
研究[9]表明,对于一个固定的学习率,存在一个最优的batchsize能够最大化测试精度,这个batchsize和学习率以及训练集的大小正相关。
对此实际上是有两个建议:
如果增加了学习率,那么batch size最好也跟着增加,这样收敛更稳定。尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力。
如果真的要衰减,可以尝试其他办法,比如增加batch size,学习率对模型的收敛影响真的很大,慎重调整。

26、学习率的调整:
step,multistep方法的收敛效果最好,这也是我们平常用它们最多的原因。虽然学习率的变化是最离散的,但是并不影响模型收敛到比较好的结果。

27、数字图像有两个分辨率,图像分辨率与输出分辨率。
图像分辨率指的是每英寸的像素数,简写为ppi,我们平常说一张图片大小的时候使用的就是图像分辨率。
输出分辨率指的是设备输出图像时每英寸可产生的点数,简写为dpi,这是在印刷行业,摄影行业常用的分辨率,摄影行业通常要求DPI不低于300。
相同的图像分辨率,更高的DPI表现为物理尺寸更小。因为这个时候每英寸点更多,像素变小。

28、g++在执行编译工作的时候的流程 (编译cpp文件)
预处理,生成.i的文件
将预处理后的文件转换成汇编语言,生成.s文件
将汇编变为目标代码(机器代码),生成.o的文件
连接目标代码,生成可执行程序

29、如何在linux平台下使用CMake生成Makefile并编译的流程
编写CMake配置文件CMakeLists.txt,我们可以认为CMakeLists.txt就是CMake所处理的"代码"。
执行命令 cmake path生成Makefile,其中path是CMakeLists.txt所在的目录。
使用make命令进行编译。

30、判别式模型,即Discriminative Model,又被称为条件概率模型,它估计的是条件概率分布(conditional distribution), p(class|context) 。
生成式模型即Generative Model ,它估计的是联合概率分布(joint probability distribution),p(class, context)=p(class|context)*p(context) 。p(x,y),即事件x与事件y同时发生的概率。
常见的判别式模型有Logistic Regression,Linear Regression,SVM,Traditional Neural Networks
Nearest Neighbor,CRF等。
常见的生成式模型有Naive Bayes,Mixtures of Gaussians, HMMs,Markov Random Fields等。

31、根据目标跟踪方法建模方式的不同,可以分为生成式模型方法与判别式模型方法。
生成式模型跟踪算法以均值漂移目标跟踪方法和粒子滤波目标跟踪方法为代表,判别式模型跟踪算法以相关滤波目标跟踪方法和深度学习目标跟踪方法为代表。
生成类方法:
在原始影像帧中对目标按指定的方法建立目标模型,然后在跟踪处理帧中搜索对比与目标模型相似度最高的区域作为目标区域进行跟踪。算法主要对目标本身特征进行描述,对目标特征刻画较为细致,但忽略背景信息的影响。在目标发生变化或者遮挡等情况下易导致失跟现象。
判别类方法:
通过对原始影像帧,对目标及背景信息进行区分建立判别模型,通过对后续影像帧搜索目标进行判别是目标或背景信息进而完成目标跟踪。
判别类方法与生成类方法的根本不同在于判别类方法考虑背景信息与目标信息区分来进行判别模型的建立,由于判别类方法将背景与目标进行区分,因此该类方法在目标跟踪时的表现通常更为鲁棒,目前已经成为目标跟踪的主流跟踪方式。判别类方法包括相关滤波,深度学习方法。

32、目标跟踪有一些难点:
(1) 目标表征表达问题,虽然深度学习方法具有很强的目标表征能力,但是仍然容易受相似环境的干扰。
(2) 目标快速运动,由于很多跟踪的物体都是高速运动,因此既要考虑较大的搜索空间,也要在保持实时性的前提下减小计算量。
(3) 变形,多尺度以及遮挡问题,当目标发生很大的形变或者临时被遮挡如何保持跟踪并且在目标重新出现时恢复跟踪。

33、图割方法仍然被广泛使用,deeplab系列的前几篇文章就用到了全连接的crf,它与mrf的区别可以参考这篇文章【Discriminative fields for modeling spatial dependencies in natural images】。
图割方法很好用,是每个想做图像分割的同学必须掌握的,我从硕士论文,从第一个实习项目一直用到了现在。

34、学习率=0.001【0.01/10为了在学习新东西时不至于忘记之前的记忆】;

发布了71 篇原创文章 · 获赞 56 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/j879159541/article/details/103217368