Скрытая Марковская Модель Тренинга для Динамических Жестов?

Я знаю, что есть много материалов, связанных со скрытой марковской моделью, и я также прочитал все вопросы и ответы, связанные с этой темой. Я понимаю, как это работает и как его можно обучить, однако я не могу решить следующую проблему, возникающую при попытке обучить его простому динамическому жесту.

я используюРеализация HMM для OpenCV Я изучил ранее заданные вопросы и ответилВот, Что действительно помогло мне понять и использовать марковские модели.

Всего у меня есть два динамических жеста, которые оба симметричны (проведите пальцем влево и вправо) Всего существует 5 наблюдений, в которых 4 являются различными этапами в жесте, а 5-е - это наблюдение, когда не происходит ни одного из этих этапов.

Жест смахивания влево состоит из следующего наблюдения: 1-> 2-> 3-> 4 (которое должно вызывать состояние смахивания влево) Аналогичным образом жест смахивания вправо состоит из следующего наблюдения: 4-> 3-> 2-> 1

У меня 25 последовательностей. Я беру 20 наблюдений для каждой последовательности, которые используются для обучения скрытой марковской модели с использованием алгоритма Баума-Уэлча.

Ниже приведена последовательность ввода:

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 

В этой последовательности вы можете увидеть шаблон для жестов Swipe влево и Swipe вправо.

Чтобы обучить скрытую марковскую модель, я инициализирую ее следующими значениями, а затем вызываю функцию train, чтобы получить вывод:

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

После тренировки получается:

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

Используя эту модель в моей программе распознавания, я не получаю результаты. Я хочу, чтобы система оставалась в состоянии NULL, если один из жестов не обнаружен. В матрице Перехода и Выброса я дал свои предположительные значения для обоих этих жестов.

Как ты думаешь, что я могу делать не так? Любые указатели или помощь?

Наконец, вот код, который я использую для этого (если кто-то хочет посмотреть)

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);

Здесь fin используется для чтения наблюдения, полученного мной из моего другого кода.

Ответы на вопрос(1)

Ваш ответ на вопрос