论文笔记--DeepFly3D,一种基于深度学习的方法,用于拴住的成年果蝇的3D肢体和附属物追踪

记录一下看的论文,只记录了需要的部分

  计算机视觉界在很大程度上放弃了这些技术,而选择了基于深度学习的方法。因此,单眼3D人类姿态估计算法的功效已经大大改善。通过使用多摄像头设置(Elhayek等人,2015;Rhodin等人,2016;Simon等人,2017;Pavlakos等人,2017b)和三角化的二维检测,可以获得对遮挡的更强的鲁棒性。这提高了准确性,同时使消除错误检测成为可能。尽管如此,二维姿势仍然提供了对动物行为的不完整表述:重要的信息可能由于遮挡而丢失,而且运动量化受到视角的严重影响。
  DeepFly3D被应用于从多个相机获得的同步视频。它首先使用最先进的深度网络(Newell等人,2016),然后在不同的视图中强制执行一致性。这使得它有可能消除虚假检测,实现高的三维精度,并使用三维姿势误差来进一步微调深度网络以实现更好的精度。为了注册摄像机,DeepFly3D使用了一种新颖的校准机制,其中苍蝇本身就是校准目标。在校准过程中,我们还采用了稀疏束调整方法,正如之前用于人类姿势估计的方法(Takahashi等人,2018;Triggs等人,2000;Puwein等人,2014)。因此,用户不需要制造一个过小的校准模式,或重复繁琐的校准协议。

  最后,我们证明了三维关节角度数据的无监督行为嵌入对二维姿势数据嵌入中出现的问题伪影是稳健的。简而言之,DeepFly3D可以可靠、准确地提供三维姿势估计,而且人工干预最少,同时也为自动行为数据分析提供了一个重要工具。

  这些在二维姿势估计方面的进展最近也被用于测量实验室动物的行为。例如,DeepLabCut为DeeperCut提供了一个友好的接口,DeeperCut是一个最先进的人类姿势估计网络(Mathis等人,2018),而LEAP(Pereira等人,2019)可以使用较浅的网络成功跟踪肢体和附属物地标。尽管如此,二维姿势仍然提供了对动物行为的不完整表述:重要的信息可能由于遮挡而丢失,而且运动量化受到视角的严重影响。
没有外部校准模式的校准
  从多个图像中估计3D姿势需要校准相机,以达到与目标尺寸相称的精度水平–在测量像果蝇这样小的动物的腿部运动时,这是一个困难的挑战。因此,DeepFly3D没有使用典型的外部校准网格,而是使用苍蝇本身作为校准目标。它检测苍蝇身体上的任意点,并依靠捆绑调整(Chavdarova等人,2018)来同时为这些点分配三维位置,并估计每个摄像头的位置和方向。为了提高鲁棒性,它执行了适用于系留苍蝇的肢体长度和运动范围的几何约束。
几何上一致的重建
  从最先进的用于单个图像中的二维关键点检测的深度网络开始(Newell等人,2016),DeepFly3D在多个同步相机视图中执行几何一致性约束。当对二维检测进行三角测量以产生三维联合位置时,它依靠图像结构和信念传播信息传递(Felzenszwalb和Huttenlocher,2005)来检测并进一步纠正错误的姿势估计。
自我监督和主动学习
  DeepFly3D还使用多视图几何学作为主动学习的基础。由于获得同一动物的多个视图所固有的冗余性,我们可以检测到错误的二维预测,以进行纠正,这将最有效地训练二维姿势深度网络。这种方法大大减少了对耗时的人工标注的需求(Simon等人,2017)。我们还使用画像结构校正来微调二维姿势深度网络。自我监督构成了我们训练数据的85%。

在这里插入图片描述
图2. 平均绝对误差分布。(A) PCK(关键点百分比)的准确性是平均绝对误差(MAE)阈值的一个函数。(B) 在低数据状态下评估网络预测误差。堆叠沙漏网络(蓝色圆圈)显示出接近渐进式的预测误差(红色虚线),即使在只用400张注释的图像进行训练时也是如此。在800张注释后,MAE的改善是最小的。© 不同肢体地标的MAE。小提琴图与原始数据点(白色圆圈)重叠在一起

  尽管我们的网络达到了很高的准确度,但误差并不是各向同性的(图2C)。跗骨尖(即跗骨前)表现出比其他关节更大的误差,也许是由于球形跑步机的遮挡,以及更高的位置变化。体部-关节观察到的误差增加可能是由于从某些相机视图中注释这些地标的困难所致。
为了纠正残余的错误,我们应用了象形结构。这一策略修正了59%的剩余错误预测,将最终的准确率从98.2%提高到99.2%。这些改进在图3中得到了说明。象形结构的失败往往是由于严重的运动模糊造成的姿势模糊。这些剩余的错误通过使用方程6的多视图冗余来自动检测,并指定使用DeepFly3D GUI进行人工修正。

三维姿势允许强大的无监督行为分类
  无监督行为分类方法通过处理数据特征–图像像素强度(Berman等人,2014年;Cande等人,2018年)、肢体标记(Todd等人,2017年)或二维姿势(Pereira等人,2019年)–来对动物行为进行无偏见的量化,无需用户干预,并自动区分其他类似的行动。然而,这种敏感性可能会带来对与行为无关的特征的敏感性,包括不同实验系统的相机角度不同导致的图像大小或视角的变化,系留动物的不同安装,以及动物间的形态差异。理论上,这些问题都可以通过使用三维关节角度而不是二维姿势进行无监督嵌入来克服–提供比例和旋转不变性。
  相比于使用来自三个相邻摄像头的二维姿势数据进行无监督行为分类,使用DeepFly3D衍生的3D关节角度进行无监督行为分类,得出的地图(图5)对不同的GAL4驱动线及其相关行为,即后退行走(图5-视频4)、梳理(图5-视频5)和前进行走(图5-视频6),有明显的隔离和富集集群。因此,三维姿势克服了二维姿势数据的无监督嵌入所产生的严重问题,使行为数据分析更加可靠和稳健。

讨论

  我们开发了DeepFly3D,一个基于深度学习的3D姿势估计系统,该系统为量化系留行为果蝇的肢体和附肢运动而优化。通过使用多个同步相机和利用多视角冗余,我们的软件在亚毫米尺度上提供了稳健和准确的姿势估计。最终,我们可以通过将二维检测(Pavlakos等人,2017b)提升到三维或直接回归到三维(Tekin等人,2017),仅用单眼图像进行工作,这在人类姿势估计研究中已经实现。我们的方法依靠监督下的深度学习来训练一个神经网络,以检测单个摄像机图像中的二维关节位置。重要的是,我们的网络在运行过程中变得越来越能干。通过利用多相机设置固有的冗余,我们迭代地重新预测3D姿势,以自动检测和纠正2D错误,然后使用这些修正来进一步训练网络,而无需用户干预。
我们所采用的技术–使用动物本身而不是外部设备的多相机校准方法、使用图形模型推断三维姿势的迭代方法以及基于动态编程和信念传播的优化方法、图形用户界面和主动学习策略来交互、注释和纠正三维姿势数据–都不是苍蝇特有的。它们可以很容易地适用于其他肢体动物,从小鼠到灵长类动物和人类。唯一需要大幅改变的是实验装置的尺寸。这将消除处理果蝇所需的非常小的尺度的需要,并在实践中,使姿势估计更容易。在材料和方法部分,我们详细解释了如何修改DeepFly3D的特定生物体特征–骨节长度、腿的数量和相机焦距,以研究例如人类、灵长类动物、啮齿类动物或其他昆虫

材料和方法
  有了来自七台摄像机的同步果蝇视频序列,DeepFly3D的第一个任务是检测38个地标的2D位置。然后,这些在多个视图中看到的相同地标的二维位置被三角化,以生成三维姿态估计。这个管道在图6中被描述出来。首先,我们将描述我们基于深度学习的方法来检测图像中的地标。然后,我们将解释产生完整三维轨迹的三角测量过程。最后,我们将描述我们如何自动识别和纠正错误的2D检测。

二维姿势估计深度网络架构
  我们的目标是在每个肢体上检测五个关节,在腹部检测六个,在每个天线上检测一个,每个时间实例总共有38个关键点。为了实现这一目标,我们通过改变输入和输出层来适应新的输入图像分辨率和不同数量的跟踪点,改编了最先进的叠加沙漏人体姿势估计网络(Newell等人,2016)。一个沙漏堆栈由具有最大池的剩余瓶颈模块组成,然后是上采样层和跳过连接。第一个沙漏网络从一个卷积层和一个池化层开始,将输入图像的大小从256 512减少到64 128像素。剩下的沙漏输入和输出张数为64 128。在我们的最终实现中,我们使用了8个沙漏堆栈。网络的输出是一叠概率图,也被称为热图或置信图。每个概率图编码一个关键点的位置,作为网络的信念,即一个给定的像素包含该特定的跟踪点。然而,概率图并没有正式定义一个概率分布;它们在所有像素上的总和并不等于1。

二维姿势训练数据集
  我们为19个关键点训练了我们的网络,结果在考虑到苍蝇的两边时,我们追踪到了38个点。确定哪些图像用于训练目的是至关重要的。直观简单的方法–用随机选择的图像进行训练–可能导致整个网络性能的边际改善。这是因为在训练过程中,网络预测已经可以正确进行的图像只产生了小的梯度。另一方面,手动识别可能导致错误的网络预测的图像是非常费力的。因此,为了识别这种具有挑战性的图像,我们利用了拥有多个摄像机视角的冗余(见3D姿势校正部分)。单个相机图像中的离群值使用其他相机的图像进行自动纠正,而在多个相机视图上仍表现出较大重投误差的帧则被选作人工注释和网络再训练。这种自我监督和主动学习的结合允许使用较小的手动注释数据集进行更快的训练(西蒙等人,2017)。图6说明了完整的注释和迭代训练管道。总共有40,063张图片被标注。5,063张是在第一次迭代中手动标注的,29,000张是通过自动修正的,6,000张是通过手动修正主动学习策略所建议的。
在这里插入图片描述
图6. DeepFly3D的姿势估计管道。(A) 从多摄像机系统中获取数据。(B) 二维姿势的训练和再训练。© 三维姿态估计。

深度网络训练程序
  我们训练我们的堆叠沙漏网络,从256 512像素的灰度视频图像回归到多个64 128概率图。具体来说,在训练和测试期间,网络输出一个19 64 128的张量;每个跟踪点有一个64 128的概率图。在训练过程中,我们通过嵌入一个二维高斯来创建概率图,该二维高斯的平均值在地面真实点,在协方差矩阵的对角线上有1px的对称范围(即s ¼ 1px)。我们将损失计算为地面实况和预测概率图之间的L2距离。在测试期间,对某一点的最终网络预测是具有最大概率的概率图像素。我们从0.0001的学习率开始,一旦损失函数超过5个历时,就将学习率乘以0.1的系数。我们使用RMSPROP优化器进行梯度下降,遵循最初的叠加沙漏实现,批次大小为8张图像。使用37,000张训练图像,堆叠沙漏网络通常在100个epochs(在单个GPU上为20小时)后收敛到一个局部最小值。
网络训练细节
  每只苍蝇在不同实验中的位置变化是由卷积运算的平移不变性处理的。此外,我们人为地增加了训练图像,以提高网络对进一步的图像变量的概括性。这些变量包括:(i)照明条件–我们使用伽马变换随机改变了图像的亮度;(ii)比例–我们在0.80x-1.20x之间随机重新缩放图像;(iii)旋转–我们随机旋转了图像和相应的概率图±15˚。这种增强足以补偿不同实验中被拴住的苍蝇的大小和方向的实际差异。此外,按照一般惯例,从每张输入图像中减去平均通道强度,以便在零周围对称地分布注释。我们开始使用MPII人类姿势数据集(Andriluka等人,2014)的预训练权重进行网络训练。这个数据集由超过25,000张图片和40,000个注释组成,每张图片可能有多个真实的人类姿势标签。从预训练的网络开始,可以更快地收敛。然而,根据我们的经验,在有大量训练数据的情况下,这并不影响最终的网络准确性。我们将数据集分成37,000张训练图像、2,063张测试图像和1,000张验证图像。这些子集都没有共享共同的图像或共同的动物,以确保网络可以在不同的动物和实验设置中进行推广。我们的训练图像中有5063张是人工标注的,其余的数据是使用信念传播、图形模型和主动学习自动收集的,(见3D姿势校正部分)。深度神经网络的参数需要在有人工注释的地面真实关键点位置的数据集上进行训练。为了初始化网络,我们使用一个自定义的多镜头注释工具收集注释,该工具是我们使用谷歌Firebase在JavaScript中实现的(图7)。DeepFly3D注释工具在一个简单的网络服务器上运行,简化了注释在用户之间的分配,使这些注释更容易被检查和控制。
在这里插入图片描述图7. DeepFly3D的注释工具。这个图形用户界面允许用户在七个摄像机的图像上手动注释关节位置。因为这个工具可以通过网络浏览器访问,所以注释可以更容易地在多个用户之间以分布式方式进行。注释工具的完整描述可以在在线文档中找到:https://github.com/NeLy-EPFL/DeepFly3D。比例尺为50像素。DOI: https://doi.org/10.7554/eLife.48571.015

计算硬件和软件
  我们在一台运行在英特尔酷睿i9-7900X CPU、32GB DDR4内存和GeForce GTX 1080的桌面计算工作站上训练我们的模型。有了37,000张手动和自动标记的图像,在一个GeForce GTX 1080 GPU上训练需要近20小时。我们的代码是用Python 3.6、Pytorch 0.4和CUDA 9.2实现的。使用这种桌面配置,我们的网络可以在100帧/秒(FPS)的速度下运行,使用沙漏网络的8栈变体,可以在420FPS的速度下运行,使用较小的2栈版本。由于有效的初始化步骤,校准需要3-4秒。查错和纠错可以分别以100FPS和10FPS的速度进行。误差校正只在应对大的重投误差时进行,不会对管道的整体速度造成瓶颈。

准确度分析
  与人类姿势估计的文献一致,我们以正确关键点百分比(PCK)和平均误差根数(RMSE)的形式报告准确性。

从二维地标到三维轨迹
  在上一节中,我们描述了我们检测38个二维地标的方法。让xc;j 2 R2表示相机c获取的图像中地标j的二维位置。对于每个地标,我们现在的任务是估计相应的三维位置,Xj 2 R3。为了完成这个任务,我们使用三角测量和捆绑调整(Hartley和Zisserman,2000)来计算三维位置,并使用象形结构(Felzenszwalb和Huttenlocher,2005)来执行几何一致性并消除由错误探测引起的潜在错误。我们在下面介绍这些步骤。
针孔摄像机模型
  第一步是对投影操作进行建模,将一个具体的Xj与它在每个相机视图xc;j中的七个投影联系起来。为了使之更容易,我们遵循标准做法,将所有笛卡尔坐标[xc;yc;zc]转换为同质坐标[xh;yh;zh;s]以便xc = xh/s,yc = yh/s,zc = zh/s。从现在开始,我们将假设所有的点都用同质坐标表示,并省略h下标。假设这些坐标在一个坐标系中表示,其原点在相机的光学中心,Z轴是其光轴,那么一个三维同质点[x;y;z;1]的二维图像投影[u;v]可以写为
在这里插入图片描述
其中,3X4矩阵K被称为内在参数矩阵–在x和y方向上的缩放,以及主点cx和cy的图像坐标–它描述了摄像机的设置。
  在实践中,三维点不是用摄像机的固定坐标系来表达的,特别是在我们的应用中,我们使用了七个不同的摄像机。因此,我们使用一个所有相机都通用的世界坐标系。因此,对于每个相机,我们必须将在这个世界坐标系中表达的三维坐标转换成相机坐标。这需要旋转和平移坐标,以考虑到相机光学中心的位置和方向。当使用同质坐标时,这是通过将坐标向量乘以4 X4的外在参数矩阵来完成的
在这里插入图片描述
其中,R是一个3 X3旋转矩阵,T是一个3 X1平移矢量。将方程1和方程2结合起来,可以得到
在这里插入图片描述
其中P=MK是一个3X4矩阵

摄像机失真
在这里插入图片描述
图8. 相机校准。(A)通过使用表极关系纠正错误的二维姿势估计。只有没有大的外极点误差的二维姿态估计值才被用于标定。x2代表来自中间相机的二维姿态估计值。上极线在图像平面上以蓝色和红色线条表示。(B) 三角形的点,XT,使用初始相机参数。然而,由于每个相机的外在属性的粗略初始化,来自每个相机的观测结果并不一致,不能产生一个合理的三维位置估计。(C ) 摄像机的位置被修正,通过优化方程7,只使用修剪过的2D点,产生一个准确的3D位置估计。

  上面描述的针孔摄像机模型是一个理想化的模型。真实相机的投影会偏离它。这些偏差被称为失真,必须加以说明。最重要的失真被称为径向失真,因为误差会随着与图像中心的距离增长。对于我们使用的相机,径向畸变可以表示为
在这里插入图片描述
其中[u, v]是三维点的实际投影,u-pinhole 和 v-pinhole 是针孔模型预测的。换句话说,四个参数{k1x,k2x,k1y,k2y}。因此,从现在开始,我们将全部投影写成
在这里插入图片描述
其中f p表示方程3的理想针孔投影,f d表示方程4的校正。

三角测量法
  我们可以为七台摄像机中的每一台关联一个投影函数πc,如公式5,其中c是摄像机编号。给定一个三维点及其在图像中的投影xc,其三维坐标可以通过最小化重投影误差来估计
在这里插入图片描述
其中,如果该点在图像c中可见,ec为1,否则为0。在没有相机失真的情况下,也就是说,当投影π是同质坐标的纯线性操作时,这可以通过解决奇异值分解(SVD)问题对任何数量的摄像机进行处理(Hartley和Zisserman,2000)。在存在扭曲的情况下,在进行SVD之前,我们用方程5中相应的upinhole和upinhole的值来替换观察到的投影的u和v坐标。

在这里插入图片描述

图9. 使用MAP解决方案和象形结构对一条腿进行三维姿势校正。(A) 每个关键点的候选三维姿势估计值是通过对堆叠沙漏深层网络产生的概率图的局部最大值进行三角化来创建的。(B) 对于这些候选估计值的选择,我们可以用公式8分配一个概率。然而,为每一对点计算这个概率在计算上是很难的。(C ) 通过利用方程8的链式结构,我们可以使用信念传播算法在各层之间传递一个概率分布。信息在各层之间作为父节点的函数传递,描述了子节点对每个父节点的信念。灰度颜色代表每个节点的计算信念,颜色越深表示信念越高。(D) 通过选择具有最大信念的节点,在第二次向后迭代过程中获得修正的姿势估计。在向后传递信息的过程中,我们丢弃那些具有非最大信念的节点(x)。请注意,在前向信息传递之后,信念已经被调整了。

相机校准
  如上所述的三角测量需要知道方程3中每个相机c的投影矩阵Pc,方程4中相应的畸变参数fk1x;k2x;k1y;k2yg
,以及焦距和主点偏移的内在参数。在实践中,我们使用制造商提供的焦距和主点偏移,并自动估计其余的参数:每台相机的三个平移和三个旋转,定义相应的外在参数矩阵M以及失真参数。
  为了避免设计更多传统方法用来估计这些参数的极小的校准模式,我们使用苍蝇本身作为校准模式,并同时最小化所有关节的方程6的重投影误差,同时允许相机参数也发生变化。换句话说,我们要寻找
在这里插入图片描述
其中Xj和xc;j是上面介绍的地标的三维位置和二维投影,ρ表示Huber损失。方程7被称为捆绑调整(Hartley和Zisserman,2000)。Huber损失被定义为
在这里插入图片描述
用Huber损失代替平方损失使我们的方法对错误的检测xc;j更加稳健。我们根据经验将δ设置为20个像素。请注意,我们对每台摄像机的十个自由度进行了最小化:三个平移、三个旋转和四个扭曲。
  为了使这种优化正常工作,我们需要初始化这10个参数,并且需要减少离群值的数量。为了实现这一点,初始失真参数被设置为零。我们还通过测量相邻摄像机之间的距离和它们的相对方向来产生对三个旋转和三个平移参数的初始估计。为了初始化旋转和平移矢量,我们测量相邻摄像机之间的距离和角度,从中推断出粗略的初始估计值。最后,我们依靠表极几何学(Hartley和Zisserman,2000)来自动剔除离群点。因为摄像机形成了一个粗略的圆圈,并向内看,外极线接近于水平的图8A。因此,相应的二维投影必须属于相同的图像行,或者最多高出或低于几个像素。在实践中,这意味着要检查所有的二维预测是否位于几乎相同的行中,并先验地放弃那些不属于相同行的预测。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我明白了。以下是基于果蝇优化算法的Otsu算法的Python代码: ``` import cv2 import numpy as np import random # fruit fly optimization algorithm def FOA(OtsuFunc): # initialize population n = 10 m = 100 x = [] for i in range(n): x_i = [] for j in range(m): x_i.append(random.uniform(0, 1)) x.append(x_i) # initialize best solution best_sol = None best_score = -np.inf # iterate for 100 iterations for it in range(100): # evaluate all solutions scores = [] for i in range(n): sol = x[i] score = OtsuFunc(sol) scores.append(score) if score > best_score: best_score = score best_sol = sol # calculate probabilities p = [] for i in range(n): p_i = scores[i] / sum(scores) p.append(p_i) # update solutions y = [] for i in range(n): y_i = [] for j in range(m): y_ij = x[i][j] + random.gauss(0, 1) * (p[i] - 0.5) if y_ij < 0: y_ij = 0 elif y_ij > 1: y_ij = 1 y_i.append(y_ij) y.append(y_i) x = y return best_sol, best_score # Otsu algorithm def Otsu(threshold, img): img_t = img > threshold class0 = img[~img_t] class1 = img[img_t] w0 = len(class0) / len(img) w1 = len(class1) / len(img) m0 = np.mean(class0) m1 = np.mean(class1) variance = w0 * w1 * (m0 - m1)**2 return -variance # FOA-Otsu algorithm def FOA_Otsu(img): return FOA(lambda x: Otsu(x[0], img)) # read image img = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # apply FOA-Otsu algorithm sol, score = FOA_Otsu(img) threshold = int(sol[0] * 255) # segment image img_t = img > threshold img_seg = img_t.astype(np.uint8) * 255 # display result cv2.imshow('Original Image', img) cv2.imshow('Segmented Image', img_seg) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这个代码使用FOA-Otsu算法对给定的灰度图像进行二值化分割。算法的核心是`FOA`函数,它实现了基于果蝇优化算法的优化过程。它接受一个函数`OtsuFunc`作为参数,这个函数接受一个长度为1的列表作为输入,表示Otsu阈值,返回一个实数,表示对应阈值下的Otsu函数值。`FOA`函数会在100次迭代中搜索最优的阈值,并返回最优解和最优解对应的函数值。 `Otsu`函数实现了标准的Otsu算法,根据给定的阈值将图像分成两个类别,并计算两个类别的方差之和。 `FOA_Otsu`函数是基于果蝇优化算法的Otsu算法的实现,它接受一个灰度图像作为输入,调用`FOA`函数来搜索最优的阈值,并返回最优阈值对应的二值化图像。 在这个代码示例中,读入一个灰度图像`example.jpg`,然后使用`FOA_Otsu`函数对它进行二值化分割,并将结果显示出来。 请注意,为了保护您的隐私,我不会在任何情况下透露您对我所做的任何要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值