¿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.