无法确定 2D 特征矩阵结构以输入机器学习算法

Having trouble determining a 2D feature matrix structure to feed into machine learning algorithm

我正在训练一个通过面部运动检测情绪的情绪识别系统,结果我形成了一个 4 维矩阵,我正试图将其降为 2 维。

构成4D矩阵的特征:
视频数量(每个视频都会被分配情感标签)
每个视频的帧数
每帧面部标志的方向
每帧面部特征点的速度

我正在尝试训练的重要特征:
左侧是速度(每帧相同面部标志之间的斜边)
右边是方向(每帧相同面部特征点的 x 和 y 值的反正切)

我一直坚持的 4D 矩阵并试图减少到 2D

>> main.shape  
(60, 17, 68, 2)  
# 60 videos, 17 frames per video, 68 facial landmarks, 2 features (direction and speed)  
>> 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 函数,但它产生的精度相当低.我预料到了这一点,因为我认为 ml 算法无法识别巨大的单一矩阵中的特征之间的差异,并假设向量中的所有内容都是相同的特征。

我被迫通过将每帧的速度、方向和视频都强制为一个向量来将 2D 矩阵输入 sklearn SVM,但精度较低:

>> main
array([[  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)

我想保留速度和方向特征,但必须在考虑视频帧的二维矩阵中表示它们。

情感标签将附加到每个视频的 17 帧中的每一帧。 (所以基本上17帧的视频都会被标记为情绪)

是否有任何聪明的方法来重塑和减少 4D 矩阵来实现这一点?

因此,您确定问题的方式绝对会发现准确性很差,而且您几乎无能为力。将单一情绪分配给视频(取决于您的语料库)通常不够准确,以至于任何机器学习算法都无法学习您试图提取的信号。

此外,您将问题定义为时间序列问题,这会让您的生活很头疼,尤其是当您使用现成的 sklearn 算法时,这些算法是非常不适合这种任务。

如果可能的话,您应该将您的问题描述为 computer vision 问题。您应该尝试在每个单独的帧上预测情感内容是什么。如果您没有具有这种粒度级别的数据集,您就不会看到很高的准确性。

这与您提出问题的方式有点不同,但您提出问题的方式是难以驾驭的。相反,这是您应该解决问题的方式:

  • 用情感内容标记单个帧
  • 训练基于图像的算法来对那些标记的帧进行分类

    • 对于任何基于图像的问题,如果您拥有适当大小的数据集,卷积神经网络可能会为您提供最佳性能
    • 如果这不是一个选项,您需要开发图像的一维特征表示。我个人建议使用 indico's 图像特征 API。一旦你有了这种表示,像 SVM 这样的典型算法就可以很好地工作。
  • 如果准确性不太符合您的喜好,但已经接近我的建议,我建议使用 pre-processing/data-augmentation 管道,如详细信息 here. 当然,该示例用于浮游生物识别,这是基本方法相同
  • 如果准确性仍然达不到要求,并且您需要对整个视频进行预测,那么您将需要汇总结果以提供整个视频的准确结果

    • 一种方法是在您对视频做出的预测图上训练卷积神经网络。这有点奇怪,但可能效果很好
    • 一个好的方法是使用贝叶斯方法,假设每个预测都有一定的置信度,并结合视频的预测分布。
    • 最好的方法是将其视为一个集成学习问题。幸运的是,集成学习是一个经过充分研究和理解的问题。您可以找到有关如何以这种格式组合多个预测的详细信息 here.

希望对您有所帮助!如果您还有其他问题,请告诉我。

免责声明:我是 indico 的 CEO,所以我在推荐它时可能会有偏见。