Мне просто интересно. Я новичок здесь, поэтому, пожалуйста, подумайте о моем несколько нообском вопросе.
Предположим, я делаю приложение для 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.
Когда вы обнаруживаете ключевые точки, вы не можете сделать это с помощью FREAK. Но, как описано в документе FREAK, вы должны обнаружить ключевые точки с помощью FAST-детектора угла, а затем описать его с помощью FREAK. Если вы хотите распознавать объекты с помощью дескрипторов ORB, вы должны использовать ORB для обоих, для обнаружения ключевых точек и для описания. Обратите внимание, что обнаружение точки ORB также может быть основано на FAST. Вы можете изменить его, изменив параметр scoreType
из документации OpenCV. Когда вы используете андроид, вы можете установить этот параметр, как описано здесь
О двоичных дескрипторах строк. Я также нуждался в них, чтобы реализовать дескриптор-сопряжение с запросом 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>
Итак, как я проверил, правильно ли эти дескрипторы:
Таким образом, двоичные дескрипторы, связанные с ключевыми точками, будут выглядеть так:
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
Надеюсь, поможет!