¿Modelo de entrenamiento de Markov oculto para gestos dinámicos?

Sé que hay mucho material relacionado con el modelo oculto de Markov y también he leído todas las preguntas y respuestas relacionadas con este tema. Entiendo cómo funciona y cómo puede entrenarse, sin embargo, no puedo resolver el siguiente problema que tengo al intentar entrenarlo para un simple gesto dinámico.

estoy usandoImplementación HMM para OpenCVHe mirado en preguntas y respuestas hechas anteriormenteaquí. Lo que realmente me ha ayudado a entender y usar los modelos de Markov.

Tengo un total de dos gestos dinámicos, que son simétricos (deslizar hacia la izquierda y deslizar hacia la derecha). Hay un total de 5 observaciones en las que 4 son las diferentes etapas en el gesto y la quinta es una observación cuando no ocurre ninguna de estas etapas.

El gesto de deslizar hacia la izquierda consta de la siguiente observación: 1-> 2-> 3-> 4 (que debería activar un estado de deslizamiento hacia la izquierda) Del mismo modo, el gesto de deslizar hacia la derecha consiste en la siguiente observación: 4-> 3-> 2-> 1

Tengo 25 secuencias. Estoy tomando 20 observaciones para cada una de las secuencias, que se utilizan para entrenar el modelo de Markov oculto utilizando el algoritmo de Baum-Welch.

La siguiente es la secuencia de entrada:

1 0 1 1 0 2 2 2 2 0 0 2 3 3 3 0 0 4 4 4 
4 4 4 4 4 0 3 3 3 3 3 0 0 1 0 0 1 1 0 1 
4 4 4 4 4 4 0 3 3 3 3 3 0 0 1 0 0 1 1 0 
4 4 4 4 4 4 4 0 3 3 3 3 3 0 0 1 0 0 1 1 
1 1 1 1 0 2 2 2 0 1 0 3 3 0 0 0 4 4 4 4 
1 1 1 1 1 0 2 2 2 0 1 0 3 3 0 0 0 4 4 4 
0 1 1 1 1 1 0 2 2 2 0 1 0 3 3 0 0 0 4 4 
0 0 1 1 1 1 1 0 2 2 2 0 1 0 3 3 0 0 0 4 
4 4 0 0 3 0 3 3 3 3 0 0 0 0 0 1 1 1 1 1 
4 4 4 0 0 3 0 3 3 3 3 0 0 0 0 0 1 1 1 1 
4 4 4 4 0 0 3 0 3 3 3 3 0 0 0 0 0 1 1 1 
1 1 1 1 0 0 2 2 0 3 2 3 3 3 0 0 4 4 4 4 
1 1 1 1 1 0 0 2 2 0 3 2 3 3 3 0 0 4 4 4 
1 1 1 1 1 1 0 0 2 2 0 3 2 3 3 3 0 0 4 4 
1 3 4 4 4 0 3 0 0 0 0 0 3 2 0 0 1 1 1 1 

En esta secuencia puede ver el patrón de los gestos Deslizar a la izquierda y Deslizar a la derecha.

Para entrenar el modelo de Markov oculto, lo estoy iniciando con los siguientes valores y luego llamando a la función de tren para obtener la salida:

TRANS:
0.7 0.15 0.15
0.3 0.4 0.3
0.3 0.4 0.3

EMIS:
0.3 0.1 0.1 0.1 0.1
0.2 0.1 0.2 0.2 0.3
0.2 0.3 0.2 0.2 0.1

INIT:
0.6 0.2 0.2

Después de entrenar la salida es:

TRANS:
0.81611 0.0847926 0.0990979
0.398458 0.346433 0.255109
0.371391 0.35587 0.272739

EMIS:
0.534127 0.125568 0.0824495 0.200169 0.0576869
0.294653 0.0250053 0.0500311 0.200616 0.429694
0.238808 0.075001 0.0500019 0.130455 0.505733

INIT:
0.443984 0.391323 0.164693

Al usar este modelo en mi programa de reconocimiento, no estoy obteniendo resultados. Quiero que el sistema permanezca en un estado nulo a menos que se detecte uno de los gestos. En la matriz Transición y Emisión, di mis valores de conjetura para ambos gestos.

¿Qué crees que podría estar haciendo mal? ¿Algún puntero o ayuda?

Por último, aquí está el código que estoy usando para hacer esto (si alguien quiere echarle un vistazo)

double TRGUESSdata[] = {0.7, 0.15, 0.15,
                            0.3, 0.4, 0.3,
                            0.3, 0.4, 0.3};
    cv::Mat TRGUESS = cv::Mat(3,3,CV_64F,TRGUESSdata).clone();
    double EMITGUESSdata[] = {0.3, 0.1, 0.1, 0.1, 0.1,
                              0.2, 0.1, 0.2, 0.2, 0.3,
                              0.2, 0.3, 0.2, 0.2, 0.1};
    cv::Mat EMITGUESS = cv::Mat(3,5,CV_64F,EMITGUESSdata).clone();
    double INITGUESSdata[] = {0.6 , 0.2 , 0.2};
    cv::Mat INITGUESS = cv::Mat(1,3,CV_64F,INITGUESSdata).clone();
    std::cout << seq.rows << " "  << seq.cols << std::endl;
    int a = 0;
    std::ifstream fin;
    fin.open("observations.txt");

    for(int y =0; y < seq.rows; y++)
    {
        for(int x = 0; x<seq.cols ; x++)
        {

            fin >> a;
            seq.at<signed int>(y,x) = (signed int)a;
            std::cout << a;
        }
        std::cout << std::endl;
    }

     hmm.printModel(TRGUESS,EMITGUESS,INITGUESS);
    hmm.train(seq,1000,TRGUESS,EMITGUESS,INITGUESS);
    hmm.printModel(TRGUESS,EMITGUESS,INITGUESS);

Aquí se usa la aleta para leer la observación que tengo de mi otro código.

Respuestas a la pregunta(1)

Su respuesta a la pregunta