Перейти к содержимому
Compvision.ru
DenisN03

Обработка результатов работы НС Enet загруженного через OpenCVна языке Java.

Recommended Posts

Создаю андроид программу которая с использованием opencv(dnn) загружает модель нейронной сети Enet и производит сегментацию входного изображения. Все идет гладко до обработки полученных результатов. На языке python обработка производится довольно просто - в цикле проходимся по матрице пикселей и в зависимости от значения присваиваем ему цвет. В java все не так: после работы возвращается объект типа Mat со следующими параметрами:

res = Mat [ -1*-1*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0x7f3e56fff160, dataAddr=0x7f3e44806000 ]
res.total() = 1036800
res.channels() = 1
res.size() = 6x1
res.dims() = 4
res.cols() = -1
res.rows() = -1

Более того если все таки достать(http://answers.opencv.org/question/175676/javaandroid-access-4-dim-mat-planes/) значения пикселей из полученного результата то они не соответствуют ожиданиям. Т.е. каждому классу соответствует число например если 5 классов то возвращаются числа от 0 до 4(так работает на python). Здесь же мне возвращаются числа вида: -26.287221908569336, -14.588539123535156, -7.386473655700684, 1.4765703678131104, 15.550891876220703. 

Кто нибудь знает как преодолеть данную проблему? Почему объект Mat возвращает не те значения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Argmax(-26.287221908569336, -14.588539123535156, -7.386473655700684, 1.4765703678131104, 15.550891876220703)=4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 Я нашел функцию которая обрабатывает результат, но она для языка С++. Можете подсказать как ее преобразовать в Java?

static void colorizeSegmentation(const Mat &score, Mat &segm)
{
    const int rows = score.size[2];
    const int cols = score.size[3];
    const int chns = score.size[1];

    Mat maxCl = Mat::zeros(rows, cols, CV_8UC1);
    Mat maxVal(rows, cols, CV_32FC1, score.data);
    for (int ch = 1; ch < chns; ch++)
    {
        for (int row = 0; row < rows; row++)
        {
            const float *ptrScore = score.ptr<float>(0, ch, row);
            uint8_t *ptrMaxCl = maxCl.ptr<uint8_t>(row);
            float *ptrMaxVal = maxVal.ptr<float>(row);
            for (int col = 0; col < cols; col++)
            {
                if (ptrScore[col] > ptrMaxVal[col])
                {
                    ptrMaxVal[col] = ptrScore[col];
                    ptrMaxCl[col] = (uchar)ch;
                }
            }
        }
    }

    segm.create(rows, cols, CV_8UC3);
    for (int row = 0; row < rows; row++)
    {
        const uchar *ptrMaxCl = maxCl.ptr<uchar>(row);
        Vec3b *ptrSegm = segm.ptr<Vec3b>(row);
        for (int col = 0; col < cols; col++)
        {
            ptrSegm[col] = colors[ptrMaxCl[col]];
        }
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это попиксельный argmax по слоям выходной матрицы, с последующей раскраской. 

Не знаю как на java будет, давно не использую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×