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

Nuzhny

Пользователи
  • Количество публикаций

    1 350
  • Зарегистрирован

  • Посещение

  • Days Won

    167

Nuzhny last won the day on March 17

Nuzhny had the most liked content!

Репутация

221 Эксперт

2 подписчика

О Nuzhny

  • Звание
    Эксперт

Profile Information

  • Пол
    Мужской
  • Расположение
    Санкт-Петербург

Посетители профиля

3 759 просмотров профиля
  1. Детектирование глаз

    А в Raspberry можно же воткнуть тот же Intel compute stick и для запуска на нём сеток?
  2. О, тут всё зависит от задачи, для каждой свои рецепты. Шум может быть самый разный: если человек стоит на фоне лестницы, то HOG его не задетектит, потому что градиенты на границе будут ужасными. Такой сэмпл в обучающей выборке тоже будет типа выбросом, который сместит разделяющую гиперплоскость в совсем не ту сторону. Линейный SVM используется потому что быстрый. Тут есть два подхода: либо тщательно подобрать features vector (или сделать для него преобразование типа PCA, PLS....) и использовать линейный SVM или использовать SVM с RBF. Для той же детекции пешеходов используют HOG с линейным SVM, потому что скорость критична.
  3. Тут фишка немного в другом. Я уже говорил, что SVM чувствителен к шуму, особенно линейный. Несколько выбросов могут очень сильно сдвинуть разделяющую гиперплоскость в сторону. Как это можно решить? 1. Можно использовать нелинейный SVM (с RBF ядром, например). Он попытается адаптироваться не только к линейно неразделимым данным, но ещё и к выбросам тоже. Минус нелинейного SVM - он очень медленный. 2. Или же устранить выбросы. Например как? Например, перейти в другое пространство, где этих выбросов практически не будет. Самый простой способ - это PCA (метод главных компонент). Обычно берут многомерный вектор, делают PCA, а после берут оттуда только те компоненты, сумма значений которых составляет 95% от всех данных. То есть откидывают 5% самых малозначащих данных, которые чаще всего являются шумами. Часто получается, что эти 95% важных данных содержат в себе 10-20% компонент. Эта штука фактически представляет собой способность к обобщению и отлично работает с линейно разделимыми данными и устраняет исключительно шумы. Что представляет собой PCA в плане изображений - это силуэт, основные черты. То есть своё изображение по нему ты восстановить не сможешь, но будет точно понятно, что это изображение, например, является силуэтом человека. Ты мог видеть такие статьи ге есть усреднённое лицо человека европейской расы или среднее лицо женщины - это всё PCA. Есть и нелинейные преобразования, позводялющие уменьшить размерность данных и при этом улучшить работу классификатора, например PLS (partial least squares). Вот отличная статья по этому поводу: "Vehicle Detection using Partial Least Squares" Они добавляют к HOG кучу других фич типа симметрии, делают огрочный features vector, а потом его сильно сокращают с помощью PLS и подают его на линейный SVM. Посмотри на рисунок 5 в статье, как данные стали намного лучше линейно разделяться. Что получаем по производительности. 1. На этапе обучения нам надо: 1.1. "Обучить" - построить преобразование в новое пространство с помощью PCA или PLS: из картинок извлечь feature vector'а размера N, слепить их в один большой и вычислить параметры нового многомерного пространства размера N. Выделить значимое подпространство размера M < N. Сохранить. 1.2. Обучить уже классификатор (SVM) на новых feature vector'ах размера M: вычисляем по картинке HOG, применяем к нему PCA, берём M первых значений результирующего вектора. Обучаем на этих данных SVM и сохраняем. 2. Этап распознавания: 2.1. Загружаем PCA и SVM. 2.2. Берём изображение, считаем HOG, применяем PCA, берём M первых значений результирующего вектора, подаём в SVM. Профит! У нас получается, что SVM обучается быстрее и работает тоже, но добавляется умножение на матрицу NxN. В каждом конкретном случае можем получить как ускорение, так и замедление процесса.
  4. Почему удивительно? SVM чувствителен к шуму, тот же PCA или PLS отлично помогают с этим бороться.
  5. Детектирование глаз

    LexaP, а этот проект не смотрел? Концепция выглядит очень разумно
  6. 1. DPM - Deformable Parts Model. Я когда-то использовал реализацию из libccv, но в OpenCV тоже появилась. Смысл в том, чтобы не просто детектировать объект, но и его части и тот факт, что части расположены в пространстве корректно. Например для лица: можно найти просто лицо, а можно лицо и на нём глаза, рот и нос. Если на лице найдены все эти части, то вероятность правильности решения выше. DPM ставит ещё одно условие: как все эти части должны быть расположены на целом и друг относительно друга: - глаза в верхней части лица, выше носа и рта, а также не друг над другом; - нос в средней части лица, под глазами и над ртом; - рот ниже всех и примерно посередине. 2. CoHOG - Co-occurrence histograms of oriented gradients. Придумана Тошибой и использовалась (используется?) для аппаратного детектирования пешеходов в автомобилях. Там берутся не просто линейно гистограммы, как в HOG, а ещё и учитывается их взаимное расположение, молучается 2D матрица гистограмм.
  7. Так я же выше написал: CoHOG, DPM - это всё как раз про "манипуляции перед отправкой в SVM"
  8. Так, кажется мы говорим немного о разном. Есть HOG - это гистограмма ориентированных градиентов (здесь неплохо описано). Грубо говоря, кусочек изображения разбивается на квадраты (например, 16х16 пикселей), в каждом считаются градиенты (это вектор с углом и длиной), из векторов делают гистограммы, обычно из 9 бинов. Соответственно, кусочку изображения ставится в соответствие несколько таких гистограмм, по числу квадратов. Всё, это HOG. В алгоритме трекинга STAPLE как раз считаются HOG для объекта (fHOG - это быстрый способ вычислять HOG на CPU), а дальше ищется корреляция на следующем кадре. Никакого SVM! Есть такие признаки, как ICF (integral channel feature), которые тоже состоят из HOG в том числе (там ещё серый канал и один цветовой). Пётр Доллар использует их на GPU для детекции пешеходов и лиц, но в качестве классификатора берёт random forest (кажется). Тоже никакого SVM! Dlib на этот счёт не ковырял, но в том же OpenCV можно вполне себе считать HOGDescriptor и подавать его на любой классификатор. Или добавлять к нему любые другие фичи и подавать на любой классификатор уже такой расширенный вектор. Возможно, что тебя смущает тот факт, что Dalal в своей изначальной статье 2005 года изначально использовал HOG и linear SVM, но так это для скорости! Тогда компьютеры были медленные, только Haar или LBP + AdaBoost взлетало. А в библиотеки решение HOG + linear SVM пошло потому что оно SOTA, базовое классическое решение, с которым сравнивают алгоритмы. P.S. Сейчас уже нейросети практически вытеснили HOG + linear SVM из компьютерного зрения. А были перспективные направления развития типа CoHOG или DPM.
  9. Почему нет? По моей ссылке выше HOG вообще никак не связан с SVM, а используется сам по себе.
  10. Детектирование глаз

    1. На каком расстоянии и какой размер глаз в пикселях будет на кадре? Глаз - это точка или протяжённый объект? 2. Можно детектировать landmark'и какой-нибудь нейросеткой ( например отсюда ), а потом трекать их, сглаживая погрешности детектора.
  11. Похоже на morphsnakes.
  12. На счёт скорости. Есть fhog, который, вроде как, как раз очень быстро считает HOG. Он есть в dlib, гуляет и просто в исходниках. Например, только вчера видел его здесь.
  13. Тебе в качестве декодера в ffmpeg надо указать dxva2. MSMF его и использует, поэтому получается быстрее. Кажется, что лучше используовать ffmpeg напрямую, что все и делают в критических по производительности приложениях.
  14. ffmpeg сам по себе может что-то и не уметь, если его специально не собрали с поддержкой этого аппаратного ускорения. Хотя логично было бы его включать для интеловских процессоров. Если у тебя есть просто собранный отдельно ffmpeg (или скачанный), то можешь посмотреть, что он умеет и повыбирать разные кодеки из командной строки. Например, команда "ffmpeg -hwaccels" выведен список доступных аппаратных кодеков.
×