Почтовый сервер для [закрытого] тестирования JavaMail

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

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

Вверху самые быстрые алгоритмы; внизу самый медленный (хотя и более точный). Вы можете пропустить медленные, если хорошее совпадение будет найдено на более быстром уровне.

  • на основе хэша файла (md5, sha1 и т. Д.) Для точных дубликатов
  • перцептивное хеширование (phash) для масштабированных изображений
  • на основе признаков (SIFT) для модифицированных изображений

У меня очень хорошие результаты с phash. Точность хороша для измененных изображений. Это не подходит для (воспринимаемых) модифицированных изображений (обрезанных, повернутых, зеркальных и т. Д.). Чтобы справиться со скоростью хэширования, мы должны использовать дисковый кеш / базу данных для поддержки хэшей для стога сена.

Действительно хорошая вещь в phash заключается в том, что после создания вашей хеш-базы данных (которая для меня составляет около 1000 изображений в секунду), поиск может быть очень и очень быстрым, особенно когда вы можете хранить всю хеш-базу данных в памяти. , Это довольно практично, поскольку хеш составляет всего 8 байтов.

Например, если у вас есть 1 миллион изображений, то потребуется массив из 1 миллиона 64-битных значений хеш-функции (8 МБ). На некоторых процессорах это помещается в кэш L2 / L3! В практическом использовании я видел сравнение corei7 со скоростью более 1 Гига-хамм / с, это только вопрос пропускной способности памяти для процессора. База данных с 1 миллиардом изображений полезна для 64-битного ЦП (требуется 8 ГБ ОЗУ), и поиск не будет превышать 1 секунды!

Для модифицированных / обрезанных изображений это может показаться не зависящим от преобразования признаком / детектором ключевых точек, например SIFT - это путь. SIFT будет производить хорошие ключевые точки, которые будут обнаруживать кадрирование / поворот / зеркальное отражение и т. Д. Однако сравнение дескриптора очень медленное по сравнению с расстоянием Хэмминга, используемым phash. Это серьезное ограничение. Необходимо выполнить множество сравнений, поскольку максимальное сравнение дескриптора IxJxK с поиском одного изображения (I = num изображений стога сена, J = целевые ключевые точки на изображение стога сена, K = целевые ключевые точки на изображение иглы).

Чтобы обойти проблему скорости, я попытался использовать phash вокруг каждой найденной ключевой точки, используя размер / радиус элемента для определения под прямоугольника. Хитрость в том, чтобы заставить это работать хорошо, состоит в том, чтобы увеличить / уменьшить радиус, чтобы генерировать различные подчиненные уровни (на изображении стрелки). Обычно первый уровень (немасштабированный) будет соответствовать, однако часто требуется еще несколько. Я не уверен на 100%, почему это работает, но я могу представить, что это позволяет функциям, которые слишком малы для работы phash (phash уменьшает размер изображения до 32x32).

Другая проблема заключается в том, что SIFT не будет оптимально распределять ключевые точки. Если есть участок изображения с большим количеством краев, ключевые точки будут сгруппированы там, и вы не получите ничего в другой области. Я использую GridAdaptedFeatureDetector в OpenCV для улучшения распределения. Не уверен, какой размер сетки лучше, я использую маленькую сетку (1x3 или 3x1 в зависимости от ориентации изображения).

Возможно, вы захотите масштабировать все изображения стога сена (и иголки) до меньшего размера до обнаружения объекта (я использую 210px вдоль максимального размера). Это уменьшит шум на изображении (всегда проблема для алгоритмов компьютерного зрения), а также сосредоточит детектор на более заметных особенностях.

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

Детектор ключевых точек, вероятно, работает лучше всего, когда он возвращает меньше, чем количество функций, которые вы хотели. Например, если вы просите 400 и получаете 300 обратно, это хорошо. Если вы каждый раз получаете 400 обратно, вероятно, некоторые хорошие функции нужно было упустить.

Изображение иглы может иметь меньше ключевых точек, чем изображения стога сена, и при этом получать хорошие результаты. Добавление большего количества данных не обязательно принесет вам огромный выигрыш, например, при J = 400 и K = 40 мой коэффициент попадания составляет около 92%. При J = 400 и K = 400 частота попаданий увеличивается только до 96%.

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

10
задан Ry- 11 May 2014 в 00:08
поделиться

4 ответа

Зарегистрируйте учетную запись Gmail, а затем используйте настройки там. Дополнительную информацию см. На этой странице:

http://mail.google.com/support/bin/answer.py?hl=ru&answer=13287

Это дает вам SMTP-сервер.

6
ответ дан 3 December 2019 в 13:44
поделиться

Вы смотрели Apache James ? Это почтовый сервер Java, что означает, что вы можете временно запустить его как часть настройки модульного теста (и, очевидно, отключить его впоследствии)

10
ответ дан 3 December 2019 в 13:44
поделиться

Предоставляет ли ваш интернет-провайдер бесплатную почтовую службу ? Тот, который разрешает отправку только с одного из их IP-адресов?

Не знаю, что такое поддержка SMTP Auth в JavaMail, но вы можете использовать smtp Gmail, если у вас есть учетная запись.

0
ответ дан 3 December 2019 в 13:44
поделиться

Мне нужна «настоящая» тестовая конечная точка, поэтому я посмотрю на Джеймса, но мог бы кое-что сделать более легкий.

Ранее я использовал Mock JavaMail, который вы добавляете в свой путь к классам, и он работает как почтовое хранилище в памяти для всех учетных записей и сообщений. https://mock-javamail.dev.java.net/

7
ответ дан 3 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: