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

2expres

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

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

  • Посещение

  • Days Won

    3

Сообщения, опубликованные пользователем 2expres


  1. Возьми сборку зераное https://ffmpeg.zeranoe.com/builds/

     качаешь 2 архива shared и dev перед этим выбрав 32 или 64 бит. В архиве dev хранятся библиотеки (.lib) и include. Архив shared содержит необходимые .dll которые необходимо будет переписать в папку с вашей будущей программой - это для Windows. 


  2. В 28.08.2019 at 21:11, Nuzhny сказал:

    а для начала просто поиграть со встроенными функциями из OpenCV

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

    Проверил практически, создал картинку из 2-х цветов. Затем осветлил и затемнил, получив еще 2 картинки. Результаты: 

    Method 0 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1 / 0.974776 / -0.000545 / -0.000545
    Method 1 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0 / 0.221103 / 1.3576 / 1.3576
    Method 2 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1.3576 / 1.3576 / 0 / 0
    Method 3 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0 / 0.0956222 / 1 / 1

    Т.е. гистограммы картинок абсолютно не похожи, но картинки то похожи по цвету! 

    1.png.76a356d56b92994e6bf1a02b0e19decd.png

    2.png.5e78b7bec2e179eba6a3ec5a2ac572be.png

    3.png.2adbf281ac987de1cdc3bf513be0b342.png

    Я сделал вывод, что сравнение на подобие картинок с помощью гистограмм в OpenCV не работает, можно сравнивать, только абсолютно одинаковые картинки.

    Буду проверять свою следующую методику:

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


  3. В 24.08.2019 at 22:50, Nuzhny сказал:

    Самый простой и быстрый  способ, который используется в том числе в particle filter - это сравнение гистограмм.

    Нужный, спасибо за развернутый ответ. Заинтересовала работа с гистограммами цветов. На практике столкнулся с трудностями, даже правильное определение цвета авто не такое простое дело.

    Честно, запутался в интегралах, расстояниях Кульбака-Лейблера и Бхатачарья. Интересует сравнение двух гистограмм на подобие. Беру примитивный пример: картинка из двух цвета. Из первой картинки делаю вторую, меняя контрастность (можно яркость). Их гистограммы приведены на рисунке.

    gistogramm.JPG.9dcb016507da42596fa858ea2530ccf1.JPG

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


  4. 16 часов назад, Smorodov сказал:

    Используется еще вектор скорости. Предполагается что объекты инертны, и векторы скорости быстро не меняют.

    Ну еще копайте разные фильтры Кальмана и иже с ними.

    Фильтры Калмана также исходят из этого предположения. Для авто это может и подходит, для людей нет. Пример: спортсмен под номером 2 догоняет номер 1 и два объекта некоторое время находятся вместе, затем один обгоняет другого. Фильтр Калмана даст однозначный результат, что это номер 2. А это не всегда так, номер 1 мог ускорится.
     Другой пример у меня в видео по теме. Сцена на которой артисты или танцоры. Их траектории движений абсолютно не предсказуемы.
     Нужны признаки объекта по которым их можно различать.


  5. Тема старая, но интересная. Сейчас продолжаю тему "Трекинг человека". 
     На всех видео выше камера закреплена, поэтому можно применить детектор движения, в котором кадры сравниваются с предварительно вычисленным задним фоном - BackGround. Фон адаптируется сравнением с кадром, если интенсивность кадра больше фона, то к фону добавляем константу, меньше - отнимаем. Чем больше константа, тем быстрее обновляется фон. Я выбрал 0,5 и при 25 кадрах в секунду у меня фон полностью обновляется через 10-20 сек (зависит от контрастности кадров).Если изображение 3-канальное (R,G,B), то и BackGround также должен иметь 3 канала.
     Каждый поступающий кадр вычитаю с фоном, возвожу в квадрат и суммирую по 3 составляющим. Суммарную разницу сравниваю с константой-порогом, больше порога - объект, меньше - фон. Получаю бинарное черно-белое изображение, которое сегментирую. При сегментации использую третью константу-минимальное количество точек в сегменте, которая зависит от поставленной задачи. Хотя для слежения за пешеходами можно дополнительно применять и размеры сегмента, причем высота должна быть больше, чем ширина.
     Выполняю привязку полученных сегментов к объектам. Для этого сравниваю таблицу объектов с таблицей сегментов и по минимальному расстоянию делаю назначения. Все просто, если объекты разделены и не пересекаются. Сложности начинаются, когда объекты сходятся в один объект, а затем расходятся, при этом путается нумерация объектов.
     Получается, что нужно предварительно вычислить какие-то признаки объектов, по которым я их мог бы различать. Как это можно сделать, желательно примитивным способом и с высоким быстродействием?   


  6. 4 часа назад, Nuzhny сказал:

    Также можно в каждом объекте хранить его модель движения: в простейшем виде это просто скорость: сколько пикселей за 1 кадр он проходит по Х и по У.

    Многое стало понятно, введу максимальную скорость перемещения объекта, что позволит отсекать глюки.

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


  7. 28 минут назад, Smorodov сказал:

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

    Рад Вас видеть!

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

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

    3 часа назад, Nuzhny сказал:

    Ну, результаты детекции выглядят очень неплохо. Просто применить классический венгерский алгоритм разве не получится? В качестве метрики между объектами использовать расстояние Жаккарда (IoU) - отношение пересечения прямоугольников к объединению. Кажется, что работать будет и быстро, и точно

    Спасибо Nuzhny за Ваши ответы!

    Можно для меня разжевать? Мне действительно не понятно. Венгерский алгоритм - это задача о оптимизации.  После обработки кадра из 3 МБайт(Full HD) информации я получаю массив не более 256 байт (1 объект 16 байт), поэтому могу позволить сделать не оптимально. Хочу понять суть. Получается я должен сравнить 2 соседних кадра. Предположим на 1-кадре 4 сегмента, а на 2 кадре тоже 4 сегмента. Я должен назначить назначить привязку сегментов к объектам. На первом кадре назначаю номер сегмента равным номеру объекта. На втором кадре допустим для простоты (выбор метрики сейчас не важен можно площадь пересечения или как предлагают по ссылке искать коэффициенты https://cyberleninka.ru/article/v/algoritm-trekinga-obektov-v-realnom-vremeni-s-obrabotkoy-oshibok) ищу минимальное расстояние между центрами сегментов и объектов. Далее присваиваю сегменту номер ближайшего объекта. С этим понятно. Понятно, если появился или исчез объект на краях кадра. А что делать, если появился или исчез сегмент в центре кадра? Как определить это глюк, или 2 человека рядом дошли до середины сцены и разделились? Или наоборот зашли с разных концов сцены и объединились?

     


  8. Выполнил включение освещение сцены чисто по детектору движения, без трекинга. Камера работает в ИК-диапазоне. Для управления освещением использовал midi-протокол (библиотека rtmidi), виртуальный драйвер midi, который управляет освещением сцены (стандартная программа QLC+). На видео Вы можете видеть квадрат на полу, который имитирует размеры люстры.  Вот что получилось:

    Обрабатываются все 25 кадров в секунду.

     

    В 04.06.2019 at 14:00, Nuzhny сказал:

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

    Хотелось бы реализовать трекинг. Но приведенная ссылка является научной статьей, у которой еще 50 ссылок на другие статьи. Мне необходимо усреднять 5 соседних кадров для устранения дерганий и пропадания объекта. Как правильно это сделать?


  9. 1 час назад, LexaP сказал:

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

    Это видео облегченные условия. Здесь прекрасно работает мой детектор движения. Но значительно быстрее, обрабатывает 25 кадров с загрузкой 15%. Но с резким изменением освещенности он не работает.

     

    • Like 1

  10. 8 минут назад, Nuzhny сказал:

    Очевидно, что классическое вычитание фона тут не справится, потому что оно смотрит на изменение интенсивности пикселей. Первая мысль - избавиться от цвета, то есть перейти в цветовое пространство типа HSV или Lab, а далее работать исключительно с каналом интенсивности (V или L). Далее использовать dense optical flow, например Farneback, получить поле векторов. Далее это поле уже сегментировать (kmeans или что-то сложнее). Результатом сегментации должны стать уже блобы и фон.

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

    kmeans - тормознутый алгоритм, а нужен реал-тайм.

    5 минут назад, LexaP сказал:

    К сожалению скачать ролик с ютуба не могу, пишет запрещен доступ.

    Могу сбросить на почту. Напишите в личку.


  11. 12 минуты назад, LexaP сказал:

    я бы поступил банальным образом.

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

    Пример как это у меня работает (на arm)

    А можно ли вашу программу запустить на этом видео? Если работает - могу дать Вам контакты заказчика.


  12. 1 час назад, Nuzhny сказал:

    То есть никакого детектора нет? Есть возможность снимать камерой с датчиком глубины? Или камерой в ИК диапазоне?

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

    Я сам пришел к выводу, что нужна камера в ИК-диапазоне, но нужно несколько дней доставка/установка/запись видео. Но остается теоретический вопрос, можно ли построить детектор движения с обычной камерой в таких условиях?


  13. Потолок этого помещения состоит из множества разноцветных люстр и прожекторов. Когда человек перемещается необходимо управлять освещением и подсвечивать человека. Трудность состоит в том, что для детектора движения невозможно создать background из-за постоянно изменяющегося освещения. Для любого объекта, который перемещается в кадре, нужно вычислять координаты и управлять освещением. Людей может быть много, они могут уходить и приходить.


  14. Добрый день!

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

     


  15. 1. Это студенческая задача?

    2. Это одно изображение или есть множество таких изображений?

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


  16. 53 минуты назад, Nuzhny сказал:

    Физический смысл очень просто: когда качается ветка или провод, то прямоугольник получается большим, а самого объекта в нём очень мало. Если плотность больше некоторого небольшого alpha, то объект реальный. Иначе отбрасывать.

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

    58 минут назад, Nuzhny сказал:

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

    Я выбрал максимальный битрейд 15 000 кбит/сек и 25 кадров в секунду для FULL HD, так как хочу получить максимальное качество. Реально в диспетчере задач вижу загрузку ~1000 кбит/сек.

    1 час назад, Nuzhny сказал:

    не успевает декодер - можно попробовать другой, лучше аппаратный;

    Я использую DXVA2. Еще могу d3d11. Разницы между ними не увидел. Чем они отличаются?

    Так как я работаю на ассемблере, то декодер выполнил в виде загружаемой *.dll. Декодер меняться не будет, он на все случаи жизни.

    1 час назад, Nuzhny сказал:

    у тебя однопоточное приложение

    Я запускаю 6 потоков: декодер, управляющий поток и 4 потока обработки кадров, т.к. в Intel Atom Z8350 имеет 4 ядра. Декодер заполняет одну из 4 областей памяти и передает сообщение (setenent) управляющему потоку. Управляющий поток дает разрешение на обработку в один из 4 обработчиков. По окончании обработки обработчик передает сообщение в управляющий поток.


  17. В 30.03.2019 at 11:55, Nuzhny сказал:

    Можно написать декодер ручками на fmpeg и подключить фильтр для получения motion vectors: пример.

    Только кажется, что игра не стоит свеч: есть работы по детектору движения и трекингу на основе этих векторов, мы сами в АМД пробовали их использовать.

    Вы оказались правы получается много векторов и смысла их использовать для детектора движения нет, потому что это получается не быстро. Следуя заветам Смородова резко сократил объем информации, проредив кадр в 4 раза по высоте и 4 раза по ширине. Причем, прореживаю по ширине методом суммирования пикселей, чтобы иметь максимальную информацию о кадре (на быстродействии это не сказывается). Из последовательности сокращенных в 16 раз кадров формирую фон. Фон формируется за ~ 25 сек (600 кадров). Каждый кадр сравнивается с фоном, производится корректировка фона и получаю изображение разницы с фоном. Разница сегментируется. Если в сегменте меньше 1000 пикселей (исходное 16 000 пикселей), то такой сегмент отбрасывается. Для больших сегментов получаем прямоугольники, которые рисую на картинке. В этих прямоугольниках в дальнейшем буду искать автомобильные номера, что резко сократит объем обрабатываемой информации. Так как у меня примитивный детектор движения, получаю ложные срабатывания когда ветер качает ветки деревьев. Можно ли простыми методами от этого избавится?

     

    Изображение с FFmpeg я получаю (почему то?) в формате NV12. Преобразовывать в RGB это все время. Поэтому я использую для детектора движения интенсивность (оттенки серого) и таблицу цветов, для быстрого вывода на экран использую только интенсивность. Для определения номеров цветность не нужна.

    Итого: Intel Atom Z8350 загрузка процессора около 15%!

    Камера Full HD иногда дает глюки, на видео видно (1 мин 16 сек). Я думал что это из-за моих преобразований на FFmpeg. Подключив VLC этих глюков там как бы не больше. С чем это может быть связано?


  18. Основная проблема у Вас - неравномерное освещение. Вам нужно использовать бестеневую лампу, чтобы на изображении не было бликов. Далее нужно бинаризировать изображение с помощью адаптивного порога (я использовал 17х17 -8). После удаления мелких сегментов можно по вертикальным линиям определить масштаб (сколько пикселей в одном мм) изображения. Зная масштаб можно определить размеры измеряемой детали. Результат после бинаризации.:

    5cc7ff52ca15f_25042019_174434_2.thumb.png.a96d5bfb14348a8d5a337a0a63c6a3f0.png


  19. В 30.03.2019 at 11:55, Nuzhny сказал:

    подключить фильтр для получения motion vectors

    Nuzhny спасибо!!! Для получения motion vectors нужно использовать av_frame_get_side_data. Работает ли фильтр, если кадры декодированы аппаратно с dxva2? Я подключил dxva2 для декодирования h.264 (Загрузка процессора близка к 0). Но копирование из памяти dxva2  в память процессора av_hwframe_transfer_data занимает много процессорного времени (до 70% INTEL ATOM Z8350 на Full HD). Занимает ли этот фильтр много времени? Для меня основной смысл в применения motion vectors - это высокое быстродействие детектора движения. Я хочу применить его для обнаружения движущегося автомобиля в кадре.

    P.S. Можно из dxva2 переписывать не весь кадр, а часть кадра?


  20. Для создания потока h.264 внутри камеры работает кодер на основе детектора движения, который отлавливает изменения между кадрами. Декодер восстанавливает кадры. Как можно получить информацию с декодера об изменениях в кадре?


  21. 11 час назад, Nuzhny сказал:

    Например, команда "ffmpeg -hwaccels" выведен список доступных аппаратных кодеков.

    Мне для аппаратного декодирования нужен qsv (Intel Quick Sync Video). Но на сайте ffmpeg читаю: 

    • Ensure the target machine has a supported CPU. Current versions only support gen8/gen9 graphics on expensive CPUs ("Xeon"/"Core i" branding). The same graphics cores on cheaper CPUs ("Pentium"/"Celeron"/"Atom" branding) are explicitly disabled, presumably for commercial reasons.

    Т.е. для Pentium и процессоров ниже отключена аппаратная поддержка по коммерческим причинам. 

    cv::CAP_MSMF - не работает с rtsp потоком (Хотя Microsoft Media Foundation вроде ж должна поддерживать).

    Что применить???


  22. В 29.01.2019 at 09:25, Nuzhny сказал:

    Попробуй принудительно изменить backend у capture: CAP_FFMPEG, CAP_DSHOW или CAP_VFW. Они выбираются по очереди, какой первый подойдёт. Возможно, что у тебя первый в списке как раз не аппаратный.

    У меня процессор Intel Pentium n3710 с графическим ядром INTEL HD GRAPHICS. Если верить данной таблице https://www.wikizero.com/en/Intel_Graphics_Technologyто данное графическое ядро позволяет декодировать 2k 30 кадров в секунду. 

    Открываю файл 1080p, кодек h264  с принудительно заданным backend ffmpeg:
    cv::VideoCapture  cam( "2.mp4", cv::CAP_FFMPEG);
    Загрузка процессора от 25 до 60%.
    Открываю данный файл, используя Microsoft Media Foundation:
    cv::VideoCapture  cam( "2.mp4", cv::CAP_MSMF);
    Загрузка процессора от 10 до 25%. Почему так происходит?! Насколько я читал ffmpeg использует аппаратное декодирование.

  23. 10 минут назад, Nuzhny сказал:

    Слишком всё это в отрыве от современных тенденций в индустрии.

    Я понимаю, что сейчас в моде применение нейронных сетей и обучение. Но любой метод имеет свои плюсы и недостатки. Так же и мой подход (сегментация+контурный анализ) имеет свои плюсы и минусы. Мне требуются качественные кадры не хуже чем в папке Короля. Но я на этой папке тестировал  https://www.openalpr.com/cloud-api.html 

    Это современная программа на нейронных сетях. Очень классно определяет едва видимые номера (высота символов до 6 пикселей). Но на папке Короля, она хватило сил проверить только по букве А (~634  фото) она правильно определила 87%. Со средним временем определения 600 мс на их сервере. Создалось впечатление, что она может видеть едва различимые номера и пропустить явный номер. 

    Применение своего метода вижу в 3-х вариантах:

    1) Дополнение к "серьезной" программе для улучшения показателей.

    2) Распознавание номера внутри камеры (Смарт-камера), например, на Intel Atom Z8350.

    3) Недорогое решение для парковок, моек, стоянок с камерой за 50 баксов и сервером за 80 баксов https://ru.aliexpress.com/item/Z83II-Mini-PC-Windows-10-Intel-Atom-X5-Z8350-Quad-Core-2-4G-5-8G-WiFi/32843080625.html?spm=a2g0v.search0302.3.10.3dc52b62XmAJcN&ws_ab_test=searchweb0_0,searchweb201602_0_10084_10083_10887_10307_321_453_322_454_10902_10618_536_10065_317_537_10068_319_10059_10103_10884_10696,searchweb201603_0,ppcSwitch_0&algo_pvid=fb3d334a-aa48-40f5-a05c-df0e49103814&algo_expid=fb3d334a-aa48-40f5-a05c-df0e49103814-1 

     

×