Jump to content
Compvision.ru

Nuzhny

Пользователи
  • Content count

    1,360
  • Joined

  • Last visited

  • Days Won

    167

Nuzhny last won the day on March 17

Nuzhny had the most liked content!

Community Reputation

222 Эксперт

2 Followers

About Nuzhny

  • Rank
    Эксперт

Profile Information

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

Recent Profile Visitors

3,835 profile views
  1. Формат форума обычно подразумевает описание проблемы, а потом коллективно ищется решение. Такой формат не подходит?
  2. Каскад Хаара

    Лучше 80х80. Далее идёт детекция через cv::CascadeClassifier::detectMultiScale, где можно подобрать правильный коэффициент скейла. Тренироваться может долго, но тут никуда не деться. В плане альтернатив из коробки есть ещё SVM+HOG, но это будет уже медленнее Хаара.
  3. Каскад Хаара

    Если размер объекта у тебя никогда не будет меньше 100 пикселей, то можно ставить минимальный размер и больше, чем 20х20, тут проблем у меня не было. P.S. В OpenCV 4 тренировка каскадов уже depricated, а opencv_createsamples удалена из сборки. Фактически есть, но закомментирована и, если включить, не собирается из-за чистки старого API. Так что надо подумать, насколько необходимо использовать каскады Хаара в будущем.
  4. Да, косяков там достаточно, это старый мой код, которому уже больше 10 лет: люди "распадаются" на части и т.д. Но она на тот момент предназначалась для детекции движения и определения оставленных предметов и с этим справлялась. Сумка становится сиреневой - это как раз момент, когда вышел заданный таймаут (там он установлен секунд в 15 для наглядности) и объект считается фоном. Даже если сумку унесут, рамка какое-то время будет на этом месте, чтобы сотрудник безопасности обратил на это внимание.
  5. 1. Цвет учитывается в большинстве методов. Есть только нюанс: почти везде работа ведётся с цветными изображениями так, как будто они состоят из равноправных цветовых каналов. Например, для MOG2 из opencv_video нет разницы, подашь ему RGB, BGR или HSV. Хоть там и есть возможность детектирования теней (detectShadowGMM), но оно совсем не будет работать, если подать неправильную картинку. А некоторые методы изначально ориентированы на то же детектирование теней, что очень востребовано, если надо считать автомобили или людей, а не просто их детектировать. Про текстуры и контуры я не в курсе, не слышал. 2. Длительное присутствие или детекция оставленных объектов, как мне кажется, требует самостоятельной модификации метода и принципиально не может быть реализовано силами алгоритма вычитания фона. Если он может адаптироваться к изменению фона, то рано или поздно адаптируется к любому изменению. Если не может адаптироваться, то со временем накопится такое количество ложных пикселей заднего плана, что всё станет белым. Когда я занимался этой проблемой, то сделал что-то типа самопального MOG, у которого не было возможности самостоятельной адаптации. После вычитания фона отрабатывал трекер объектов и их распознавание. Если объект был маленький (а надо было детектировать только большие) и неподвижный, то включалась адаптация внутри этого объекта. Если объект был большой и неподвижный, то адаптация не включалась. Также она не включалась, если объект был распознан, как пешеход или автомобиль. Далее был интервал в несколько минут, в течение которого неподвижный объект считался оставленным. Объект неподвижен, скажем, минуту - адаптируем фон под него и выдаём оператору, что обнаружен оставленный предмет. Если долго был неподвижен автомобиль, то просто адаптируем фон под него. Если же распознавание не использовалось, то просто адаптируем фон для всех объектов после истечения некоторого интервала. Вот как это примерно выглядело для видео с PETS 2006: сумка из зелёной сначала становится красной, а потом сиреневой. 3-4. Это тоже делалось вручную, но с внешними наворотами. Для всех систем видеонаблюдения полезно иметь алгоритм саботажа или порчи камеры: засветка, расфокусировка, закрытие объектива и т.п. То есть такой детектор работает независимо от детектора движения и в случае обнаружения неполадок отдаёт команду детектору движения, по которой он переинициализируется. Кажется, что силами алгоритма вычитания фона это тоже не так просто сделать. Одно время появился закрытый и запатентованый алгоритм vibe, который был и очень быстрым и точным. Через некоторое время патент кончился и его автор бельгийский профессор открыл исходники. Кажется, они уже есть в bgslibrary. Можно начать с него.
  6. Да, здесь есть реализация и статья-обзор нескольких десятков методов вычитания фона. Там намного больше всего, чем есть в OpenCV и лучше структурированы. И не надо забывать про базовый videoio - там тоже кое-что есть проверенное временем. А чего хочется от вычитания фона? Может, просто написать тестовое окружение и посмотреть на результаты, выдаваемые каждым алгоритмом?
  7. Да, должно работать. Утверждать ничего не буду, но обычно копируется весь кадр. Посмотри, как это делается в ffmpeg: функция dxva2_transfer_data. Там лочится поверхность, что означает копирование всего содержимого из видео в системную память (указатель в LockedRect содержится). А потом уже из системной памяти копируется куда надо. Трудно сказать, что будет происходить на Атоме, почему там такая высокая загрузка на этой операции. Когда лочится поверхность, находящаяся в видеопамяти дискретной видеокарты, то память копируется с помощью DMA, минуя процессор. То есть мы получаем задержку, но процессор остаётся свободен. Тут же дискретной видеокарты нет и память просто копируется из системной в системную? Я не знаю.
  8. Можно написать декодер ручками на fmpeg и подключить фильтр для получения motion vectors: пример. Только кажется, что игра не стоит свеч: есть работы по детектору движения и трекингу на основе этих векторов, мы сами в АМД пробовали их использовать. Но их качество очень плохое для применения именно в этих целях. И очевидно почему: цельку кодека является не поиск истинного движения или изменений в кадре, а минимизация сжимаемой информации. То есть ему выгодней найти ложные вектора движения блоков, если они в результате дадут меньше передаваемой информации.
  9. Распознавание неба

    Я соглашусь с mult1plexer, сейчас нейросети дадут результат быстрый и устойчивый. Можно начать с U-net, для бинарной сегментации небо-не небо зайдёт хорошо и будет работать быстро. К тому же ему не нужен огромный датасет. Если же хочется классического компьютерного зрения, то всё будет сложнее. Но это точно не уход в серый с градиентами. Я бы всё равно собрал небольшой датасет, обучил бы на нём очень быстрый decision tree из OpenCV, а дальше watershed. Decision tree можно обучать как просто на цвете пикселя, так и градиент туда добавить, если хочется.
  10. Распознавание неба

    Надо искать небо исключительно на одном этом фото? Или задача стоит более обшно? А облака относятся к небу? Небо может быть розовым-закатным, пасмурным, вечерним, со звёздами? Оно будет на каждом изображении гарантировано? Или могут быть изображения без неба? Странный подход, когда отбрасывается вся цветовая информация, казалось бы, небо голубое и это можно использовать. Я бы начал разработку с классики: создания и разметки наиболее поного датасета. Тогда проблема станет видна во всей своей красе.
  11. Детектирование глаз

    А в Raspberry можно же воткнуть тот же Intel compute stick и для запуска на нём сеток?
  12. О, тут всё зависит от задачи, для каждой свои рецепты. Шум может быть самый разный: если человек стоит на фоне лестницы, то HOG его не задетектит, потому что градиенты на границе будут ужасными. Такой сэмпл в обучающей выборке тоже будет типа выбросом, который сместит разделяющую гиперплоскость в совсем не ту сторону. Линейный SVM используется потому что быстрый. Тут есть два подхода: либо тщательно подобрать features vector (или сделать для него преобразование типа PCA, PLS....) и использовать линейный SVM или использовать SVM с RBF. Для той же детекции пешеходов используют HOG с линейным SVM, потому что скорость критична.
  13. Тут фишка немного в другом. Я уже говорил, что 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. В каждом конкретном случае можем получить как ускорение, так и замедление процесса.
  14. Почему удивительно? SVM чувствителен к шуму, тот же PCA или PLS отлично помогают с этим бороться.
  15. Детектирование глаз

    LexaP, а этот проект не смотрел? Концепция выглядит очень разумно
×