Доступ в Интернет

Распознавание по фотографии. Ищем и находим с помощью Картинок Google. Где найти и как установить расширение

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

Там все просто – у каждого браузера ( , Гугл и так далее) есть собственная страница для использования фотографий в качестве запроса.

Собственно, остается только указать исходное фото и начать искать соответствующие материалы.

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

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

Но мы подскажем вам 5 лучших вариантов, которые помогают найти что-либо по фотографии.

Cодержание:

Google Chrome

Это тот самый браузер, который по умолчанию есть на всех смартфонах и планшетах, работающих .

Существует, кстати, у Яндекса собственный браузер, так же, как у Гугл, но там нет такого же окна и таких функций, как показано на рисунке. Поэтому скачивать его нет смысла.

TinEye

А это уже специализированный сервис, созданный с целью дать возможность пользователям со всего мира искать информацию по фото.

Его знают многие профессиональные .

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

Чтобы использовать ее, сделайте вот что:

  1. Зайдите на официальный сайт (ссылка внизу). Страница ресурса автоматически адаптируется под ваше устройство, что достаточно важно.
  2. А дальше все предельно ясно – есть единственная кнопка и поле для ввода запроса. Если нажать на кнопку, появится новое окно, в котором следует указать расположение исходного файла. А поле для ввода предназначено для использования ссылок на фотографии. Если применяется второй подход, то есть вводится ссылка, нужно будет дополнительно нажать на пиктограмму в виде лупы.
  3. После этого произойдет процесс.

Примечательно, что у TinEye алгоритм совершенно отличается от того, что используется у Яндекса и Гугла.

В большинстве случаев результаты точнее отражают суть и больше отвечают ожиданиям пользователей. Так что вам обязательно следует попробовать воспользоваться данным сервисом.

Google Googles

Здесь речь идет о достаточно нестандартном приложении, которое ищет информацию не просто о каких-то картинках, а о тех местах, где вы находитесь, и вещах, которые вы видите.

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

После этого программа найдет всю доступную информацию по сфотографированному предмету.

Также стоит отметить, что в программе есть режим перевода с попутным распознаванием текста на фото.

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

Чтобы использовать Googles на смартфоне, сделайте вот что:

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

CamFind

А закрывает наш список еще одно приложение, которое работает по тому же принципу, что и Google Googles, но, в основном, ищет всевозможные товары в магазинах.

К примеру, вы можете сфотографировать какие-то очки от солнца или банку кефира и приложение тут же найдет всю информацию по этому товару.

Если это очки, то вы увидите цены в разных торговых сетях на них, разновидности, бренды и так далее.

В общем, для тех, кто постоянно занимается шопингом или просто регулярно покупают что-то в магазинах.

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

Использование этой программы тоже очень несложное и заключается в следующем:

  • сделайте фото;
  • дождитесь, пока произойдет идентификация;
  • смотрите на результаты.

Примечательно, что здесь можно перенести некоторые изображения в свою особую коллекцию (раздел «Favorites» ).

Твитнуть

Поищем вариант в большем разрешении. Открываем Картинки Google и нажимаем неприметную кнопку в строчке:

У нас будет выбор - указать ссылку на фотографию либо загрузить ее с компьютера. У меня картинка на жестком диске, поэтому я нажимаю Загрузить файл - Выберите файл - Открыть. Спустя некоторое время (картинка должна загрузиться на сервера Гугла) появится страница с результатами поиска:

Чтобы отфильтровать картинки по качеству, есть две ссылки - «Маленькие» и «Большие». Естественно, выберу «Большие «, чтобы увидеть наилучшее качество:

Разрешение картинки очень даже хорошее - 1920 на 1080 пикселей. Так что можно пройти по ссылке и скачать ее себе.

Итак, чтобы найти картинку в лучшем качестве, чем есть, надо указать ее адрес или загрузить с диска, затем нажать ссылку «Большие».

Поиск человека в интернете по фотографии

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

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

Конечно, такая удача не всегда выпадает. Картинки Google не могут найти фотографии из закрытых альбомов. В остальном это отличный способ узнать подлинность фотографии и/или определить, кто на ней.

Узнаем название вещи или пейзажа по фотографии

Существует программа под названием Google Goggles для iPhone и телефонов с операционной системой Android. Она позволяет переводить сфотографированный текст или определять название, находить информацию сфотографированного предмета или достопримечательности. Действительно замечательная штука, но версии для компьютеров нет. Отчасти это можно компенсировать с помощью того же поиска картинок Google .

Пример: у нас есть фотография пейзажа, но мы не знаем, что это за такое красивое место:

Как и в предыдущих вариантах, нажимаем кнопку в виде фотоаппарата в строке поиска, загружаем фотографию и получаем результат:

Предупреждаю - это работает не всегда. Для правильного результата эта фотография или очень похожая должна уже быть в базе поиска картинок Google, т.е. быть в интернете, также возле картинки на странице должно располагаться описание. Если достопримечательности можно легко узнать (т.к. известное место и в интернете «известно»), то с предметами шанс найти описание почти нулевой.

Если информации о месте нет, мы увидим страницу с похожими фотографиями по аналогии со следующим примером.

Раньше в этом был силен поисковик TinEye , как я уже рассказывал ранее. Но Картинки Google тоже не лыком шиты.

И нажимаем ссылку «Похожие изображения «. Напомню: можно не загружать фотографию, а указать ее адрес в интернете либо просто ввести в поиск запрос «рыжий котенок», навести стрелку мыши на фотографию и нажать «Похожие «.

В любом случае, эти действия приведут к поиску похожих фотографий:

Обратите внимание на надпись «Похожие» над картинками. Значит, сейчас работает этот режим. Нажатие на крестик справа выключит его. Щелчок по картинке откроет, как и следует, увеличенную копию на фоне сайта, где эта картинка находится.

Вывод

Поиск картинок Google всегда действует одинаково. В зависимости от того, что удалось найти, страница поиска меняется. При очень успешном результате, когда удается точно опознать название фотографии и найти информацию по ней, нас перекидывает на страницу поиска по тексту (как в случае с поиском достопримечательности).

Фактически, сайт поиска старается предугадать - что же нам нужно на самом деле. Иногда успешно, иногда нет. Разницы между приведенными выше примерами фактически нет. Поиск всегда происходит одинаково, просто мы смотрим в разные места поиска и нажимаем нужные нам ссылки. Я лишь привел самые «контрастные» примеры, поэтому не следует искать кнопочку «Поиск похожих фотографий» или «Поиск человека по фотографии». Их нет. Поиск всегда один. Все зависит лишь от того, что мы ищем.

Поиск картинок от Google - очень мощный инструмент благодаря множеству настроек и функций. Найти похожую картинку или страничку в социальной сети по фотографии человека - все возможно. Конечно, здесь есть много «но», потому что поиском занимаются сложные, но предсказуемые алгоритмы, а не настоящий интеллект. В любом случае умение пользоваться поиском по картинкам - полезный навык, которым следует овладеть каждым, кто пользуется интернетом.

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

Как найти дубли фотографии в интернете

Итак, у вас есть фото и вы желаете найти все его дубли в сети. Воспользуйтесь сервисами от Yandex или Google, либо отдельными программами.

Google

Алгоритм действий следующий:

  1. Перейдите по ссылке .
  2. В поисковой строке кликните по миниатюре фотоаппарата.

  3. Укажите ссылку на нужное фото или загрузите снимок со своего ПК.

  4. Кликните по ссылке “Все размеры” .

  5. Теперь отобразятся сайты, где встречается данное изображение.

    Yandex

    Аналогичный предыдущему сервису есть и у Яндекса:



    Tineye

    Еще один сервис для поиска по картинке — Тинай. Вместе с дублями фото он находит и их составляющие. У Tineye собрана собственная, крупнейшая база проиндексированных изображений. В ней найдется всё, и это не сарказм. Использовать его просто:



    FindFace

    Помимо онлайн-сервисов, существует специальная программа поиска по фотографии в интернете. ФайндФейс ищет странички людей в социальной сети ВКонтакте, на которых установлено похожее фото. Она работает онлайн, то есть, не требует установки на компьютер:


    На мое удивление, она действительно подобрала 30 страниц с максимально близкими к оригиналу лицами. Однако FindFace ищет людей только по России.

    Кстати, в Google Play можно загрузить приложение ФайндФейс для Android и использовать его с телефона.

    PhotoTracker Lite

    Чтобы быстрее искать похожие картинки по сервисам от Яндекса, Гугла и Тинай, установите расширение для браузера PhotoTracker Lite. Оно работает практически со всеми современными браузерами. Найти его можно в магазине расширений Chrome .

    После установки нужно кликнуть ПКМ по любой картинке в интернете и выбрать “Найти это изображение” .

    Заключение

    Теперь вы знаете, как найти дубликаты фото людей, предметов и других объектов в интернете.

1. Нам нужно оценить примерную часть смещений самим - хотя бы для ограниченного набора точек. StereoBM здесь не подойдет, поэтому нам нужен какой-то другой способ. Логичным вариантом будет использовать feature matching - найти какие-то особые точки в обоих кадрах и выбрать сопоставления. Про то, как это делается, можно почитать .
2. Когда у нас есть два набора соответствующих друг другу точек, мы можем закинуть их в findFundamentalMat , чтобы получить фундаментальную матрицу, которая понадобится нам для stereoRectifyUncalibrated.
3. Запускаем stereoRectifyUncalibrated, получаем две матрицы для ректификации обоих кадров.
4. И… а дальше непонятно. Выпрямленные кадры у нас есть, но нет матрицы Q, которая была нужна для завершающего шага. Погуглив, я наткнулся примерно на такой же недоумения пост , и понял, что либо я что-то упустил в теории, либо в OpenCV этот момент не продумали.

OpenCV: мы - 2:0.

4.1 Меняем план

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

Это все прекрасно, но вообще говоря, нам не нужно. Реальные размеры предметов интересовали бы нас, если бы наша модель использовалась потом для промышленных целей, в каких-нибудь 3d-принтерах. Но мы собираемся (эта цель слегка уже расплылась, правда) запихивать полученные данные в нейросети и им подобные классификаторы. Для этого нам достаточно знать только относительные размеры предметов. Они, как мы все еще помним, обратно пропорциональны смещениям параллакса - чем дальше от нас предмет, тем меньше смещается при нашем движении. Нельзя ли как-то найти эти смещения еще проще, просто каким-то образом сопоставив обе картинки?

Это замечательный алгоритм, который делает ровно то, что нам нужно. Кладем в него картинку и набор точек. Потом кладем вторую картинку. Получаем на выходе для заданных точек их новое положение на второй картинке (приблизительное, само собой). Никаких калибровок и вообще никаких упоминаний о камере - оптический поток, несмотря на название, можно рассчитывать на базе чего угодно. Хотя обычно он все-таки используется для слежения за объектами, обнаружения столкновений и даже дополненной реальности .

Для наших целей мы (пока) хотим воспользоваться «плотным» потоком Гуннара Фарнебака, потому что он умеет рассчитывать поток не для каих-то отдельных точек, а для всей картинки сразу. Метод доступен с помощью calcOpticalFlowFarneback, и первые же результаты начинают очень-очень радовать - смотрите, насколько оно выглядит круче, чем предыдущий результат stereoRectifyUncalibrated + stereoBM.


Большое спасибо замечательной игре Portal 2 за возможность строить собственные комнаты и играть в кубики. I"m doin" Science!

Код для для этой маленькой демонстрации

# encoding: utf-8 import cv2 import numpy as np from matplotlib import pyplot as plt img1 = cv2.imread("0.jpg", 0) img2 = cv2.imread("1.jpg", 0) def stereo_depth_map(img1, img2): # 1: feature matching orb = cv2.ORB() kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) src_points = np.vstack(.pt) for m in matches]) dst_points = np.vstack(.pt) for m in matches]) # 2: findFundamentalMat F, mask = cv2.findFundamentalMat(src_points, dst_points) # 3: stereoRectifyUncalibrated _, H1, H2 = cv2.stereoRectifyUncalibrated(src_points.reshape(src_points.shape[ 0], 1, 2), dst_points.reshape(dst_points.shape, 1, 2), F, img1.shape) rect1 = cv2.warpPerspective(img1, H1, (852, 480)) rect2 = cv2.warpPerspective(img2, H2, (852, 480)) # 3.5: stereoBM stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET, ndisparities=16, SADWindowSize=15) return stereo.compute(rect1, rect2) def optical_flow_depth_map(img1, img2): flow = cv2.calcOpticalFlowFarneback(img1, img2, 0.5, 3, 20, 10, 5, 1.2, 0) mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1]) return mag def plot(title, img, i): plt.subplot(2, 2, i) plt.title(title) plt.imshow(img, "gray") plt.gca().get_xaxis().set_visible(False) plt.gca().get_yaxis().set_visible(False) plot(u"Первый кадр", img1, 1) plot(u"Второй кадр (шаг вправо)", img2, 2) plot(u"stereoRectifyUncalibrated", stereo_depth_map(img1, img2), 3) plot(u"Первый кадр", optical_flow_depth_map(img1, img2), 4) plt.show()

Итак, отлично. Смещения у нас есть, и на вид неплохие. Как теперь нам получить из них координаты трехмерных точек?

4.2 Часть, в которой мы получаем координаты трехмерных точек

Эта картинка уже мелькала на одной из ссылок выше.

Расстояние до объекта здесь рассчитывается методом школьной геометрии (подобные треугольники), и выглядит так: . А координаты, соответственно, вот так: . Здесь w и h - ширина и высота картинки, они нам известны, f - фокусное расстояние камеры (расстояние от центра камеры до поверхности ее экрана), и B - камеры же шаг. Кстати, обратите внимание, что мы тут слегка нарушаем общепринятые названия осей, когда Z направлена вверх - у нас Z смотрит «вглубь» экрана, а X и Y - соответственно, направлены по ширине и высоте картинки.

Ну, насчет f все просто - мы уже оговаривали, что реальные параметры камеры нас не интересуют, лишь бы пропорции всех предметов изменялись по одному закону. Если подставить Z в формулу для X выше, то можно увидеть, что X от фокусного расстояния вообще не зависит (f сокращается), поэтому разные его значения буду менять только глубину - «вытягивать» или «сплющивать» нашу сцену. Визуально - не очень приятно, но опять же, для алгоритма классификации - совершенно все равно. Так что зададим фокусное расстояние интеллектуальным образом - просто придумаем. Я, правда, оставляю за собой право слегка изменить мнение дальше по тексту.

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

Настало время написать немного кода

import cv2 import numpy as np f = 300 # раз мы занимаемся визуализацией, фокус я все-таки подобрал так, чтобы сцена выглядела условно реальной B = 1 w = 852 h = 480 img1 = cv2.imread("0.jpg", 0) img2 = cv2.imread("1.jpg", 0) flow = cv2.calcOpticalFlowFarneback(img1, img2, 0.5, 3, 20, 10, 5, 1.2, 0) mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1]) edges = cv2.Canny(img1, 100, 200) result = for y in xrange(img1.shape): for x in xrange(img1.shape): if edges == 0: continue delta = mag if delta == 0: continue Z = (B * f) / delta X = (Z * (x - w / 2.)) / f Y = (Z * (y - h / 2.)) / f point = np.array() result.append(point) result = np.vstack(result) def dump2ply(points): # сохраняем в формат.ply, чтобы потом открыть Блендером with open("points.ply", "w") as f: f.write("ply\n") f.write("format ascii 1.0\n") f.write("element vertex {}\n".format(len(points))) f.write("property float x\n") f.write("property float y\n") f.write("property float z\n") f.write("end_header\n") for point in points: f.write("{:.2f} {:.2f} {:.2f}\n".format(point, point, point)) dump2ply(result)

Вот так выглядит результат. Надеюсь, эта гифка успела загрузиться, пока вы дочитали до этого места.


Для наглядности я взял не все точки подряд, а только границы, выделенные Canny-детектором

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

Из всех возможных поспешных выводов, которые можно было здесь сделать, этот оказался дальше всех от истины.

5. Часть, в которой ничего не получается

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

Выглядело это примерно так:


Лестница сминается, местами превращаясь в аморфный кусок непонятно-чего.

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

- сглаживать каринку с оптическим потоком: размытие по Гауссу, медианный фильтр и модный билатеральный фильтр, который оставляет четкими края. Бесполезно: предметы наоборот, еще сильнее расплывались.
- пытался находить на картинке прямые линии с помощью Hough transform и переносить их в неизменном прямом состоянии. Частично работало, но только на границах - поверхности по-прежнему оставались такими же искаженными; плюс никуда не получалось деть мысль в духе «а что если прямых линий на картинке вообще нет».
- я даже попытался сделать свою собственную версию оптического потока, пользуясь OpenCVшным templateMatching. Работало примерно так: для любой точки строим вокруг нее небольшой (примерно 10x10) квадрат, и начинаем двигать его вокруг и искать максимальное совпадение (если известно направление движения, то «вокруг» можно ограничить). Получилось местами неплохо (хотя работало оно явно медленнее оригинальной версии):


Слева уже знакомый поток Фарнебака, справа вышеописаный велосипед

С точки зрения шума, увы, оказалось ничуть не лучше.

В общем, все было плохо, но очень логично. Потому что так оно и должно было быть.


Иллюстрация к проблеме. Движение здесь - по-прежнему шаг вправо

Давайте выберем какую-нибудь зеленую точку из картинки выше. Предположим, мы знаем направление движения, и собираемся искать «смещенного близнеца» нашей зеленой точки, двигаясь в заданном направлении. Когда мы решаем, что нашли искомого близнеца? Когда наткнемся на какой-нибудь «ориентир», характерный участок, который похож на окружение нашей начальной точки. Например, на угол. Углы в этом отношении легко отслеживать, потому что они сами по себе встречаются довольно редко. Поэтому если наша зеленая точка представляет собой угол, и мы находим похожий угол в заданной окрестности, то задача решена.

Чуть сложнее, но все еще легко обстоит ситуация с вертикальной линией (вторая левая зеленая точка). Учитывая, что мы двигаемся вправо, вертикальная линия встретится нам только один раз за весь период поиска. Представьте, что мы ползем своим поисковым окном по картинке и видим однотонный фон, фон, снова фон, вертикальный отрезок, опять фон, фон, и снова фон. Тоже несложно.

Проблема появляется, когда мы пытаемся отслеживать кусок линии, расположенной параллельно движению . У красной точки нет одного четко выраженного кандидата на роль смещенного близнеца. Их много, все они находятся рядом, и выбрать какого-то одного тем методом, что мы пользуемся, просто невозможно. Это функциональное ограничение оптического потока. Как нас любезно предупреждает википедия в соответствующей статье, «We cannot solve this one equation with two unknown variables», и тут уже ничего не сделаешь.

Совсем-совсем ничего?

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

6. Зеленые точки FTW

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

Собственно, все оказалось вот так просто. Мы будем рассчитывать тот же самый оптический поток, но только для «зеленых», устойчивых точек. И кстати, в OpenCV о нас уже позаботились. Нужная нам штука называется поток Лукаса-Канаде.

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

С появлением поворотов координаты X и Z у нас смешиваются. Оставим старые формулы для расчета координат относительно камеры, и будем переводить их в абсолютные координаты следующим образом (здесь - координаты положения камеры, альфа - угол поворота):

(игрек - читер; это потому, что мы считаем, что камера не двигается вверх-вниз)

Где-то здесь же у нас появляются проблемы с фокусным расстоянием - помните, мы решили задать его произвольным? Так вот, теперь, когда у нас появилась возможность оценивать одну и ту же точку с разных углов, он начал иметь значение - именно за счет того, что координаты X и Z начали мешаться друг с другом. На самом деле, если мы запустим код, аналогичный предыдущему, с произвольным фокусом, мы увидим примерно вот что:


Неочевидно, но это попытка устроить обход камеры вокруг обычного кубика. Каждый кадр - оценка видимых точек после очередного поворота камеры. Вид сверху, как на миникарте.

К счастью, у нас все еще есть оптический поток. При повороте мы можем увидеть, какие точки переходят в какие, и рассчитать для них координаты с двух углов зрения. Отсюда несложно получить фокусное расстояние (просто возьмите две вышеприведенных формулы для разных значений альфа, приравняйте координаты и выразите f). Так гораздо лучше:


Не то что бы все точки легли идеально одна в другую, но можно хотя бы догадаться о том, что это кубик.

И, наконец, нам нужно как-то справляться с шумом, благодаря которому наши оценки положения точек не всегда совпадают (видите на гифке сверху аккуратные неровные колечки? вместо каждого из них, в идеале, должна быть одна точка). Тут уже простор для творчества, но наиболее адекватный способ мне показался таким:
- когда у нас есть подряд несколько сдвигов в сторону, объединяем информацию с них вместе - так для одной точки у нас будет сразу несколько оценок глубины;
- когда камера поворачивается, мы пытаемся совместить два набора точек (до поворота и после) и подогнать один к другому. Эта подгонка по-правильному называется «регистрацией точек» (о чем вы бы никогда не догадались, услышав термин в отрыве от контекста), и для нее я воспользовался алгоритмом Iterative closest point , нагуглив версию для питона + OpenCV;
- потом точки, которые лежат в пределах порогового радиуса (определяем методом ближайшего соседа), сливаются вместе. Для каждой точки мы еще отслеживаем что-то типа «интенсивности» - счетчик того, как часто она объединялась с другими точками. Чем больше интенсивность - тем больше шанс на то, что это честная и правильная точка.

Результат может и не такой цельный, как в случае с кубиками из Портала, но по крайней мере, точный. Вот пара воссозданных моделей, которые я сначала загрузил в Блендер, покрутил вокруг них камеру и сохранил полученные кадры:


Голова профессора Доуэля


Какая-то рандомная машина

Приложение

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

Вообще говоря, это ведь наверняка проблема не только зрения. Это скорее правило, а не исключение - наши сенсоры не всемогущи, они постоянно воспринимают информацию об объекте частями - но любопытно, насколько все подобные случаи можно объединить в какой-то общий фреймворк? Скажем (возвращаясь к зрению), ваши глаза сейчас постоянно совершают мелкие и очень быстрые движения - саккады - перескакивая между предметами в поле зрения (а в промежутках между этими движениями ваше зрение вообще не работает - именно поэтому нельзя увидеть собственные саккады, даже уставившись в зеркало в упор). Мозг постоянно занимается упорной работой по «сшиванию» увиденных кусочков. Это - та же самая задача, которую мы только что пытались решить, или все-таки другая? Восприятие речи, когда мы можем соотнести десяток разных вариантов произношения слова с одним его «идеальным» написанием - это тоже похожая задача? А как насчет сведения синонимов к одному «образу» предмета?

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

Очевидные соображения говорят, что когда мы пытаемся воссоздать какую-то штуку, увиденную в природе, нет смысла слепо копировать все ее составные части. Чтобы летать по воздуху, не нужны машущие крылья и перья, достаточно жесткого крыла и подъемной силы; чтобы быстро бегать, не нужны механические ноги - колесо справится гораздо лучше. Вместо того, чтобы копировать увиденное, мы хотим найти принцип и повторить его своими силами (может быть, сделав это проще/эффективней). В чем состоит принцип интеллекта, аналог законов аэродинамики для полета, мы пока не знаем. Deep learning и Ян Лекун, пророк его (и вслед за ним много других людей) считают, что нужно смотреть в сторону способности строить «глубокие» иерархии фич из получаемых данных. Может быть, мы сможем добавить к этому еще одно уточнение - способность объединять вместе релевантные куски данных, воспринимая их как части одного объекта и размещая в новом измерении?

Теги: Добавить метки

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

Также некоторое подобие таких онлайн сервисов и программ доступно и для простых пользователей, их можно найти в сети интернет. В качестве примера можно привести программу Lenovo Veriface. Это фирменная встроенная утилита, которая позволяет разблокировать устройство проводя анализ по лицу.

Как работает поиск по лицам

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

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

Программы распознавания лиц

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

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

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

FindFace

FindFace – российская программа распознавания лиц, мощное решение, которое позволит распознать лицо на фотографии. FindFace предлагает не только инструменты для обычных пользователей, но и для государственных корпораций и бизнеса. С его помощью можно найти человека, зарегистрированного в Вконтакте.

С 1 сентября общедоступный сервис Финд Фейс останавливает работу, пользоваться некоторое время им смогут только те пользователи, которые приобрели ПРО-аккаунт. Затем авторы полностью откажутся от общедоступной версии в пользу своего коммерческого продукта.

Google Images

Поиск Google.Картинки позволяет найти идентичные фотографии на основе данных поисковых систем, в том числе осуществить поиск человека по лицу. Больше ориентирован на поиск в зарубежных ресурсах :


Яндекс Картинки

Отечественный аналог предыдущего сервиса, который поможет найти человека по фотографии в интернете и произвести поиск по фото в соц.сетях:


Pictriev

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