CVPR 2022
About:1、2、Voiculescu, I、McCouat, J、 github、
数据集是和YOLO中的ceph一样的
目的:同时①landmark检测②每个点的不确信度测量
方法-3stage:
1)one-hot热独编码图片训练网络
2)用temperature温度校准网络不确定性
3)计算新创”Expected Radial Error期望径向误差”得不确定性测量
可实现与先进方法一样的定位效果;每个landmark的不确定性得分(通用cv-landmark检测的大改变)且不确定性测量可对不准确的landmark预测进行准确分类。
1、环境配置及报错问题处理
2、代码没有批量生成文件目录并添加结果;
3、TypeError: cannot unpack non-iterable NoneType object
4、ImportError: cannot import name 'summary_string' from 'torchsummary.torchsummary'
summary_string没有了,直接summary;sodel_summary也是无,_
记得要upload
5、train.py: error: the following arguments are required: --training_images
运行->编辑配置->找对.py并配置参数
6、test.py
(1)×
UnpicklingError: could not find MARK、解决、根据报错在相应位置加:
f.seek(0)
然后ModuleNotFoundError: No module named 'multiprocessing.util'
pip install multiprocessing
然后python setup.py egg_info Check the logs for full command output、、要更新
python -m pip install --upgrade pip
重新打开,又回到最开始的问题:MARK一般是多GPU跑,上面解决无效。
(2)√
报错在serialization.py自带的修改无效。
根据报错信息,且readme中我没有下载它给的预训练模型,而是用自己前面train的。所以不是6(1)问题而是我预训练模型路径配错了,应该把我训练好的模型权重文件的路径放进去。
解决:)
(3)运行有新报错,但是看了config.py...直接注释掉test.py里的,运行成功。
“调试过程是不是很快乐” 昂T _T
Landmark Detection
CNN进行、
DL关键点回归2-heatmap
详解one-hot编码
径向与轴向:轴就是它的中心轴,径就是它的直径;那么轴向就是中心轴的方向,径向就是直径方向了.垂直于表面的就是轴向,平行于表面的就是径向了.
径向误差:图像的径向畸变是指图像点从它的理想位置向内或向外移动,即在径向上出现误差。而图像的切向畸变是指图像点在切向上出现偏移,如图2所示。
DL模型不确定性方法对比、提及论文★:
Temperature Scaling:
首先calibrated:神经网络在分类时会输出“置信度”分数和预测结果。理想情况下,这些分数应该与真实正确性的可能性相匹配。(例如,如果我们将 80% 的置信度分配给 100 个样本,那么我们就会期望 80% 样本的预测实际上是正确的。如果是这样,我们说模型是经过校准的。)而 Temperature scaling 则是一个非常简单的后处理步骤,能够帮助模型进行校准。一种可视化校准的简单方法是将精度作为置信度的函数绘制(reliability diagram)
但要注意的是,上述方法需要在 validation set 上进行优化,来学习参数 temperature,而不能在 training set 上进行学习,所以 Temperature scaling 是一个 post process,即后处理步骤,这种方法也暂时只能用于分类任务,不能用于回归。
softmax :Softmax函数是一个非线性转换函数,通常用在网络输出的最后一层,输出的是概率分布(比如在多分类问题中,Softmax输出的是每个类别对应的概率)
softmax 用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。
详解softmax:从字面上来说,可以分成soft和max两个部分。max故名思议就是最大值的意思。Softmax的核心在于soft,而soft有软的含义,与之相对的是hard硬。很多场景中需要我们找出数组所有元素中值最大的元素,实质上都是求的hardmax。hardmax最大的特点就是只选出其中一个最大的值,即非黑即白。但是往往在实际中这种方式是不合情理的,比如对于文本分类来说,一篇文章或多或少包含着各种主题信息,我们更期望得到文章对于每个可能的文本类别的概率值(置信度),可以简单理解成属于对应类别的可信度。所以此时用到了soft的概念,Softmax的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性。(当使用Softmax函数作为输出节点的激活函数的时候,一般使用交叉熵作为损失函数。由于Softmax函数的数值计算过程中,很容易因为输出节点的输出值比较大而发生数值溢出的现象,在计算交叉熵的时候也可能会出现数值溢出的问题。为了数值计算的稳定性,TensorFlow提供了一个统一的接口,将Softmax与交叉熵损失函数同时实现,同时也处理了数值不稳定的异常,使用TensorFlow深度学习框架的时候,一般推荐使用这个统一的接口,避免分开使用Softmax函数与交叉熵损失函数。)
交叉熵softmax求导
softmax中的温度系数:
On Calibration of Modern Neural Networks
论文阅读笔记:作者发现,在深度神经网络盛行的当下,虽然网络的精度(Accuracy)大大提升了,但是网络的标定性(Calibration)很差。
【22】model calibration:我们在模型给出一个预测的时候,通常还希望模型能够告诉我们对于这个预测的 confidence 是多少。比如,天气预报预测明天下雨,我们还希望知道明天下雨的概率是多少。要想这个概率真正能帮助到我们,就要求这个概率是校准的(calibrated)。
置信度:置信度也称为可靠度,或置信水平、置信系数,即在抽样对总体参数作出估计时,由于样本的随机性,其结论总是不确定的。因此,采用一种概率的陈述方法,也就是数理统计中的区间估计法,即估计值与总体参数在一定允许的误差范围以内,其相应的概率有多大,这个相应的概率称作置信度。|| 置信区间只在频率统计中使用。在贝叶斯统计中的对应概念是可信区间。但是可信区间和置信区间是建立在不同的概念基础上的,因此一般上说取值不会一样。 置信空间表示通过计算估计值所在的区间。 置信水平表示准确值落在这个区间的概率。 || 置信区间表示具体值范围,置信水平是个概率值。例如:估计某件事件完成会在10~12日之间,但这个估计准确性大约只有80%:表示置信区间(10,12),置信水平80%。要想提高置信水平,就要放宽置信空间。|| 置信水平是指总体参数值落在样本统计值某一区内的概率;而置信区间是指在某一置信水平下,样本统计值与总体参数值间误差范围。置信区间越大,置信水平越高。
置信度:最简单的解释就是可靠性。99.99%的置信度就是一万次测试,最多可能有一次失败。99.9%的置信度就是一万次测试,最多可能有十次失败。
置信水平:
置信度理解(95%的置信度、置信区间):
Expected Calibration Error (ECE)模型校准原理解析:
图是ECE原论文里的第一张插图,比较直观。随着网络规模越来越大,拟合能力越来越强,网络的概率分布都有集中化的趋势。虽然绝对误差也越来越小,但网络给出概率的含义却对人越来越模糊,ECE(红色面积)也越来越大。
为了能够定量地度量置信度,作者将[0, 1]区间划分为多个bin(这里划分为了5个bin),所有的二分类样本都将根据模型对其预测的结果分别落入这5个bin之中的1个。在每个bin之中计算平均的模型confidence,再与该bin中样本真实标签的平均accuracy进行对比,两者之差的绝对值就能度量模型的置信度,差距越大代表模型置信度越小。
语言模型的校准:
使得accuracy = confidence这个calibration用处:能够让你知道你什么时候可以信任模型。
[22]阅读笔记:可靠性直方图是用来描绘模型可靠性的一类直方图。 完美标定的(perfect calibrated) 模型应当是一条对角线。中间为gap,即confidence与精度之间的差距。完美的标定模型其可靠性图应当是一条对角线。confidence能够精确反应预测精度。
Uncertainty:检索目录:1、2、目录2、3、4、5、6、7-
:1、2、3、4、5、6、7、8
目录3:1、2、3、4、5、6
目录4:1、2、3、4、5、6、7、8、9、
Uncertainty measurements不确定度测量
模型不确定性:Model uncertainty is a measure of how well a model fits a dataset and is often expressed in terms such as standard errors. Researchers use these measures to inform how confident they are in the results from a model. In DBER, the most common method for expressing confidence is through the use of p-values as go/no-go tests that determine if an effect exists. The American Statistics Association has recommended against this misuse of p-values for understanding model uncertainty as it can lead to false claims (Wasserstein & Lazar, 2016; Wasserstein et al., 2019). 模型不确定性衡量模型与数据集的拟合程度,通常以标准误差等术语表示。 研究人员使用这些措施来告知他们对模型结果的信心。 在 DBER 中,表达置信度的最常用方法是使用 p 值作为确定是否存在影响的通过/不通过测试。 美国统计协会建议不要滥用 p 值来理解模型的不确定性,因为它可能导致错误的声明(Wasserstein & Lazar, 2016; Wasserstein et al., 2019)。
一些论文:
What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision?(NIPS 2017)
Principled and practical uncertainty estimates in deep learning without changing a thing.-1、2、3
不确定性神经网络目录↓↓↓
ICML2020 | 贝叶斯图神经网络:解决过平滑和不确定性问题:目前图神经网络存在很多的问题,这里作者提出了两个,一个是过平滑,另外一个是对预测结果的不确定性进行评估,换句话说希望预测的结果不仅仅是一个结果,如果有一个置信度就更好了,比如疾病预测,预测了影像目前是什么病,有一个置信度是不是会更有价值一些呢?
->DL中的两种不确定性①★摘:不确定性(Uncertainty)
目前深度学习在很多领域的表现都非常好,像是无人驾驶使用的语义分割上的准确率相当惊人。但是众所周知,Tesla无人驾驶一段时间前发生了很多起事故。其中导致一人死亡。最终原因是算法误将一辆浅色卡车误判为天空。
这个事故暴露出的一个问题便是,现在我们传统深度学习算法几乎只能给出一个特定的结果,而不能给出模型自己对结果有多么confident. 的确,在分类问题中,我们会在网络的最后一层添加一个softmax函数来获得概率,但是试想下边这样一个情况:假如我训练了一个分类人脸和猩猩脸的模型。但是我在test阶段给了模型一个大脸猫的图片,我们的模型很会给出一个相当不准确的结果,而没有办法告诉我们“我真不知道这是个什么鬼。” 可能有人说,在这种情况下,最终结果会不会输出一个[0.5,0.5]的结果,来表示自己对结果不确定呢?其实,softmax函数的特性决定了这种情况下网络不太可能输出[0.5,0.5]这样的结果[1]。
这个问题是一个很重要的问题,我曾经在知乎看到过一个搞航天器的朋友回答,为什么ML现在在航空航天领域没有办法应用,他的回答说NN可以在多数情况下给出一个特别特别好的结果,但是偶尔会给出一个特别糟糕的结果,然而这个特别糟糕的结果在他们这个领域是绝对无法被接受的。如果模型可以在输出这个结果的同时,给出一个非常低的置信度,人类就可以被告知需要介入了,那么ML就可以在更广泛的领域进行应用。
那么如何让网络获得一个置信度的输出呢?目前一个非常普遍的方法是利用BNN (Bayesian Neural Network)。BNN的原理大体上是,我们网络中每个参数的weight将不再是一个特定的数字,取而代之的是一个先验分布。这样我们train出来的网络将不再是一个函数,而是一个函数的分布[2]。通过这个分布,我们便可以得到一个对结果的置信度。但是,实现过BNN和使用过pyro的朋友们应该知道,BNN是比较难应用在动辄上百卷积层的大型网络上的。它的训练速度,计算复杂度,都限制了它的发展。
本文将讨论深度学习中不同原因导致的不确定性,并介绍如何量化这些不确定性。我们将通过一种名为MC Dropout (Monte Carlo Dropout)的方法来进行贝叶斯推断,之后对loss function的修改来得到不确定性。
->深度学习中的不确定性 - 知乎 (zhihu.com):如果能够让深度学习模型对于错误的预测给出一个较高的不确定性,我们就能判断一个预测结果可信程度。因此,我们需要对不确定性进行建模。衡量不确定性最直观的方法就是方差。|| 不确定性有两种。一种称之为偶然不确定性(Aleatoric Uncertainty),是由于观测数据中的固有噪声导致的。这种不确定性是无法被消除的。另外一种称之为感知不确定性(Epistemic Uncertainty),与模型相关,是由于训练不完全导致的。如果给它更多的训练数据来弥补现有模型知识上的不足,这种不确定性从理论上来说是可以消除的。
剑桥小组:了解您的模型是否信心不足或错误地过度自信可以帮助您从中获得更好的性能。
uncertainty中常见的method和metric:目前深度学习在很多领域的表现都非常好,现在大多数深度学习算法几乎只能给出一个高置信度的预测结果,而不能给出模型自己对结果有多么确信。深度学习模型得到的这些高置信度预测通常由softmax产生,因为softmax概率是用快速增长的指数函数计算的,因此对softmax输入(即logit)进行少量添加就会导致输出分布发生实质性变化。 实际上在理想情况下,当你给我几张猫和狗的图片然后要求我对一张新的猫照片进行分类,那么我应该非常有信心地返回预测。 但是,如果你给我一张鸵鸟的照片,并强迫我确定它是猫还是狗,那么这种情况下,我应该以较低的预测信心返回我的结果。 模型具有这种能力在很多领域都是至关重要的,比如在无人驾驶领域,能够使机器在决策时采用更加合理的方式。在医疗领域,医生可以通过模型对于诊断的确信度来加以判断等等。
Reliability Diagrams可靠性图是以随机变量预测值的概率分布为横坐标, 真实值对预测值的条件概率分布(或频率分布)为纵坐标的二维图,可以在二元分类(binary classification)问题中评估分类器的可靠性,对不可靠的分类器进行校准。
在实际应用中,可靠性图按类似直方图(histogram)的方法绘制。首先将横坐标和纵坐标的概率空间离散化得到有限个区间(bins),随后统计预测值落入每个区间的样本的真实值的频率并绘制成线,作为其对预测值的条件概率分布的近似。
Reliability Diagrams:
ROC曲线详解:ROC 曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。传统的诊断试验评价方 法有一个共同的特点,必须将试验结果分为两类,再进行统计分析。ROC曲线的评价方法与传统的评价方法不同,无须此限制,而是根据实际情况,允许有中间状 态,可以把试验结果划分为多个有序分类,如正常、大致正常、可疑、大致异常和异常五个等级再进行统计分析。因此,ROC曲线评价方法适用的范围更为广泛。
ROC与AUC:
ROC曲线:受试者工作特性曲线 (receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。
- ROC曲线的横坐标为false positive rate(FPR)即负类样本中被判定为正类的比例,也就是传说中的误纳率。或者医学上的假阳性。
- 纵坐标为true positive rate(TPR)即正类样本中被判定为正类的样本,1-TPR也就是传说中的误拒率。医学上称真阳性。
比如一个医院中10个病人诊断新冠,得到7个无新冠,3个有新冠,其中真实情况是2个有新冠。则真阳性为TP/P=2/3,假阳性为FP/N=1/7。则这个点体现在roc图上为:(1/7,2/3)。
为什么使用ROC:因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。
PR、ROC、AUC:模型的效果越好,整个ROC曲线越往左上角靠
BN
Adam optimizer
imgaug数据增强库 、功能:imgaug是一个封装好的用来进行图像augmentation的python库, 这个库功能全面,且有丰富的文档支持,能满足我们大多数的数据增强的需求。 支持关键点(keypoint)和bounding box一起变换。 它可以将你的输入图片转换成很多新的、更大数据量的轻微变动的图片,这对于数量比较小的数据集来说简直是福音!常见的变换比如 滤波,扰动,平移,翻转,缩放,裁剪,锐化,噪声,灰度,亮度,对比度等等。
项目主页、安装与使用、快速使用
欧氏距离Euclidean distance:是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。|| 距离比较
负对数似然损失:
负对数似然是一种用于解决分类问题的损失函数 ,它是似然函数得一种自然对数形式,可用于测量两种概率分布之间的相似性,其取负号是为了让最大似然值和最小损失相对应,是最大似然估计及相关领域的常见函数形式。
机器学习中,习惯用优化 算法 求最小值,因此会用到负对数似然,这是分类问题中的常见的损失函数,且能拓展到 多分类 问题。
scale:缩放
zoom与scale的异同点
PMLR介绍、Proceedings of Machine Learning Research、
吴恩达DL笔记