我正在训练一个通过面部动作检测情绪的情绪识别系统,因此我形成了一个四维矩阵,试图将其简化为二维矩阵。
构成4D矩阵的特征:
视频数量(每个视频将被分配一个情绪标签)
每个视频的帧数
每帧面部标志的方向
每帧面部标志的速度
我试图训练的重要特征:
左侧是速度(每帧相同面部标志之间的斜边)
右侧是方向(每帧相同面部标志的x和y值的反正切)
我卡住的4D矩阵,试图简化为2D
>> main.shape (60, 17, 68, 2) # 60个视频,每个视频17帧,68个面部标志,2个特征(方向和速度) >> main array([[[[ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ], ..., [ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ]], [[ 1. , 1. ], [ 1.41421356, 0.78539816], [ 1.41421356, 0.78539816], ..., [ 3. , 1. ], [ 3. , 1. ], [ 3. , 1. ]], [[ 0. , 0. ], [ -1.41421356, 0.78539816], [ -1.41421356, 0.78539816], ..., [ 2. , 1. ], [ 3. , 1. ], [ 3. , 1. ]], ..., [[ 1. , 1. ], [ 1.41421356, -0.78539816], [ 1.41421356, -0.78539816], ..., [ -1.41421356, 0.78539816], [ 1. , 1. ], [ -1.41421356, 0.78539816]], [[ 2.23606798, -0.46364761], [ 2.82842712, -0.78539816], [ 2.23606798, -0.46364761], ..., [ 1. , 0. ], [ 0. , 0. ], [ 1. , 1. ]], [[ -1.41421356, -0.78539816], [ -2.23606798, -0.46364761], [ -2.23606798, -0.46364761], ..., [ 1.41421356, -0.78539816], [ 1.41421356, -0.78539816], [ 2.23606798, -1.10714872]]], [[[ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ], ..., [ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ]], [[ 2. , 1. ], [ 2.23606798, -1.10714872], [ 1.41421356, -0.78539816], ..., [ -2. , -0. ], [ -1. , -0. ], [ -1.41421356, -0.78539816]], [[ 2. , 1. ], [ -2.23606798, 1.10714872], [ -1.41421356, 0.78539816], ..., [ 1. , 1. ], [ -1. , -0. ], [ -1. , -0. ]], ..., [[ -2. , -0. ], [ -3. , -0. ], [ -4.12310563, -0.24497866], ..., [ 0. , 0. ], [ -1. , -0. ], [ -2.23606798, 1.10714872]], [[ -2.23606798, 1.10714872], [ -1.41421356, 0.78539816], [ -2.23606798, 1.10714872], ..., [ -2.23606798, 0.46364761], [ -1.41421356, 0.78539816], [ -1.41421356, 0.78539816]], [[ 2. , 1. ], [ 1.41421356, 0.78539816], [ 2.82842712, 0.78539816], ..., [ 1. , 1. ], [ 1. , 1. ], [ -2.23606798, -1.10714872]]], [[[ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ], ..., [ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ]], [[ 1. , 1. ], [ 0. , 0. ], [ 1. , 1. ], ..., [ -3. , -0. ], [ -2. , -0. ], [ 0. , 0. ]], [[ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ], ..., [ 1.41421356, 0.78539816], [ 1. , 0. ], [ 0. , 0. ]], ..., [[ 1. , 0. ], [ 1. , 1. ], [ 0. , 0. ], ..., [ 2. , 1. ], [ 3. , 1. ], [ 3. , 1. ]], [[ -7.28010989, 1.29249667], [ -7.28010989, 1.29249667], [ -8.54400375, 1.21202566], ..., [-22.02271555, 1.52537305], [ 22.09072203, -1.48013644], [ 22.36067977, -1.39094283]], [[ 1. , 0. ], [ 1.41421356, -0.78539816], [ 1. , 0. ], ..., [ -1.41421356, -0.78539816], [ 1. , 1. ], [ 1.41421356, 0.78539816]]], ..., [[[ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ], ..., [ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ]], [[ 5.38516481, 0.38050638], [ 5.09901951, 0.19739556], [ 4.47213595, -0.46364761], ..., [ -1.41421356, 0.78539816], [ -2.82842712, 0.78539816], [ -5. , 0.64350111]], [[ -6.32455532, 0.32175055], [ -6.08276253, -0.16514868], [ -5.65685425, -0.78539816], ..., [ 3.60555128, 0.98279372], [ 5. , 0.92729522], [ 5.65685425, 0.78539816]], ..., [[ -3.16227766, -0.32175055], [ -3.60555128, -0.98279372], [ 5. , 1. ], ..., [ 12.08304597, 1.14416883], [ 13.15294644, 1.418147 ], [ 14.31782106, 1.35970299]], [[ 3.60555128, -0.5880026 ], [ 4.47213595, -1.10714872], [ 6. , 1. ], ..., [-20.39607805, 1.37340077], [-21.02379604, 1.52321322], [-22.09072203, 1.48013644]], [[ 1. , 1. ], [ -1.41421356, 0.78539816], [ 1. , 1. ], ..., [ 4.12310563, 1.32581766], [ 4. , 1. ], [ 4.12310563, 1.32581766]]], [[[ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ], ..., [ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ]], [[ 0. , 0. ], [ 1. , 1. ], [ -2.23606798, 1.10714872], ..., [ -3.16227766, 0.32175055], [ 1. , 1. ], [ 1.41421356, -0.78539816]], [[ 1. , 1. ], [ 1. , 1. ], [ 1. , 1. ], ..., [ 3. , 1. ], [ 2. , 1. ], [ -1.41421356, 0.78539816]], ..., [[ 5.38516481, -1.19028995], [ 4.47213595, -1.10714872], [ 4.12310563, -1.32581766], ..., [ 2.23606798, -0.46364761], [ 1. , 1. ], [ -1. , -0. ]], [[ -5.38516481, 1.19028995], [ -4.12310563, 1.32581766], [ -3.16227766, 1.24904577], ..., [ 0. , 0. ], [ 1. , 0. ], [ 1.41421356, -0.78539816]], [[ 8.06225775, 1.44644133], [ -7.07106781, -1.42889927], [ 6. , 1. ], ..., [ -3.16227766, -0.32175055], [ -3.16227766, -0.32175055], [ -3.16227766, -0.32175055]]], [[[ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ], ..., [ 0. , 0. ], [ 0. , 0. ], [ 0. , 0. ]], [[ -2.23606798, 0.46364761], [ -1.41421356, 0.78539816], [ -2.23606798, 0.46364761], ..., [ 1. , 0. ], [ 1. , 0. ], [ 1. , 1. ]], [[ -2.23606798, -0.46364761], [ -1.41421356, -0.78539816], [ 2. , 1. ], ..., [ 0. , 0. ], [ 1. , 0. ], [ 1. , 0. ]], ..., [[ 1. , 0. ], [ 1. , 1. ], [ -2.23606798, -1.10714872], ..., [ 19.02629759, 1.51821327], [ 19. , 1. ], [-19.10497317, -1.46591939]], [[ 3.60555128, 0.98279372], [ 3.60555128, 0.5880026 ], [ 5. , 0.64350111], ..., [ 7.28010989, -1.29249667], [ 7.61577311, -1.16590454], [ 8.06225775, -1.05165021]], [[ -7.28010989, 1.29249667], [ -5. , 0.92729522], [ -5.83095189, 0.5404195 ], ..., [ 20.09975124, 1.47112767], [ 21.02379604, 1.52321322], [-20.22374842, -1.42190638]]]])
方向和速度特征非常有价值(是最重要的特征),因为它们代表了每帧每个面部标志的移动,我试图让机器学习算法基于这些特征进行训练。
我尝试将三个维度重塑成一个长向量(将速度、方向和帧全部混合在一起),最终形成了一个二维矩阵,我将其输入到sklearn的SVM函数中,结果准确率相当低。我预料到了这一点,因为我认为机器学习算法无法识别巨型单一矩阵中特征之间的差异,并假设向量中的所有内容都是相同的特征。
我被迫将速度、方向和每帧视频强制组合成一个向量,形成了一个2D矩阵,并在sklearn SVM中输入,得到的准确率较低:
>> mainarray([[ 0. , 0. , 0. , ..., -0.78539816, 2.23606798, -1.10714872], [ 0. , 0. , 0. , ..., 1. , -2.23606798, -1.10714872], [ 0. , 0. , 0. , ..., 1. , 1.41421356, 0.78539816], ..., [ 0. , 0. , 0. , ..., 1. , 4.12310563, 1.32581766], [ 0. , 0. , 0. , ..., -0.32175055, -3.16227766, -0.32175055], [ 0. , 0. , 0. , ..., 1.52321322, -20.22374842, -1.42190638]])>> main.shape(60, 2312)
我想保留速度和方向特征,但必须以考虑视频中帧的方式在2D矩阵中表示它们。
每个视频的17个帧都将附带一个情绪标签。(所以基本上,17帧的视频将被标记为一种情绪)
有没有什么聪明的方法可以重塑和简化4D矩阵来实现这一点?
回答:
所以,根据您提出的问题,您绝对会看到低准确率,而且您几乎无法改变这一点。将单一情绪分配给一个视频(取决于您的语料库),通常不够准确,以至于任何机器学习算法都难以学习您试图提取的信号。
此外,您将问题定义为时间序列问题,这将使您的生活变得头疼,尤其是如果您使用的是现成的sklearn
算法,这些算法非常不适合这种任务。
如果可能的话,您应该将问题重新定义为计算机视觉
问题。您应该尝试预测每个单独的帧的情绪内容。如果您没有具有这种粒度的数据集,您就不会看到很高的准确率。
这与您提问的方式略有不同,但根据您提问的方式,这个问题是不可解决的。相反,您应该这样处理这个问题:
- 为单个帧标记情绪内容
-
训练基于图像的算法来分类这些标记的帧
- 卷积神经网络在您有足够大数据集的任何基于图像的问题上可能会提供最佳性能
- 如果这不是一个选项,您需要开发图像的一维特征表示。我个人建议使用indico的图像特征API。一旦您有了这种表示,典型的算法如SVM将工作得很好。
- 如果准确率不太理想,但接近您的期望,我建议使用像这里详细描述的前处理/数据增强管道。当然,该示例是用于浮游生物识别,但基本方法是相同的
-
如果准确率仍然不够高,并且您需要对整个视频进行预测,那么您将希望聚合结果以在整个视频上提供准确的结果
- 一种方法是训练一个卷积神经网络,基于您对视频所做的预测图。这听起来有点奇怪,但可能会工作得很好
- 一个好的方法是使用贝叶斯方法,假设每个预测都有一定的置信度,并结合视频上的预测分布。
- 最好的方法是将这视为一个集成学习问题。幸运的是,集成学习是一个非常深入研究和理解的问题。您可以在这里找到如何组合多种预测的详细信息这里。
希望这对您有帮助!如果您有更多问题,请告诉我。
免责声明:我是indico的CEO,所以我推荐使用它可能会有偏见。