Распознавание изображений – представление двоичного дескриптора в Mat – OpenCV Android

Мне просто интересно. Я новичок здесь, поэтому, пожалуйста, подумайте о моем несколько нообском вопросе.

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

Я нахожусь на том этапе, где уже обработал изображения, извлекли некоторые функции из изображения. Набор изображений происходит только из одного здания, где он должен распознавать конкретные объекты, представляющие интерес (разные окна, изображения, артефакты, вне здания). Таким образом, это закрытый домен, и я могу предоставить достаточно изображений объектов под разными углами. Я планирую обучить нейронную сеть и предоставить ее приложению вместо алгоритма сопоставления изображений.

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

Desc1 Desc2 Desc3 Desc4 DescN......... Class _________________________________________________________________________________ Picture 1 0.121 0.923 0.553 0.22 0.28 "object1" Picture 2 0.22 0.53 0.54 0.55 0.32 .........."object1" (different scale, angle) Picture 3 .... ... ... ... .. .........."object2" Picture N Picture N+1 

Поэтому я могу отнести его к нейронной сети для обучения, однако я застрял, поскольку я понятия не имею, как двоичная функция / дескриптор, представленная в Matrice (Class Mat – openCV). И как я буду продолжать нормализовать эти двоичные дескрипторы, поэтому я могу накормить его в Neural Net (Multi-Layer Perceptron) для обучения. (Даже псевдокод сильно помог)

    Я не могу дать полный ответ на ваш вопрос, потому что я не знаком с Neuronal Networks, но я могу дать вам несколько идей о двоичном представлении дескрипторов ORB.

    1. Когда вы обнаруживаете ключевые точки, вы не можете сделать это с помощью FREAK. Но, как описано в документе FREAK, вы должны обнаружить ключевые точки с помощью FAST-детектора угла, а затем описать его с помощью FREAK. Если вы хотите распознавать объекты с помощью дескрипторов ORB, вы должны использовать ORB для обоих, для обнаружения ключевых точек и для описания. Обратите внимание, что обнаружение точки ORB также может быть основано на FAST. Вы можете изменить его, изменив параметр scoreType из документации OpenCV. Когда вы используете андроид, вы можете установить этот параметр, как описано здесь

    2. О двоичных дескрипторах строк. Я также нуждался в них, чтобы реализовать дескриптор-сопряжение с запросом MySQL. Поскольку Mat в OpenCV-java имеет только представление с двумя дескрипторами, я внедрил метод для преобразования их в двоичный. Для этой цели Матрица дескрипторов должна быть преобразована в List<Double> . И вы можете использовать мою функцию для получения двоичного представления дескрипторов. Функция вернет List<String> .

    Вот код:

     public static List<String> descriptorToBinary(List<Double> desc){ List<String> binary_desc = new ArrayList<String>(); String desc_bin= ""; for(int i = 0; i < desc.size(); i++){ String binary_str_tmp = Integer.toBinaryString((int)((double)desc.get(i))); if (binary_str_tmp.length() < 16) { int number_of_zeros = 16 - binary_str_tmp.length(); String str_tmp = ""; for(int t = 0; t < number_of_zeros; t++){ str_tmp += "0"; } binary_str_tmp = str_tmp + binary_str_tmp; } desc_bin+= binary_str_tmp; binary_desc.add(final_binary_str); } return binary_desc; } 

    MatOfKeyPoint список строк будет иметь тот же размер, что и список MatOfKeyPoint если вы преобразуете его в List<KeyPoint>

    Итак, как я проверил, правильно ли эти дескрипторы:

    1. Я сопоставил оригинальные дескрипторы Mat с совпадением Bruteforce Hamming, как было сказано в документе ORB
    2. Я зарегистрировал дистанции, возвращаемые соглашением.
    3. Затем я рассчитал расстояния между дескрипторами строк одного и того же изображения.
    4. Проверено, были ли расстояния Хэмминга opencv такими же, как расстояния между дескрипторами String. Они были одинаковыми, поэтому преобразование из Mat в List было хорошо выполнено.

    Таким образом, двоичные дескрипторы, связанные с ключевыми точками, будут выглядеть так:

     Picture 1: object1 keypoint1 : 512bit binary descriptor (1s and 0s) keypoint2 : 512bit binary descriptor keypoint3 : 512bit binary descriptor ... Picture 2: object2 keypoint1 : 512bit binary descriptor keypoint2 : 512bit binary descriptor keypoint3 : 512bit binary descriptor ... 

    Теперь о Multi-Layer Perceptron. Я не могу с этим поделать. Вот почему я сказал в начале, что мой ответ неполный. Но я надеюсь, что комментарии, которые я дал, помогут вам в будущем решить вашу проблему.

    Вместо того, чтобы пытаться реализовать классификатор с нуля. Вы рассматривали HaarTraining ?. Вы можете обучить его обнаружению нескольких объектов в изображении.

    Тем не менее, процесс обучения длительный.

    http://note.sonots.com/SciSoftware/haartraining.html

    Надеюсь, поможет!

    Intereting Posts
    Android SDK приложение не удалось загрузить библиотеку Как найти браузер по умолчанию на Android-устройстве Получение ОДИНОЧНОГО курсора с полными именами и номерами телефонов Обнаружить прикосновение к растровому изображению Может ли служба Android использовать два интерфейса для связи? Android-notifyDataSetChanged не работает на BaseAdapter Могу ли я остановить HTTPResponseCache, работая как общий кэш в отношении заголовков Cache-Control? Android: Почему обработчики отправляют runnable? Обновление приложения для Android-разработчика Все фрагменты ViewPager ссылаются на один и тот же RecyclerView и / или Adapter CursorAdapter backed ListView удаляет анимацию «мерцает» при удалении Заменить или удалить существующее значение в Accessibility EditText Node в android Что такое отдельная инструментальная цепочка? Глубинные ссылки Android, не связанные с префиксом пути Пользовательский шрифт в заголовке вкладки ActionBar