Все больше кажется, что 90% мыслей в неразвлекательном инфополе это пересказанные абстракты научных статей
В тему недавнего поста про бенчмарки: создатели CLIP замерили, что модель может обучиться для победы на бенчмарке, однако не стать лучше на самом деле
https://openai.com/blog/clip/
https://openai.com/blog/clip/
# Video as timeseries, video as picture
С вами рубрика "велосипеды от Бориса" и сегодня мы будем изобрать мою следующую научную статью.
Нет времени объяснять, давайте обрабатывать видео с помощью неиронок.
Возьмем такое видео с ютуба:
https://www.youtube.com/watch?v=mcEZ2cV6WIg
Видео это последовательность кадров. Возьмем кадры с частотой 5 FPS и засунем в конволюционную неиронную сеть MobileNetV3, у которой убран классификатор. Неиронная сеть предобучена на ImageNet, то есть её научили различать 1000 различных классов на картинке: породы собак, самолеты, все такое прочее.
Что выдает нейронная сеть для каждой картинки? Она выдает вектор из 1280 чисел, где каждое число это какая-то информация, нужная для классификации. Какие-то числа могут обозначать "котистость" изображения, другие "куда смотрит объект на фото" или, например, "есть ли на картинке террористы". Мы не знаем, что именно значат эти числа, можем только догадываться. Но мы точно знаем, что эта информация очень полезна, емко описывает картинку и по ней можно очень многое сказать. По сути неиронная сеть берет изображение размерности [очень много X дофига] и сжимает до маленького вектора, отфильтровав ненужное и оставив только полезную информацию. Подобно как мы описывая фильм сжиаем полтора часа контента до фразы "ну очередной фильм со Стетхемом" почти без потери полезной информации. В дальнейшем будем называть выдаваемый нейронной сетью вектор просто "фичи" (features).
Революционная идея: а давайте вытащим фичи из всех кадров видео, а потом составим их вместе. Было N векторов фичей по 1280, станет матрица [Nx1280]. Тогда первая строка этой матрицы будет, например, зависимостью котистости (первой фичи) от времени. Иначе говоря, получаем представление видео в виде 1280-мерного временного ряда неведомых нейронных смыслов.
С вами рубрика "велосипеды от Бориса" и сегодня мы будем изобрать мою следующую научную статью.
Нет времени объяснять, давайте обрабатывать видео с помощью неиронок.
Возьмем такое видео с ютуба:
https://www.youtube.com/watch?v=mcEZ2cV6WIg
Видео это последовательность кадров. Возьмем кадры с частотой 5 FPS и засунем в конволюционную неиронную сеть MobileNetV3, у которой убран классификатор. Неиронная сеть предобучена на ImageNet, то есть её научили различать 1000 различных классов на картинке: породы собак, самолеты, все такое прочее.
Что выдает нейронная сеть для каждой картинки? Она выдает вектор из 1280 чисел, где каждое число это какая-то информация, нужная для классификации. Какие-то числа могут обозначать "котистость" изображения, другие "куда смотрит объект на фото" или, например, "есть ли на картинке террористы". Мы не знаем, что именно значат эти числа, можем только догадываться. Но мы точно знаем, что эта информация очень полезна, емко описывает картинку и по ней можно очень многое сказать. По сути неиронная сеть берет изображение размерности [очень много X дофига] и сжимает до маленького вектора, отфильтровав ненужное и оставив только полезную информацию. Подобно как мы описывая фильм сжиаем полтора часа контента до фразы "ну очередной фильм со Стетхемом" почти без потери полезной информации. В дальнейшем будем называть выдаваемый нейронной сетью вектор просто "фичи" (features).
Революционная идея: а давайте вытащим фичи из всех кадров видео, а потом составим их вместе. Было N векторов фичей по 1280, станет матрица [Nx1280]. Тогда первая строка этой матрицы будет, например, зависимостью котистости (первой фичи) от времени. Иначе говоря, получаем представление видео в виде 1280-мерного временного ряда неведомых нейронных смыслов.
Я попробовал делать что-то с этим представлением, например искать по нему ключевые фреймы. Если взять точки изменения этого временного ряда, а так же точки между точками изменения, получается неплохой набор фреймов для короткого саммари видео. Этакое сжатие видео в 10 фреймов. Оно конечно не учитывает смысловое наполнение, то есть не делает саммари содержащее самую важную часть видео (чем занимается раздел Video Summarization в DL), а просто делает примерно по фрейму на сцену.
Кроме этого я ничего с таким представлением не придумал, поэтому перешел ко второй идее.
Кроме этого я ничего с таким представлением не придумал, поэтому перешел ко второй идее.
Другой способ посмотреть на матрицу [Nx1280]: это ведь черно-белое изображение! Получилось, что мы сжали видео до картинки.
Все фичи от нейронок отмасштабируем так, чтобы все координаты были между 0 и 1 (изначально это могут быть любые числа) и выведем изображение для нашего видео
Все фичи от нейронок отмасштабируем так, чтобы все координаты были между 0 и 1 (изначально это могут быть любые числа) и выведем изображение для нашего видео
Во-вторых, прямо на глаз можно увидеть много паттернов. Сложно сказать, что это за паттерны, но видно, когда на видео что-то меняется. Например до 200-с-чем-то фрейма идет вступление и полоски все горизонтальные и одинаковые.
Давайте посмотрим на такое же изображение, полученное для куска из 15 секунд этого видео.
Самое главное: если взять это изображение, наложить на изображение полного видео и двигать слева направо, то рано или поздно они полностью совпадут.
По этой картинке легко можно понять, что она часть картинки выше
Самое главное: если взять это изображение, наложить на изображение полного видео и двигать слева направо, то рано или поздно они полностью совпадут.
По этой картинке легко можно понять, что она часть картинки выше
Я очень долго пялился на эти красные полоски. Здесь явно что-то можно раскопать про интерпретируемость неиронок и про их избыточность. Но я так и не придумал что.
Однако схожесть представления для куска видео и для полного видео выглядит очень круто. Дело в том, что есть открытая проблема Content-Based Video Retrieval: узнаем из какого полного видео взят короткий кусок видео. Именно из-за нерешенности этой проблемы мы не можем вбить в гугл порно-гиф и узнать, из какого она видео. Или например поэтому у нас нет шазама для фильмов. В целом применения ограниченные, а задача сложная, поэтому этой задачей мало кто занимается. Но меня она не отпускает с 1 курса магистратуры.
Итак: мы получили скукоженное до небольшой картинки представление видео, позволяющее понять, из какого полного видео тот или иной кусок видео. Причем так как это фичи из неиронок, опирающиеся на смысловое наполнение кадра, изображения не будут особо меняться даже если видео исказить, наполнить шумом, зашакалить компроссией, итд. То есть мы получили даже устойчивое представление видео.
Я стал думать как сделать из этого систему для CBVR. Типичное решение: вытаскиваем ключевые кадры, кладем в базу данных. Из короткого видео на входе таким же образом вытаскиваем ключевые кадры, ищем их в базе данных. Если находим много похожих кадров, причем они идут друг за другом так же как в коротком видео, то у нас метч и поиск успешен.
Однако схожесть представления для куска видео и для полного видео выглядит очень круто. Дело в том, что есть открытая проблема Content-Based Video Retrieval: узнаем из какого полного видео взят короткий кусок видео. Именно из-за нерешенности этой проблемы мы не можем вбить в гугл порно-гиф и узнать, из какого она видео. Или например поэтому у нас нет шазама для фильмов. В целом применения ограниченные, а задача сложная, поэтому этой задачей мало кто занимается. Но меня она не отпускает с 1 курса магистратуры.
Итак: мы получили скукоженное до небольшой картинки представление видео, позволяющее понять, из какого полного видео тот или иной кусок видео. Причем так как это фичи из неиронок, опирающиеся на смысловое наполнение кадра, изображения не будут особо меняться даже если видео исказить, наполнить шумом, зашакалить компроссией, итд. То есть мы получили даже устойчивое представление видео.
Я стал думать как сделать из этого систему для CBVR. Типичное решение: вытаскиваем ключевые кадры, кладем в базу данных. Из короткого видео на входе таким же образом вытаскиваем ключевые кадры, ищем их в базе данных. Если находим много похожих кадров, причем они идут друг за другом так же как в коротком видео, то у нас метч и поиск успешен.