Русский
Русский
English
Статистика
Реклама

Изображения

Как зарабатывать на фотографиях

17.07.2020 08:05:27 | Автор: admin


Данная статья является логическим продолжением этой статьи на Хабре о выдаче регистратором Р01 моих персональных данных.
Пришлось дожидаться, пока закончатся суды (частично), чтобы описать, кому было интересно запросить мои персональные данные у доменного регистратора Р01 и зачем.
История простая требование компенсации за нарушение авторских прав на изображения, но со своими забавными нюансами.
Ниже по тексту как не надо зарабатывать на фотографиях. Пример, как надо в спойлерах (16+)


Автор неизвестен


Итак, в марте я получил "письмо счастья", требующее от меня 30 т.р. за нарушение авторских прав за три перепощенные на моем сайте фотографии. 30 т.р. это до суда, по суду якобы будет уже минимум 90 т.р.


Сперва я подумал, что это какой-то развод, потому что досудебная претензия пришла от (дословно) Финансового общества с ограниченной ответственностью. Для человека, видевшего как формально в России пишутся названия организаций в документах, выглядит непривычно. Но потом выяснилось, что они OOO "Финансовое общество с ограниченной ответственность", просто для понтов везде себя так упрощают. Подумалось, если бы какая-нибудь ООО "Наташа" везде в официальных документах писала себя просто Наташа, это выглядело бы мощно. И даже местами страшно.


Автор: Рулон Обоев


Неделю-две мы обсуждали данный вопрос по электронной почте, они пугали двумя другими выигранными делами на 260 т.р. и 300 т.р. по этим же фотографиям, но не договорились, и я посоветовал обратиться в суд. После этого на пару месяцев они потерялись, но после выхода прошлой статьи про Р01 на Хабре уже через неделю я получил иск в свой районный суд. Иск судья вернул видимо торопились и что-то напортачили, но довольно быстро исправились и прислали новый.


Выяснилось, что это ООО "ФООО" тесно связана (те же люди и там, и там) с калининградской юридической фирмой "Солнцев и партнеры" (https://seplegal.ru/about/).



Автор: "Солнцев и Партнеры". Источник: seplegal.ru


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


Автор неизвестен


Меж тем я обратился к самому господину Созвариеву А.А. его фамилия фигурировала на запросе регистратору Р01 по моим персональным данным. Это, ни много ни мало, в прошлом президент, а ныне вице-президент Адвокатской палаты Калининградской области. Сперва обратился через палату без ответа, потом через Фейсбук.




Ёмко и доходчиво.


В середине июля прошли два судебных заседания с ООО "ФООО" в режиме видеоконференцсвязи с Калининградом. Итог отказ в удовлетворении исковых требований в полном объеме.


Автор неизвестен


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


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


Автор неизвестен


Авторские права


Для начала мое отношение к авторским правам, чтобы превентировать необоснованный хейт.


Как у человека, рожденного в СССР, у меня, конечно, в крови принципы, что бесплатными и общедоступными должны быть не только здравоохранение и образование. И опен-соурс я люблю. Мне все равно, что кто-то возьмет 10 строк моего кода какого-то алгоритма. Но есть вещи, которыми я не готов просто так делиться. В них вложено мое время, мой труд, они мне дороги. Я не хочу, чтобы их просто так кто-то забрал. Это абсолютно естественно.


Автор: CapriZ

image


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


Автор: Елена Платонова


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


Автор: Дима Шатров


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


Продвинутый вариант рыбалки


Виталий Тырышкин, свадебный фотограф из Горно-Алтайска. По утверждению истца, профессионал, специализирующийся на природе. Делает пейзажные фотки, размещает на своих страницах в соцсетях и где получится. После этого с помощью сервиса Яндекс.картинки вычисляет, кто его фотографии забрал. Идет к нотариусу, оформляет протокол осмотра сайта (7000 рублей, выглядит как распечатка страницы). Потом убирает эти фотографии со своих страниц чтобы нельзя было сделать ссылку на первоисточник.


Автор неизвестен


Пару раз Тырышкин обращался в суд сам, но потом продал права на взыскание компенсации за нарушение авторских прав ООО "ФООО". Деньги делят пополам. Образцы объектов авторского права можно посмотреть на этой странице. Нужно отметить, что Горный Алтай очень сложно снять некрасиво. Козлы не в счет.


Предыдущие суды


Как уже упоминалось, ООО "ФООО" выиграло два суда по подобным делам. Первый у ЗАО "Четвертая власть" 16 фотографий размещались на сайтах russiantourism.ru и rustur.ru. 300 тысяч. Неприятно, но терпимо.


Автор: Денис Иванов


Вторым ответчиком было частное лицо. Его сайт на данный момент недоступен. Как было указано в разделе "О сайте", это был персональный некоммерческий проект агрегатор новостей. Видимо, свалившиеся ниоткуда 260 тысяч рублей взыскания оказались неподъемными.


Автор неизвестен


Что говорит закон?


Правообладатель вправе требовать компенсации за нарушенные свои авторские права либо в размере от 10000 до 5000000 рублей, либо в двукратном размере стоимости права использования результата интеллектуальной деятельности на его выбор (ст. 1301 ГК РФ)


Автор: Анастасия Чернявская


То есть если правообладатель за одно фото просит 10000, то меньше этого не может быть?


Может. Конституционный Суд РФ от 13 декабря 2016 г. принял Постановление 28-П, которым признал неконституционным положения п.1 ст. 1301 ГК РФ, аргументировав тем, что часто истец запрашивает компенсацию (даже если она минимальна), во много раз превосходящую понесенные им убытки, и это нельзя назвать справедливым. Его подержал Пленум Верховного Суда РФ постановлением от 23 апреля 2019 г. 10.


Статью 1301 ГК РФ не поменяли, но суды после этого стали снижать сумму компенсации за нарушение авторских прав ниже минимальных 10000 рублей. Нижней границей стала двукратная стоимость права использования объекта авторского права. То есть, если на каком-нибудь фотостоке эта фотография или аналогичная стоит 50 рублей, то нижняя грань 100 рублей. Где в этом диапазоне остановится суд зависит от ваших аргументов и фактических обстоятельств дела: являлся ли ваш сайт коммерческим (реклама), сколько людей посмотрело эту фотографию, насколько быстро вы ее удалили после обращения правообладателя, пытались ли урегулировать вопрос в досудебном порядке и много чего еще.


Автор: fra baby


Подробней прочитать об этом и ознакомиться с судебной практикой можно в этом обзоре "Журнала Суда по интеллектуальным правам"


Получается, вообще нельзя использовать чужие фотографии без явного разрешения автора?


Можно, при определенных условиях. В ГК РФ это называется цитирование (пп.1 и 2 п.1 ст.1274 ГК РФ):


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

Автор: sm;)li


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


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


Автор: Гундега Деге


Хрестоматийным и красивым является дело Варламова против ООО Архи.ру в 2016-2017 годах. Суд первой инстанции отказал истцу, прямо обвинив его в недобросовестном поведении и злоупотреблении правом. Суды второй и третьей инстанции изменили это решение, присудив Варламову запрашиваемую им компенсацию. Верховный суд России отменил два последних решения и полностью вернул в силу решение суда первой инстанции.


Решение ВС РФ https://sudact.ru/vsrf/doc/1HZK89dRk31C/. Также рекомендуется к прочтению решение суда первой инстанции.


Автор: Сергей Ромашев


Нарушение нескольких правомочий


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


Если на одной странице у вас множественное нарушение прав одного автора, суд может снизить минимум по каждому еще в два раза (оптом дешевле).


Автор: Ираклий Шанидзе


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


Для решения этого вопроса в судебном заседании был произведен осмотр сайта на моем ноутбуке. Показывал судье, что такое URL картинки и как выглядит HTML код.


Автор неизвестен


Как снизить размер компенсации?


Как указано в "Обзоре судебной практики по вопросу взыскания компенсации за нарушение исключительного права на результат интеллектуальной деятельности или средство индивидуализации" "Журнала Суда по интеллектуальным правам", 27, март 2020 г:


компенсация должна быть направлена на восстановление положения правообладателя, пострадавшего от нарушения его исключительных прав. На такую природу компенсации указано в п. 43.3 Постановления Пленума ВС РФ 5/29. Суды также в ряде случаев указывают именно на такую природу компенсации.

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

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


Автор: Влад Артазов


Говоря простым языком, взыскать деньги с нарушителя можно для:


  1. того, чтобы восстановить нанесенный им ущерб правообладателю
  2. того, чтобы наказать его, чтоб он так больше не делал

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


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

Автор: tat-oksana


Так что со злоупотреблением правом?


Иногда в судах по данным делам поднимается вопрос о применимости принципа добросовестности и запрета на злоупотребление правом (ст. 10 ГК РФ).


Признаки злоупотребления правообладателем правом:
  • намеренное и неадекватное завышение суммы компенсации (например, низкие художественные характеристики фотографии и отсутствие доказательств профессиональной деятельности правообладателя как фотографа могут свидетельствовать об этом)
  • провокация правообладателя на нарушение его прав другими лицами (правообладатель не заботится о восстановлении своих нарушенных прав, а, наоборот, желает их нарушения)
  • ГК РФ определяет добросовестное поведения, как ожидаемое от любого участника гражданского оборота, учитывающего права и законные интересы другой стороны, содействующего ей, в том числе в получении необходимой информации (правообладатель зафиксировал нотариально ваше нарушение, но не обратился к вам сразу же с предложением прекратить его)
  • история подобных судебных дел правообладателя, их системность. Обратить внимание, что истец в просительной части требует только взыскание компенсации исходя из количества спорных изображений, то есть заявляет требования только материального характера, не заявляя при этом о прекращении и наложении запрета на такое, незаконное по мнению последнего, использование
  • правообладатель требует несоизмеримую по сравнению со стоимостью права использования подобного объекта сумму компенсации
  • шантаж в досудебной претензии когда истец пугает бОльшими суммами, чем потом требует по суду
  • показать, что целью правообладателя является не восстановление нарушенного права правообладателя, а обогащению путем причинения имущественного вреда другому лицу то есть, злоупотребление правом.

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


Автор: Дмитрий Пирожников


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


Финальные замечания


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


Автор неизвестен


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


Если попросить оригиналы в ходе процесса, суд сделает перерыв и истец их пришлет. Если вспомнить об оригиналах в прениях, когда уже всё, конец процесса это выигрыш. Потому что материалы дела это полное собрание доказательств; если там нет доказательств авторства, непредвзятый суд не возьмет на себя ответственность за удовлетворение иска. Истец не удосужился предъявить нужные доказательства его проблемы. К моему случаю этот пример не относится, но в целом это так.


Автор неизвестен


Общие юридические моменты описать тут невозможно, но вот еще то, что применимо к рассматриваемому вопросу, и что может помочь.


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


Автор неизвестен


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


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


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


Автор неизвестен


Также необходимо помнить, что судиться (например, с ООО "ФООО") вы будете в своем суде, который этого истца, скорей всего, не знает. Там, в Калининграде, в своей богемной адвокатско-прокурорско-судейской тусовке у них есть какой-то нагнанный вес, но для вашего суда они никто. А значит, суд будет более-менее справедливым.


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


Автор неизвестен


Выводы


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

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

Автор неизвестен


P.S. Как оказалось в моем случае, даже у самой неприметной фотографии из тематического запроса Google Images может оказаться жадный и расчетливый правообладатель. Поэтому всегда желательно указание на автора и источник заимствования (можно последний). При необходимости запрос автору разрешения на использование. Либо взять в привычку брать иллюстрации только с бесплатных фотостоков.


Еще вариант частичный запрет на индексацию изображений с твоего сайта в поисковиках. Абсолютно несложная вещь.


Автор: Max Sauco


Дисклеймер: в спойлерах использована личная коллекция, собранная очень давно из лучших фотографий сайта photosight.ru. На данный момент некоторые из этих изображений в интернете найти невозможно, поэтому авторов определить не получилось. Надеюсь, они не огорчатся; по запросу укажу имя или удалю. Титульное фото: Василий Шульженко


Автор неизвестен

Подробнее..

Зачем дизайнеру юрист или как не получить административный штраф за видео или стоковое фото на своем сайте

24.03.2021 00:15:52 | Автор: admin

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

По закону использовать изображение человека можно только по его письменному согласию и определенным в согласии образом (это написано в статье 152.1 Гражданского кодекса). Фотостудии, например, именно для этого берут у заказчиков согласие в договорах на использование фотографий в портфолио, потому, что без согласия - такое использование будет незаконным.

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

Через некоторое время присылает дизайнер новый макет с изображением уже другой девушки и сообщает, что фото скачано с сайта "стоковых" изображений, но они купили лицензию у сайта и теперь все законно. Очень хорошо, значит учатся. Прошу прислать договор с сайтом. Присылают - читаю, договор на одном листе, в котором никакой конкретики, только сумма за некую "стандартную" лицензию и ссылка на условия использования на отдельном сайте. Они их не читали. Не поленился прочитать условия на сайте, что входит в эту "стандартную" лицензию, читаю, так и есть - лицензия без ограничения для некоммерческого использования или, а для вот коммерческого только в наружной рекламе на аудиторию не более 500 000 человек. Перезваниваю дизайнеру, спрашиваю, где планируете это использовать и узнаю, что реклама будет размещаться на билбордах в Москве и Санкт-Петербурге, а также выйдет рекламой на телевидении. Уточнил у дизайнера читала ли она условия использования лицензии - не читала (а что надо было?). Макет рекламы не согласовал т. к. для такого объема нужно покупать расширенную лицензию и есть риски получить иск о запрете использования изображений и демонтаже уже размещенных рекламных конструкций.

Если человек обнародовал свою фотографию или видео в сети Интернет, то это также не дает право использовать это фото без его согласия.

С фото понятно, а если я хочу видео снять и разместить на сайте или в блоге?

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

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

Однажды коллега попросил прислать форму договора с актером, который будет участвовать в съемках рекламного видеоролика. Договор я прислал и уточнил - нужны ли договоры с другими участниками этого процесса? С композитором? Исполнителем песен? Автором сценария? Где будет использоваться музыка?

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

Наш конкурент нагло копирует разработанные нами образы детских игрушек. Создает похожие и продает. Как его наказать и пресечь незаконное использование?

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

За нарушение этих требований можно получить административный штраф до 40 тыс. руб. с конфискацией контрафактных экземпляров произведений и фонограмм (см. 7.12 КоАП РФ) или лишение свободы сроком до 2 лет (статья 146 Уголовного кодекса РФ).

Практика показывает, что правообладатели весьма успешно защищают свои права и запрещают незаконное использование. ООО Смешарики, например, имеет более 500 судов с коммерсантами о взыскании компенсации за нарушение исключительных авторских прав на произведения изобразительного искусства рисунки: Лосяш, Нюша, Крош, Копатыч с ожидаемым исходом. В этом можно убедиться, если зайти на сайт арбитражного суда https://kad.arbitr.ru/ и вбить в поиск ООО Смешарики. Тем кому лень открывать и что-то искать можно почитать решения судов о том, как правообладатель наказывает рублем кондитеров: раз, два, три.

Кроме государева "ока" за соблюдением авторских прав бдят и видеосервисы и по заявлению правообладателей достаточно оперативно удаляют видео.

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

Если Вы хотите узнать, кто собственник помещения, здания или земельного участка - Вы обращаетесь к единому Государственному реестру недвижимости Росреестра. Если хотите узнать собственника товарного знака - Вы обращаетесь к сайту Роспатента. Какого-то единого реестра прав на музыку или текст песен нет. Поэтому проверку легальности продажи вам прав на произведение придется проводить самому с определенным допуском достоверности.

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

Ок, а кто с кем должен заключать договоры?

При создании фильма порядок оформления отличается от оформления прав на фото. Договор с правообладателями музыки, сценария заключает лицо, которое организовывает создание фильма - продюсер. Это лицо занимается организацией создания фильма - приобретением прав на использование музыки в видео, права на использование сценария, на экранизацию(если необходимо), ищет актеров и заключает с ними договоры, заключает договор с режиссером, решает организационные вопросы. Кроме того, продюсер получает права на фильм в целом - это единственный "собственник" фильма, только он, как правило, впоследствии может распоряжаться видео, продавать его или сдавать в прокат. У остальных авторов фильма/видео - композитора, автора сценария, актеров, режиссеров и иных соавторов есть право быть указанными в качестве авторов и право на вознаграждение, но распоряжаться таким видео т. е. продавать права на него другим людям они не могут.

В этом смысле нет существенной разницы между полнометражным художественным фильмом, рекламным роликом и коротким видео в Youtube, Instagram или на ином сервисе. Регулирование рекламного ролика и художественного фильма одинаковое.

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

Директор школы не государственный служащий. А вот принадлежность его к политической деятельности понятие субъективное и определяется деятельностью самого директора, а не его должностью. Верховный суд по этому поводу сказал следующее: Без согласия гражданина обнародование и использование его изображения допустимо в силу подпункта 1 пункта 1 статьи 152.1 ГК РФ, то есть когда имеет место публичный интерес, в частности если такой гражданин является публичной фигурой (занимает государственную или муниципальную должность, играет существенную роль в общественной жизни в сфере политики, экономики, искусства, спорта или любой иной области), а обнародование и использование изображения осуществляется в связи с политической или общественной дискуссией или интерес к данному лицу является общественно значимым.Вместе с тем согласие необходимо, если единственной целью обнародования и использования изображения лица является удовлетворение обывательского интереса к его частной жизни либо извлечение прибыли.Не требуется согласия на обнародование и использование изображения гражданина, если оно необходимо в целях защиты правопорядка и государственной безопасности (например, в связи с розыском граждан, в том числе пропавших без вести либо являющихся участниками или очевидцами правонарушения).

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

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

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

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

Я могу потребовать если я попал в кадр новостей чтобы меня не показывали?

В законе о СМИ прописаны требования для журналисткой деятельности и они такие же - журналист обязан получить ваше согласие кроме случаев если вас снимали вследствие обсуждения какого-либо вопроса - то есть если вас остановили на улице задали вопрос и вы ответили на него, то вы приняли участие в общественной дискуссии и тем самым согласились на съёмку. В целом у судов неоднозначный подход к этому вопросу. Вот что пишет Конституционный суд, например, "Кроме того, фотографии, на которых А.О. Безрукова позировала фотографу, были сделаны во время проведения публичного мероприятия с участием прессы, что могло свидетельствовать о наличии ее волеизъявления не только на фотосъемку, но и на дальнейшее обнародование и использование этих изображений в средствах массовой информации."

Размещенные изображения и текст на сайте целесообразно "защитить" знаком охраны авторства. (копирайт). Знак охраны авторского права состоит из латинской буквы "С" в окружности, наименования объекта защиты права, имени правообладателя и цифрового обозначения года первого опубликования произведения (без слова "год" или сокращения "г."). От копирования он, сам по себе не спасает, но может быть полезен при доказывании своего авторства. Если кому интересно, то правилам написания копирайта посвящен целый ГОСТ Р 7.0.1-2003.

Спасибо, что дочитали до конца. Если у Вас остались вопросы - Вы можете задавать их в комментариях и прислать по почте по адресу p_slizky@mail.ru .

Подробнее..

Перевод Как работает поиск изображений в Dropbox

27.05.2021 20:23:24 | Автор: admin

Если вам нужно найти фотографию, сделанную на пикнике несколько лет назад, вряд ли вы помните имя, которое камера автоматически присвоила файлу в момент съёмки, например, 2017-07-04 12.37.54.jpg.Вы просматриваете всё подряд фотографии, их эскизы, пытаетесь определить объекты или признаки искомого и не важно, ищете ли вы потерянное фото или хотите подыскать в архивах приличный снимок для презентации нового проекта.

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

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


Результаты поиска изображений по ключевому слову "пикник"Результаты поиска изображений по ключевому слову "пикник"

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

Наш метод

Формулируем задачу поиска изображений: необходимо найти функцию релевантности, которая принимала бы на входе (текстовый) запрос q и изображение j, а на выходе выдавала бы оценку релевантности s в баллах, показывающую, насколько точно изображение соответствует запросу:

s = f(q, j).

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

Классификация изображений

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

Категории могут быть следующими:

  • конкретные объекты на изображении, например, дерево или человек;

  • общие дескрипторы сцены, например, на улице или свадьба;

  • характеристики самого изображения, например, чёрно-белое или крупный план.

За последнее десятилетие был сделан огромный шаг вперёд в области в классификации изображений с помощью свёрточных нейронных сетей достаточно упомянуть замечательную работу 2012 года. Krizhevsky и др. на турнире ImageNet Сhallenge. С тех пор, благодаря усовершенствованию архитектуры моделей, улучшению методов обучения, большим базам данных, например Open Images или ImageNet, и простым в использовании библиотекам, таким как TensorFlow и PyTorch, исследователи создали классификаторы изображений, способные распознавать тысячи категорий. Оцените, насколько качественно сегодня работает классификация изображений:

Результаты применения классификатора изображений к типичной непостановочной фотографииРезультаты применения классификатора изображений к типичной непостановочной фотографии

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

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

Векторы слов

Давайте несколько переформулируем задачу. Выход классификатора изображений можно интерпретировать как вектор jc балльных оценок по каждой категории. Данный вектор определяет содержание изображения как точку в C-мерном пространстве категорий, где C количество категорий (несколько тысяч). Если нам удастся извлечь осмысленное представление запроса в таком пространстве, мы сможем понять, насколько близко вектор изображения находится к вектору запроса, и принять это за меру соответствия изображения запросу.

Получение векторных представлений текста предмет большого количества исследований в области обработки с использованием естественного языка. Один из наиболее известных методов в этой области word2vec описан в статье Mikolov и др. в 2013 году. Каждому слову в словаре функция Word2vec присваивает собственный вектор, и, исходя из этого, слова имеющие сходные значения, будут иметь близкие друг к другу векторы. Эти векторы находятся в d-мерном векторном пространстве слов, где d обычно составляет несколько сотен.

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

  1. Для слова запроса q можно получить d-мерный вектор слов qw, нормализованный к единичному вектору. Для векторов в пространстве слов будем использовать нижний индекс w, а для векторов в пространстве категорий нижний индекс c.

  2. Для каждой категории получаем нормализованный вектор слов для названия категории ciw. Затем определяем значение mi = qw - ciw косинусное сходство векторов запроса и i-й категории. Полученная оценка от -1 до 1 показывает, насколько близко слово запроса соответствует названию категории. Сводя отрицательные значения к нулю (то есть применяя функцию mi = max(0, mi)), получаем оценку в том же диапазоне, что и результаты классификатора изображений.

  3. Таким образом, можно вычислить qc = [m1 m2 ... mC], вектор в C-мерном пространстве категорий, показывающий, насколько близко запрос соответствует каждой из категорий аналогично тому, как вектор классификатора изображений для каждого изображения показывает, насколько близко изображение соответствует каждой из категорий.

Шаг 3 осуществляем обычное векторно-матричное умножение, qc = qwC, где C матрица со столбцами векторов слов категории ciw.

После сопоставления запроса с вектором пространства категорий qc к вектору пространства категорий для каждого изображения можно применить косинусный коэффициент и получить таким образом окончательный балл релевантности для изображения s = qcjc.

Мы получили функцию релевантности. С её помощью мы ранжируем изображения побалльно и формируем список результатов запроса. Применение данной функции к набору изображений можно также выразить как векторно-матричное умножение, s = qcJ, в котором каждый столбец J представляет собой выходной вектор классификатора jc для изображения, а s вектор балльных оценок релевантности для всех изображений.

Пример

Рассмотрим пример с небольшим количеством измерений. В нём векторы слов имеют три измерения, а классификатор четыре категории: яблоко, пляж, одеяло и собака.

Предположим, пользователь искал берег. Просматриваем вектор слов, получаем [0,350,62 0,70], затем умножаем на матрицу векторов слов категорий и проецируем запрос на пространство категорий.

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

Проекция вектора слов запроса на пространство категорийПроекция вектора слов запроса на пространство категорий

Описание модели

Наш классификатор изображений представляет собой сеть EfficientNet, натренированную на наборе данных OpenImages. Классификатор выдаёт балльные оценки примерно по 8500 категориям. Мы выяснили, что данная архитектура и набор данных обеспечивают хорошую точность при разумных затратах. Это довольно важно, если приходится работать с клиентской базой Dropbox.

Для тренировки и запуска модели будем использовать TensorFlow и заранее обученные векторы слов ConceptNet Numberbatch. Полученные результаты оказались удовлетворительными, и, что важно для нас, модель способна работать с несколькими языками, возвращая сходные векторы для слов на разных языках со сходными значениями. Это упрощает процесс поиска изображений на разных языках: векторы слов dog на английском языке и chien на французском сходны, поэтому мы можем осуществлять поиск на обоих языках без перевода поискового запроса с одного языка на другой.

Для поиска по нескольким словам будем анализировать запрос как логическую операцию AND, применённую к отдельным словам. Мы также ведём перечень терминов, состоящих из нескольких слов, например beach ball, которые можно рассматривать как одно слово. Если запрос содержит один из таких терминов, мы делаем альтернативный синтаксический разбор и применяем операцию OR для двух разобранных запросов, после чего запрос beach ball принимает вид (beach AND ball) OR (beach ball). Этот термин будет подходить для поиска как больших разноцветных надувных мячей для игры на пляже, так и для теннисных мячей на песке.

Архитектура в производственной среде

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

Поэтому вместо создания экземпляра J для каждого запроса мы используем описанный выше приближённый метод, который может быть эффективно реализован на поисковом движке Dropbox Nautilus.

По сути, Nautilus состоит из прямого индекса (forward index), сопоставляющего каждый файл с определёнными метаданными (например, именем файла) и полным текстом файла, и инвертированного индекса (inverted index), сопоставляющего каждое слово со списком публикаций (posting list) для всех файлов, содержащих это слово. При текстовом поиске содержимое индекса для нескольких файлов с рецептами может выглядеть примерно так:

Содержание поискового индекса для текстового поискаСодержание поискового индекса для текстового поиска

Если пользователь ищет белое вино, мы ищем эти два слова в инвертированном индексе и обнаруживаем в doc_1 и doc_2 оба слова, поэтому мы должны включить их в результаты поиска. В doc_3 есть только одно из этих слов, поэтому мы должны либо опустить его, либо поставить последним в списке результатов.

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

Применение методов текстового поиска для поиска изображений

Систему текстового поиска можно использовать для реализации нашего алгоритма поиска изображений. В прямом индексе можно хранить вектор пространства категорий jc каждого изображения. В инвертированном индексе для каждой категории будет храниться список публикаций изображений с положительными балльными оценками для данной категории.

Содержание поискового индекса для поиска изображений по содержимомуСодержание поискового индекса для поиска изображений по содержимому

Предположим, пользователь ищет слово пикник:

  1. Находим вектор qw для слова пикник и умножаем его на матрицу проекции пространства категорий C и получаем qc, как описано выше. C это фиксированная матрица, одинаковая для всех пользователей, поэтому её можно хранить в памяти.

  2. Для каждой категории, имеющей ненулевую запись в qc, получаем список идентификаторов из инвертированного индекса. Объединение таких списков представляет собой набор совпадающих изображений, полученных в результате поиска, однако эти результаты ещё необходимо ранжировать.

  3. Для каждого результата поиска возьмём вектор пространства категорий jc из прямого индекса и умножим его на qc, чтобы получить балльную оценку релевантности s. Получаем результаты с балльной оценкой выше порогового значения, ранжированные по этой балльной оценке.

Оптимизация для масштабируемости

Описанный подход по-прежнему связан со значительными затратами как с точки зрения пространства для хранения данных, так и с точки зрения времени обработки запросов. Для 10000 категорий в прямом индексе для каждого изображения необходимо хранить 10000 балльных оценок классификатора, что при использовании четырёхбайтовых значений с плавающей запятой составляет 40 КБ. А поскольку оценки классификатора редко когда бывают строго нулевыми, в большинство из таких 10000 списков идентификаторов будет добавлено стандартное изображение. Если для идентификаторов изображений использовать четырёхбайтовые целые числа, добавятся ещё 40 КБ и стоимость индексирования одного изображения составит 80 КБ. Другими словами, для многих изображений их индекс будет больше по размеру, чем сам файл изображения!

Что касается времени обработки запроса, под которым понимается задержка, с которой система выдаёт пользователю результаты поиска, мы можем ожидать, что около половины балльных оценок совпадения запроса и категории mi будут положительными, поэтому нам придётся прочитать около 5000 списков идентификаторов из инвертированного индекса. Если сравнивать с текстовыми запросами, то они обычно считывают всего около 10 списков публикаций.

К счастью, существует множество близких к нулю значений, которые вполне можно отбросить, и это не повлияет качество поиска. Оценка релевантности для каждого изображения была представлена выше как s = qcjc, где qc балльная оценка соответствия между запросом и каждой из примерно 10000 категорий, а jc балльные оценки приблизительно 10000 категорий, полученные с помощью классификатора. Оба вектора в основном состоят из близких к нулю значений, которые не вносят практически никакого вклада в s.

В нашем приближении мы определим значения всех записей qc и jcкак равные нулю, кроме нескольких самых больших. Экспериментально было выяснено, что сохранение 10 записей в qc и 50 записей в jc вполне достаточно для получения не менее содержательного итогового результата. Экономия на хранении и обработке данных получилась довольно существенной:

  • В прямом индексе вместо 10000-мерных плотных векторов мы храним разрежённые векторы с 50 ненулевыми записями, то есть с 50 записями с наиболее высокими балльными оценками категорий для каждого изображения. В разрежённом представлении мы храним позицию и значение каждой ненулевой записи; 50 двухбайтовых позиций (записанных целыми числами) и 50 четырёхбайтовых значений (записанных в виде числа с плавающей точкой) требуют всего около 300 байт.

  • В инвертированном индексе каждое изображение добавляется не в 10000, а в 50 списков идентификаторов, что обходится всего в 200 байт. Таким образом, общий размер индекса для каждого изображения составляет 500 байт вместо 80КБ.

  • Во время запроса qc имеет 10 ненулевых записей, поэтому нужно просканировать только 10 списков идентификаторов примерно такой же объём работы выполняется в текстовых запросах. Набор результатов сужается, и такой набор можно быстрее оценить.

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

Доступность функций

Функция поиска в изображениях в настоящее время доступна для всех наших пользователей профессионального и бизнес-уровня. Объединяя функции поиска в любых изображениях, OCR-поиска в изображениях и документах и полнотекстового поиска в текстовых документах, мы делаем большинство файлов пользователей доступными для поиска на основе содержимого.

Поиск в видео?

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

Искусственный интеллект сегодня экономит не только время, но и силы, которые направляются на решение всё более сложных задач. И если вам интересно решать задачи в области искусственного интеллекта, вы можете обратить внимание на наш курс "Machine Learning и Deep Learning", разработанный совместно с компанией NVIDIA.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Подвижные голограммы космический бой в наперстке

12.05.2021 10:23:58 | Автор: admin


Если взглянуть на произведения из категории научная фантастика, то можно найти немало общих элементов. Конечно же, одним из самых явных являются невероятные технологии роботы, космические корабли, стазис-камеры, и т.д. К лидерам по частоте появлений в кино, играх и фильмах можно с уверенностью причислить и голограммы. Праотцом голограмм считается, как неудивительно, Айзек Азимов, упоминающий эту технологию в цикле романов Основание. Первым же кино-дебютом для голограммы стал фильм Зардоз 1974 года с Шоном Коннери в главной роли. С тех пор голограммы начали появляться практически во всех научно-фантастических фильмах до той степени, что эта технология перестала удивлять, а порой начала вызывать откровенную неприязнь своей невероятной универсальностью в качестве инструмента продвижения сюжета. Однако, несмотря на недовольное ворчание некоторых киноманов, ученые по всему миру испытывают живейший интерес к этой невероятной технологии. Группа исследователей из университета Бригама Янгам (США) создали новый вариант технологии визуализации голографических изображений, которые буквально оживают на глазах. Данный труд уже освещался на Хабре, но давайте рассмотрим его подробнее. В чем же секрет подвижных голограмм, в чем их особенность и как все это выглядит? Ответы на эти вопросы мы найдем в докладе ученых. Поехали.

Основа исследования


Еще в 2018 году был опубликован труд (A photophoretic-trap volumetric display), в котором ученые описывают устройство для объемного отображения с помощью фотофоретического* треппинга (photophoretic trapping). Работа устройства основана на удержании частицы в фотофоретической ловушке, которая перетаскивает частицу через каждую активную точку изображения в свободном пространстве (до 1 см3).
Фотофорез* явление, когда мелкие частицы, взвешенные в газе (аэрозоли) или жидкости (гидроколлоиды), начинают двигаться при освещении достаточно интенсивным светом. Причиной этого явления является неравномерное распределение температуры освещенной частицы в текучей среде.
Когда частица перемещается в свободном пространстве, она освещается лазером видимого диапазона, чтобы сформировать изображение, которое может увидеть человек.

Данная технология нова и требует решения множества проблем, основными среди которых являются увеличение объема свободного пространства от 1 см3 до 100 см3 и устранения фундаментальной неспособности объемных дисплеев создавать виртуальные образы в свободном пространстве. Вторая проблема и стала главной задачей рассматриваемого нами исследования.


Изображение 1

В данном труде использовалась фотофоретическая визуализация на основе оптической ловушки (OTD от optical trap display), способная создавать в воздухе как плоские, так и трехмерные объекты (1b и 1c).

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

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

Теория устройства


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

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

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

Одной из наиболее общих форм перспективы является трассировка лучей, при которой наблюдатель (человек или камера) рассматриваются как одна точка E = (x0, y0, z0) плюс отображаемая точка изображения X = (x, y, z) и плоскость, на которой отображается P. Нахождение пересечения прямой EX с плоскостью P дает координату точки X в пикселях. Перспективная проекция может быть определена следующим матричным соотношением для плоскости P, перпендикулярной линии EO, где O начало координат:



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

Практическое испытание устройства


Чтобы продемонстрировать смоделированные виртуальные изображения с использованием модифицированного параллакса (перспективной проекции), было создано плоское (2D) OTD-изображение луны на задней стороне рабочего пространства. Эта плоскость, в свою очередь, находилась на передней стороне трехмерной миниатюры дома (2b).


Изображение 2

Камера (наблюдатель) была размещена на вращающемся штативе (2a). Частота смены кадров визуализированной луны сохранялась на уровне 12 кадров в секунду. Количество вокселов (объемных пикселей) в секунду, визуализируемых в ходе опытов, составило примерно 10000 в секунду. Частота обновления векторных изображений была 28 Гц, однако повышенная скорость приводит к снижению качества. Потому было решено снизить частоту до 12 Гц, что снижает эффект мерцания.

Функция воспроизведения изображения OTD менялась перспективной проекцией синхронно с движением кронштейна камеры. Скорость движения камеры составляла примерно 0.0194 м/с. Камера была сфокусирована на дымоходе дома (примерно z = 2 мм). Радиус поворота составлял 100 мм до передней грани объектива камеры. Размеры дома составляли 7.7 х 10.6 х 7.4 мм. Первоначальный диаметр луны составлял 0.5 мм, а скорость ее движения 12 кадров в секунду.

Результаты исследования



Изображение 3

На 3a-3c луна нарисована в плоскости перед домом (z = 0 мм), при этом она не меняется, обеспечивая контрольное изображение. На 3d-3f луна все еще нарисована при z = 0, но при вращении камеры луна смещается в сторону для получения параллакса, соответствующего объекту, воспринимаемому при z = 8 мм. На 3g-3i видео с камеры наложено на симуляцию Blender (оба с включенной перспективной проекцией). При этом наблюдается незначительное смещение, вызванное несовершенством устройства, но относительный параллакс согласуется с результатами моделирования с высокой точностью (средняя ошибка составила всего 5.88%).

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

Несмотря на вышеописанные результаты, данная методика обладает некоторыми ограничениями: отсутствие диспаратности*, необходимость отслеживать положение глаз наблюдателя и несоответствие аккомодации/вергенции* и других визуальных сигналов.
Вергенция* одновременное движение обоих глаз в противоположных направлениях для получения или сохранения целостного бинокулярного зрения.
Диспаратность* различие взаимного положения точек, отображаемых на сетчатках левого и правого глаза.
Эксперименты проводились с использованием камеры, т.е. монокуляра. Чтобы методика визуализации голограммы была эффективна для людей, необходимо реализовать точный бинокулярный параллакс. А для этого OTD должен обладать управляемым анизотропным рассеянием.

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

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

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

Для более детального ознакомления с нюансами исследования рекомендую заглянуть в доклад ученых.

Эпилог


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

Все это стало возможным благодаря работе ученых, которую они проделали еще в 2018 году. Тогда они смогли создать методику визуализации объектов в свободном пространстве. Фундаментом этой методики стали оптические ловушки, которые улавливают частицы в воздухе с помощью лазера. При передвижении частица следует за ловушкой, а за ней остается освещенный лазером путь, парящий в воздухе. Авторы методики назвали это 3D-принтер для света.

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

Видео, в котором авторы исследования рассказывают о своем творении.

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

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

Благодарю за внимание, оставайтесь любопытствующими и хорошей всем рабочей недели, ребята. :)

Немного рекламы


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Maincubes Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?
Подробнее..

Неявные нейронные представления с периодическими функциями активации

13.04.2021 10:07:06 | Автор: admin
Знакомые с нейронными сетями читатели скорее всего слышали про термин функция активации. Такие варианты функции активации, как сигмоида, гиперболический тангенс (TanH) и ReLU (линейный выпрямитель), активно применяются в нейронных сетях и широко известны энтузиастам, занимающимся экспериментами с нейронными архитектурами. Исследователи нейронных сетей не останавливаются на достигнутом и подбирают альтернативы, позволяющие расширить границы возможностей. Один из вариантов подхода, предложенного в 2020 году, показывает выдающиеся результаты по сравнению с классическими функциями активации. Про впечатляющие отличия и пойдет речь в этой статье: на основе материала Vincent Sitzmann, Julien N. P. Martel, Alexander Bergman, David B. Lindell, Gordon Wetzstein и кода на нескольких наглядных примерах будет продемонстрировано превосходство нового метода.


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

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

Для использования синусоидальной функции активации получаем следующую формулу:


Здесь i: RMi RNi обозначает i-ый слой сети, Wi R NiMi представляет собой матрицу весов, ответственную за аффинные преобразования сигнала, а bi RNi представляет собой байесову добавку к вектору xi RMi

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

Таким образом, синусоидальная функция активации обладает рядом полезных свойств, таких, как нелинейность, непрерывная дифференцируемость и возможность аппроксимации тождественной функции около начала координат. Теперь давайте перейдем к теме статьи Vincent Sitzmann, Julien N. P. Martel, Alexander Bergman, David B. Lindell, Gordon Wetzstein.


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

Форма представления сигнала, параметризованная с помощью нейронной сети, и обладающая свойствами неявного определения, непрерывности и дифференцируемости, представляет собой отдельное направление в развитии нейронных архитектур. Такой подход способен предложить ряд преимуществ по сравнению с традиционными представлениями и поэтому может быть выделен в отдельную парадигму. Авторы статьи, в рамках новой парадигмы, предлагают использовать функции периодической активации для неявных нейронных представлений. Новый подход, под названием Сети Синусоидального Представления (sinusoidal representation networks) или SIREN, в работе авторов демонстрирует впечатляющие результаты в приложении к сложным сигналам физической природы и их производным.

В основной работе авторы анализируют статистические свойства активации SIREN, чтобы предложить принципиальную новую схему задания начальных значений для весов сети, и демонстрируют работу с изображениями, волновыми полями, видео, звуком и их производными. Далее авторы показывают, как можно использовать SIREN для решения сложных краевых задач, таких, как точное уравнение Эйконала (с получением функций расстояния со знаком), уравнение Пуассона, а также уравнения Гельмгольца и уравнения волнового движения. Наконец, авторы в своей статье объединили SIREN с гиперсетями для изучения априорных вероятностей в пространстве функций SIREN, однако этот материал уже выходит за рамки нашего обзора.

Baselines


Следующие результаты сравнивают SIREN с различными сетевыми архитектурами. TanH, ReLU, Softplus и т. д. означает Multi Layer Perceptron одинакового размера с соответствующей функцией нелинейности. Авторы также сравнивают недавно предложенное позиционное кодирование (Partial Encoding) в сочетании с нелинейной функцией активации ReLU, обозначенной, как ReLU P.E. SIREN существенно превосходит все baseline результаты, сходится значительно быстрее и является единственной архитектурой, точно отражающей градиенты сигнала, позволяя тем самым использование в решении краевых задач.

Представление изображений


SIREN, отображающая координаты 2D-пикселей в цвета, может быть использована для параметризации изображений. В данном случае авторы напрямую активируют SIREN, используя истинные значения пикселей. В данных примерах SIREN удается успешно аппроксимировать изображение, получая на 10 дБ более высокое значение PSNR в условиях меньшего количества итераций по сравнению с конкурентами. Кроме того, SIREN является единственным представителем Multi Layer Perceptron, которому удается точно отразить производные первого и второго порядка.



Краткое демо


(код взят из https://colab.research.google.com/github/vsitzmann/siren/blob/master/explore_siren.ipynb)

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

import torchfrom torch import nnimport torch.nn.functional as Ffrom torch.utils.data import DataLoader, Datasetimport osfrom PIL import Imagefrom torchvision.transforms import Resize, Compose, ToTensor, Normalizeimport numpy as npimport skimageimport matplotlib.pyplot as pltimport timedef get_mgrid(sidelen, dim=2):'''Generates a flattened grid of (x,y,...) coordinates in a range of -1 to 1.sidelen: intdim: int'''tensors = tuple(dim * [torch.linspace(-1, 1, steps=sidelen)])mgrid = torch.stack(torch.meshgrid(*tensors), dim=-1)mgrid = mgrid.reshape(-1, dim)return mgrid

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

class SineLayer(nn.Module):# See paper sec. 3.2, final paragraph, and supplement Sec. 1.5 for discussion of omega_0.# If is_first=True, omega_0 is a frequency factor which simply multiplies the activations before the# nonlinearity. Different signals may require different omega_0 in the first layer - this is a# hyperparameter.# If is_first=False, then the weights will be divided by omega_0 so as to keep the magnitude of# activations constant, but boost gradients to the weight matrix (see supplement Sec. 1.5)def __init__(self, in_features, out_features, bias=True,is_first=False, omega_0=30):super().__init__()self.omega_0 = omega_0self.is_first = is_firstself.in_features = in_featuresself.linear = nn.Linear(in_features, out_features, bias=bias)self.init_weights()def init_weights(self):with torch.no_grad():if self.is_first:self.linear.weight.uniform_(-1 / self.in_features,1 / self.in_features)else:self.linear.weight.uniform_(-np.sqrt(6 / self.in_features) / self.omega_0,np.sqrt(6 / self.in_features) / self.omega_0)def forward(self, input):return torch.sin(self.omega_0 * self.linear(input))def forward_with_intermediate(self, input):# For visualization of activation distributionsintermediate = self.omega_0 * self.linear(input)return torch.sin(intermediate), intermediateclass Siren(nn.Module):def __init__(self, in_features, hidden_features, hidden_layers, out_features, outermost_linear=False,first_omega_0=30, hidden_omega_0=30.):super().__init__()self.net = []self.net.append(SineLayer(in_features, hidden_features,is_first=True, omega_0=first_omega_0))for i in range(hidden_layers):self.net.append(SineLayer(hidden_features, hidden_features,is_first=False, omega_0=hidden_omega_0))if outermost_linear:final_linear = nn.Linear(hidden_features, out_features)with torch.no_grad():final_linear.weight.uniform_(-np.sqrt(6 / hidden_features) / hidden_omega_0,np.sqrt(6 / hidden_features) / hidden_omega_0)self.net.append(final_linear)else:self.net.append(SineLayer(hidden_features, out_features,is_first=False, omega_0=hidden_omega_0))self.net = nn.Sequential(*self.net)def forward(self, coords):coords = coords.clone().detach().requires_grad_(True) # allows to take derivative w.r.t. inputoutput = self.net(coords)return output, coordsdef forward_with_activations(self, coords, retain_grad=False):'''Returns not only model output, but also intermediate activations.Only used for visualizing activations later!'''activations = OrderedDict()activation_count = 0x = coords.clone().detach().requires_grad_(True)activations['input'] = xfor i, layer in enumerate(self.net):if isinstance(layer, SineLayer):x, intermed = layer.forward_with_intermediate(x)if retain_grad:x.retain_grad()intermed.retain_grad()activations['_'.join((str(layer.__class__), "%d" % activation_count))] = intermedactivation_count += 1else:x = layer(x)if retain_grad:x.retain_grad()activations['_'.join((str(layer.__class__), "%d" % activation_count))] = xactivation_count += 1return activations

И, наконец, дифференциальные операторы, которые позволяют использовать torch.autograd для вычисления градиентов и лапласианов.

def laplace(y, x):grad = gradient(y, x)return divergence(grad, x)def divergence(y, x):div = 0.for i in range(y.shape[-1]):div += torch.autograd.grad(y[..., i], x, torch.ones_like(y[..., i]), create_graph=True)[0][..., i:i+1]return divdef gradient(y, x, grad_outputs=None):if grad_outputs is None:grad_outputs = torch.ones_like(y)grad = torch.autograd.grad(y, [x], grad_outputs=grad_outputs, create_graph=True)[0]return grad

Для экспериментов используется классическое изображение оператора.

def get_cameraman_tensor(sidelength):img = Image.fromarray(skimage.data.camera())transform = Compose([Resize(sidelength),ToTensor(),Normalize(torch.Tensor([0.5]), torch.Tensor([0.5]))])img = transform(img)return img

Далее просто фитируем это изображение. В процессе аппроксимации мы стремимся параметризовать изображение f(x) в оттенках серого с пиксельными координатами x с помощью функции (x). То есть мы ищем функцию такую, что функционал L = (x) f(x)dx минимизируется. При этом является областью изображения. Используем небольшой датасет, который вычисляет попиксельные координаты:

class ImageFitting(Dataset):def __init__(self, sidelength):super().__init__()img = get_cameraman_tensor(sidelength)self.pixels = img.permute(1, 2, 0).view(-1, 1)self.coords = get_mgrid(sidelength, 2)def __len__(self):return 1def __getitem__(self, idx):if idx > 0: raise IndexErrorreturn self.coords, self.pixels

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

cameraman = ImageFitting(256)dataloader = DataLoader(cameraman, batch_size=1, pin_memory=True, num_workers=0)img_siren = Siren(in_features=2, out_features=1, hidden_features=256,hidden_layers=3, outermost_linear=True)img_siren.cuda()

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

total_steps = 500 # Since the whole image is our dataset, this just means 500 gradient descent steps.steps_til_summary = 10optim = torch.optim.Adam(lr=1e-4, params=img_siren.parameters())model_input, ground_truth = next(iter(dataloader))model_input, ground_truth = model_input.cuda(), ground_truth.cuda()for step in range(total_steps):model_output, coords = img_siren(model_input)loss = ((model_output - ground_truth)**2).mean()if not step % steps_til_summary:print("Step %d, Total loss %0.6f" % (step, loss))img_grad = gradient(model_output, coords)img_laplacian = laplace(model_output, coords)fig, axes = plt.subplots(1,3, figsize=(18,6))axes[0].imshow(model_output.cpu().view(256,256).detach().numpy())axes[1].imshow(img_grad.norm(dim=-1).cpu().view(256,256).detach().numpy())axes[2].imshow(img_laplacian.cpu().view(256,256).detach().numpy())plt.show()optim.zero_grad()loss.backward()optim.step()






Представление аудио


Начнем с небольшого эксперимента.

Будем использовать SIREN для параметризации аудиосигнала, то есть стремимся параметризовать звуковую волну f(t) в моменты времени t с помощью функции . Для этого ищем функцию такую, что: функция потерь L = (t) f(t)dt минимизируется, где является звуковой волной. Для эксперимента будем использовать сонату Баха:

import scipy.io.wavfile as wavfileimport iofrom IPython.display import Audioif not os.path.exists('gt_bach.wav'):!wget https://vsitzmann.github.io/siren/img/audio/gt_bach.wav

Создадим небольшой датасет, который позволяет перевести аудиофайл в более удобный для работы формат:

class AudioFile(torch.utils.data.Dataset):def __init__(self, filename):self.rate, self.data = wavfile.read(filename)self.data = self.data.astype(np.float32)self.timepoints = get_mgrid(len(self.data), 1)def get_num_samples(self):return self.timepoints.shape[0]def __len__(self):return 1def __getitem__(self, idx):amplitude = self.datascale = np.max(np.abs(amplitude))amplitude = (amplitude / scale)amplitude = torch.Tensor(amplitude).view(-1, 1)return self.timepoints, amplitude

Далее создадим экземпляр SIREN. Поскольку звуковой сигнал имеет гораздо более высокую пространственную частоту в диапазоне от -1 до 1, поэтому увеличиваем 0 в первом слое SIREN.

bach_audio = AudioFile('gt_bach.wav')dataloader = DataLoader(bach_audio, shuffle=True, batch_size=1, pin_memory=True, num_workers=0)# Note that we increase the frequency of the first layer to match the higher frequencies of the# audio signal. Equivalently, we could also increase the range of the input coordinates.audio_siren = Siren(in_features=1, out_features=1, hidden_features=256,hidden_layers=3, first_omega_0=3000, outermost_linear=True)audio_siren.cuda()

Давайте прослушаем исходные данные:

rate, _ = wavfile.read('gt_bach.wav')model_input, ground_truth = next(iter(dataloader))Audio(ground_truth.squeeze().numpy(),rate=rate)

Далее начнем обучение нейронной сети:

total_steps = 1000steps_til_summary = 100optim = torch.optim.Adam(lr=1e-4, params=audio_siren.parameters())model_input, ground_truth = next(iter(dataloader))model_input, ground_truth = model_input.cuda(), ground_truth.cuda()for step in range(total_steps):model_output, coords = audio_siren(model_input)loss = F.mse_loss(model_output, ground_truth)if not step % steps_til_summary:print("Step %d, Total loss %0.6f" % (step, loss))fig, axes = plt.subplots(1,2)axes[0].plot(coords.squeeze().detach().cpu().numpy(),model_output.squeeze().detach().cpu().numpy())axes[1].plot(coords.squeeze().detach().cpu().numpy(),ground_truth.squeeze().detach().cpu().numpy())plt.show()optim.zero_grad()loss.backward()optim.step()





Послушаем, что получается в итоге:

final_model_output, coords = audio_siren(model_input)Audio(final_model_output.cpu().detach().squeeze().numpy(),rate=rate)

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


Представление видео


Использование SIREN совместно на координатах пикселей и времени позволяет параметризовать видео. В данном случае SIREN непосредственно активируется на истинных значениях пикселей и позволяет параметризовать видео существенно лучше, чем ReLU Multi Layer Perceptron.


Решение уравнения Пуассона


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



Представление фигур путем решения уравнения Эйконала Interactive 3D SDF Viewer используйте мышь для навигации по сценам


Решая краевую задачу в форме уравнений Эйконала, мы можем восстановить SDF из облака точек и нормалей поверхности. Подход SIREN позволяет восстановить сцену масштаба комнаты на основе только облака точек и нормалей поверхности, при этом удается точно воспроизвести мелкие детали, а для обучения требуется менее одного часа. В отличие от недавних работ по объединению воксельных сеток с нейронными неявными представлениями, в предлагаемом подходе полное представление хранится в весах одной пятислойной нейронной сети, без 2D или 3D-сверток, и поэтому требует гораздо меньшего количества параметров. Важно обратить внимание на то, что полученные SDF не обучаются на исходных значениях SDF, а скорее являются результатом решения вышеупомянутой эйкональной краевой задачи. Такая постановка задачи является существенно более сложной и требует обучения с учителем по градиентам (детали в статье). В результате архитектуры сетей, градиенты которых хуже контролируются, показывают качество ниже, чем в подходе SIREN.



Решение уравнения Гельмгольца


В данном случае авторы используют подход SIREN для решения неоднородного уравнения Гельмгольца. Архитектуры на основе ReLU и Tanh не позволяют полностью решить эту задачу.


Решение волнового уравнения


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


* * *


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

В данный момент мы рассматриваем возможности проверить SIREN на наших задачах в Центре компетенции больших данных и искусственного интеллекта ЛАНИТ. Хочется надеяться, что предлагаемый подход покажет свою продуктивность не только на простых примерах, но и на нетривиальных прикладных задачах.
Подробнее..

Recovery mode Древний костыль на старом костыле

23.09.2020 20:15:33 | Автор: admin

Начну без обиняков, как-то раз меня постигло откровение(ну не сильно мощное скажу по-честному) и возникла идея напечатать программу которая передает изображение с клиента на сервер. Достаточно просто да? Ну для программиста со стажем так и будет. Условия просты - не использовать сторонние библиотеки. В принципе немного сложнее, но если учесть что придется разбираться и искать примеры, ну такое себе занятие. Я решил, что эта задача мне по плечу. Плюс желательно чтобы было кода столько, чтобы его можно было запостить на форуме, в случае если понадобится помощь. В первую очередь мой взгляд пал на FTP, к слову ОС в которой разрабатывается Windows. Плюс FTP в том, что можно через него передать не только изображение, а любой файл. Скачав Filezilla Server, расшарив одну директорию на чтение/запись и создав юзера с паролем, попробовал подключится Filezilla Client все работало. Создал простенький пример кода на С/С++:

#include <iostream>void main(){FILE* fs;fopen_s(&fs, "1.txt", "w");if (fs){    fwrite("user\r\npassword\r\nsend D:\\share\\1.txt\r\nbye", 1, sizeof("user\r\npassword\r\nsend D:\\share\\1.txt\r\nbye"), fs);    fwrite("\000", 1, sizeof("\000"), fs);    fclose(fs);}system("ftp -s:1.txt 127.0.0.1");}

Если мне не изменяет память, то на локалхосте все работало, а при передаче по сети возникала ошибка в строчке с send. Что здесь удобно а)коротко б)не нужно устанавливать клиент, а использовать уже встроенную тулзу для ftp от майкрософта. Хотя по-мойму ее надо активировать через программы и компоненты. Если вы разберетесь в чем проблема данного метода и напишите в комментарии, будет отлично.

Не найдя ответа на куче форумов, я оставил данный код и решил использовать интерфейс для сетей сокеты. У меня уже был опыт передачи массива char'ов для другой программы. Кстати можете почитать у Таненбаума, Компьютерные сети, в главе про транспортный уровень. Там есть пример клиента и сервера, правда не для соединения "много клиентов - один сервер", а только "один клиент - один сервер". Поскольку передача идет через Интернет, то нужно зашифровать хоть как-то данные. Для этого используется блочный шифр - сеть Фейстеля. Плюсом на сервере надо сделать несколько(больше одного клиента) клиентов. Для этого воспользуемся Thread'ами, изображение для передачи будет брать скриншот экрана с клиента шифроваться и передаваться на сервер, на котором будет расшифровано и сразу же выведено на экран через дефолтную программу для открытия *.tga изображения.

Код сервера:

#include <iostream>#include <WinSock.h>#pragma comment (lib,"WS2_32.lib")#include <fstream>#include <algorithm>#include <string>#include <iterator>#include <vector>void error(const char* msg){    //perror(msg);    std::cout<<'\n'<<WSAGetLastError();    WSACleanup();    std::cin.ignore();    exit(1);}void bzero(char*buf, int l){    for (int i = 0; i < l; i++)        buf[i] = '\0';}struct arg_s{    unsigned char* buffer2;    bool exit;};char** buffer;struct arg_sa{    struct arg_s* lalk;    int current;};#define type struct arg_saint sockfd, * newsockfd;//слушающий и массив клиентских сокетовint buflen2 = 10292000;//максимальный размер изображения в байтах для RGBA*Width*Heightstruct sockaddr_in *cli_addr;int* clilen;int currentclient,cc;//сс-клиент по счету(для записи инкремента имени файла клиента изображения)typedef unsigned long long uint64_t;typedef unsigned int uint32_t;#define N 8//размер блока#define F32 0xFFFFFFFFuint32_t RK[N];//раундовые ключи#define size64 sizeof(uint64_t)#define ROR(x,n,xsize)((x>>n)|(x<<(xsize-n)))#define ROL(x,n,xsize)((x<<n)|(x>>(xsize-n)))#define RKEY(r)((ROR(K,r*3,size64*8))&F32)const uint64_t K = 0x96EA704CFB1CF671;//ключ шифрованияstruct hostent* server;uint32_t F(uint32_t subblk, uint32_t key){    return subblk + key;//функция шифрования}void createRoundKeys(){    for (int i = 0; i < N; i++)        RK[i] = (ROR(K, i * 8, size64 * 8)) & F32;}uint64_t decrypt(uint64_t c_block)//расшифровка блоков сетью фейстеля{    //select subblocks    uint32_t left = (c_block >> 32) & F32;    uint32_t right = c_block & F32;    uint32_t left_, right_;//subblock in the end of round    for (int r = N - 1; r >= 0; r--)    {        uint32_t fk = F(left, RK[r]);        left_ = left;        right_ = right ^ fk;        if (r > 0)//swap places to next round        {            left = right_;            right = left_;        }        else //last round not swap        {            left = left_;            right = right_;        }    }    //collect subblock in block    uint64_t block = left;    block = (block << 32) | (right & F32);    return block;}void session_(LPVOID args)//функция потока ля каждого клиента{    int current = currentclient++;    bzero((char*)&(cli_addr[current]), sizeof(&(cli_addr[current])));    newsockfd[current] = accept(sockfd, (struct sockaddr*)&(cli_addr[current]), &(clilen[current]));    if (newsockfd[current] < 0)    {        error("Error on accept\n");    }    char* s = new char[100];    int n = recv(newsockfd[current], s, 100, 0);    int buflen2 = atoi(s);//получаем число байтов изображения    FILE* f;    std::string name = "Screen";    cc++;    _itoa_s(cc, s, 100, 10);    name += s;    name += ".tga";    fopen_s(&f,name.c_str(), "wb");//создаем файл изображения с увеличиваещимся на 1 именем, чтобы не перезаписать    if (f != NULL)    {        unsigned char tgaHeader[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };        unsigned char header[6];        n = recv(newsockfd[current], buffer[current], sizeof(tgaHeader), 0);        fwrite((unsigned char*)buffer[current], 1, sizeof(tgaHeader), f);        bzero(buffer[current], buflen2);        n = recv(newsockfd[current], buffer[current],sizeof(header), 0);        fwrite((unsigned char*)buffer[current], 1, sizeof(header), f);//записали хидеры        bzero(buffer[current], buflen2);        n = recv(newsockfd[current], buffer[current], buflen2, 0);//получили байты самого изображения        //        //расшифровка байтов        createRoundKeys();        unsigned long long id;        std::vector<uint64_t>* plaintext = new std::vector<uint64_t>();        int i = 0;        while (i<buflen2)        {            memcpy(&id, (buffer[current]) + i, N);            plaintext->push_back(decrypt(id));            i += 8;        }        std::cout << "i=" << i << std::endl;        i = 0;        char str_[N + 1];        memset(str_, 0, N);        str_[N] = '\0';        for (std::vector<uint64_t>::iterator it = plaintext->begin(); it != plaintext->end(); ++it)        {            memcpy(str_, &*it, N);            fwrite((unsigned char*)str_, sizeof(unsigned char), N/*strlen(str_)*/, f);            i += 8;        }        std::cout << "i=" << i << std::endl;        //конец рашифровки байтов        //fwrite((unsigned char*)buffer[current], sizeof(char), buflen2, f);        fclose(f);    }    system(name.c_str());//открываем изображение *.tga встроенным редактором}int main(){    cc = 0;    WSADATA ws = { 0 };    if (WSAStartup(MAKEWORD(2, 2), &ws) == 0)    {        currentclient = 0;        int maxclients = 2;//максимальное число клиентов        cli_addr = new struct sockaddr_in[maxclients];        clilen = new int[maxclients];        buffer = new char* [maxclients];        for (int i = 0; i < maxclients; i++)        {            clilen[i] = sizeof(cli_addr[i]);        }        sockfd = socket(AF_INET, SOCK_STREAM, 0);//tcp сокет        if (sockfd < 0)            error("ERROR opening socket");        struct sockaddr_in serv_addr;        bzero((char*)&serv_addr, sizeof(serv_addr));        serv_addr.sin_family = AF_INET;        serv_addr.sin_addr.s_addr = INADDR_ANY;        int port = 30000;//порт        serv_addr.sin_port = htons(port);        if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)            error("ERROR on binding");        if (listen(sockfd, 10) < 0)            error("ERROR listen");        HANDLE* thread;//массив потоков для каждого клиента отдельный        struct arg_sa* args;        while (true)        {            newsockfd = new int[maxclients];            thread = (HANDLE*)malloc(sizeof(HANDLE) * maxclients);            args = new struct arg_sa[maxclients];            for (int i = 0; i < maxclients; i++)            {                args[i].lalk = new struct arg_s();                buffer[i] = new char[buflen2];            }            int i = -1;            while (++i < maxclients)            {                Sleep(1);                args[i].current = i;                args[i].lalk->exit = false;                thread[i] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)(session_), args, 0, 0);            }                for (int i = 0; i < maxclients; i++)                    WaitForSingleObject(thread[i], INFINITE);//ждем завершения всех потоков            i = -1;            while (++i < maxclients)            {                shutdown(newsockfd[i], 0);                TerminateThread(thread[i], 0);            }            //delete[] newsockfd;            //free(thread);            currentclient = 0;            for (int i = 0; i < maxclients; i++)            {                //delete args[i].lalk;                //delete[] args[i].lalk->buffer;            }            //delete[] args;        }        shutdown(sockfd, 0);        WSACleanup();        return 0;    }    std::cin.ignore();}

Вкратце в вечном цикле создаются потоки для каждого клиента и ждут accept пока клиенты подключится. После чего WaitForSingleObject ждет пока они все передадут. У каждого клиента свой сокет и свой буфер передачи. То есть на сервере M+1 сокет, где M количество клиентов. После завершения всех передач, всё повторяется.

Теперь рассмотрим клиент:

#include <iostream>#include <WinSock.h>#include <vector>#pragma comment (lib,"WS2_32.lib")void error(const char* msg){    //perror(msg);    std::cout << '\n' << WSAGetLastError();    WSACleanup();    std::cin.ignore();    exit(1);}void bzero(char* buf, int l){    for (int i = 0; i < l; i++)        buf[i] = '\0';}typedef unsigned long long uint64_t;typedef unsigned int uint32_t;#define N 8#define F32 0xFFFFFFFFuint32_t RK[N];//раундовые ключи#define size64 sizeof(uint64_t)#define ROR(x,n,xsize)((x>>n)|(x<<(xsize-n)))#define ROL(x,n,xsize)((x<<n)|(x>>(xsize-n)))#define RKEY(r)((ROR(K,r*3,size64*8))&F32)const uint64_t K = 0x96EA704CFB1CF671;//ключ шифрованияvoid createRoundKeys(){    for (int i = 0; i < N; i++)        RK[i] = (ROR(K, i * 8, size64 * 8)) & F32;}uint32_t F(uint32_t subblk, uint32_t key){    return subblk + key;//функция шифрования}uint64_t encrypt(uint64_t block)//зашифровка блоков сетью Фейстеля{    //select subblocks    uint32_t left = (block >> 32) & F32;    uint32_t right = block & F32;    uint32_t left_, right_;//subblock in the end of round    for (int r = 0; r < N; r++)    {        uint32_t fk = F(left, RK[r]);        left_ = left;        right_ = right ^ fk;        if (r < N - 1)//swap places to next round        {            left = right_;            right = left_;        }        else//last round not swap        {            left = left_;            right = right_;        }    }    //collect subblock in block    uint64_t c_block = left;    c_block = (c_block << 32) | (right & F32);    return c_block;}int main(){    keybd_event(VK_LWIN, 0, 0, 0);    keybd_event('M', 0, 0, 0);    keybd_event('M', 0, KEYEVENTF_KEYUP, 0);    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);//эти строки сворачивают все приложения    Sleep(1000);//чтобы сделать скриншот рабочего стола    WSADATA ws = { 0 };    if (WSAStartup(MAKEWORD(2, 2), &ws) == 0)    {        int sockfd;        sockfd = socket(AF_INET, SOCK_STREAM, 0);        struct sockaddr_in serv_addr, cli_addr;        bzero((char*)&serv_addr, sizeof(serv_addr));        bzero((char*)&cli_addr, sizeof(cli_addr));        serv_addr.sin_family = AF_INET;        const char* add = "127.0.0.1";//адрес сервера        serv_addr.sin_addr.s_addr = inet_addr(add);        int port = 30000;//порт        serv_addr.sin_port = htons(port);        int servlen = sizeof(serv_addr);        int n = connect(sockfd, (struct sockaddr*)&serv_addr, servlen);                //ниже код делает скриншот        HDC ScreenDC = GetDC(0);        HDC MemoryDC = CreateCompatibleDC(ScreenDC);        int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);        int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);        ScreenWidth = ((ScreenWidth - 1) / 4 + 1) * 4;        BITMAPINFO BMI;        BMI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);        BMI.bmiHeader.biWidth = ScreenWidth;        BMI.bmiHeader.biHeight = ScreenHeight;        BMI.bmiHeader.biSizeImage = ScreenWidth * ScreenHeight * 3;        BMI.bmiHeader.biCompression = BI_RGB;        BMI.bmiHeader.biBitCount = 24;        BMI.bmiHeader.biPlanes = 1;        DWORD ScreenshotSize;        ScreenshotSize = BMI.bmiHeader.biSizeImage;        unsigned char* ImageBuffer;        HBITMAP hBitmap = CreateDIBSection(ScreenDC, &BMI, DIB_RGB_COLORS, (void**)&ImageBuffer, 0, 0);        SelectObject(MemoryDC, hBitmap);        BitBlt(MemoryDC, 0, 0, ScreenWidth, ScreenHeight, ScreenDC, 0, 0, SRCCOPY);        DeleteDC(MemoryDC);        ReleaseDC(NULL, ScreenDC);        FILE* sFile = 0;        unsigned char tgaHeader[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };        unsigned char header[6];        unsigned char tempColors = 0;        fopen_s(&sFile, "S.tga", "wb");        if (!sFile) {            exit(1);        }        header[0] = ScreenWidth % 256;        header[1] = ScreenWidth / 256;        header[2] = ScreenHeight % 256;        header[3] = ScreenHeight / 256;        header[4] = BMI.bmiHeader.biBitCount;        header[5] = 0;        fwrite(tgaHeader, 1, sizeof(tgaHeader), sFile);        fwrite(header, sizeof(header), 1, sFile);        //конец записали изображение в файл                //шифруем блоками полезную нагрузку изображения кроме хидеров        createRoundKeys();        std::vector<uint64_t>* msg = new std::vector<uint64_t>(),*crpt = new std::vector<uint64_t>();        unsigned long long id;        int i = 0;        while (i < BMI.bmiHeader.biSizeImage)        {            memcpy(&id, (ImageBuffer + i), N);            msg->push_back(id);            i += 8;        }        std::cout << "i=" << i << std::endl;         uint64_t cipher;        i = 0;        char str_[N + 1];        memset(str_, 0, N);        str_[N] = '\0';        for (std::vector<uint64_t>::iterator it = msg->begin(); it != msg->end(); ++it)        {            cipher = encrypt(*it);            memcpy(str_, &cipher, N);            fwrite((unsigned char*)str_, sizeof(unsigned char), N, sFile);            i += 8;        }        std::cout << "i=" << i << std::endl;        //        //fwrite(ImageBuffer, BMI.bmiHeader.biSizeImage, 1, sFile);        std::cout << BMI.bmiHeader.biSizeImage << std::endl;        fclose(sFile);        DeleteObject(hBitmap);        FILE* f;        fopen_s(&f, "S.tga", "rb");        int count = 0;        if (f != NULL)        {            while (getc(f) != EOF)                count++;//считаем байты изображения в счетчик чтобы потом передать            fclose(f);        }        count -= 18;        std::cout << count<< std::endl;        char* s = new char[100];        _itoa_s(count, s, 100, 10);        n = send(sockfd, s, 100, 0);//передаем счетчик        char* buffer = new char[count];        fopen_s(&f, "S.tga", "rb");        size_t bytes;        if (f != NULL)        {            memcpy(buffer, tgaHeader, sizeof(tgaHeader));            n = send(sockfd, buffer, sizeof(tgaHeader), 0);            bzero(buffer, count);            memcpy(buffer, header, sizeof(header));            n = send(sockfd, buffer, sizeof(header), 0);            bzero(buffer, count);//передаем хидеры            for(int i=0;i<18;i++)                fgetc(f);            bzero(buffer, count);            bytes = fread(buffer, sizeof(unsigned char), count, f);            n = send(sockfd,buffer, count, 0);//передаем шифрованные байты изображения            fclose(f);        }        Sleep(1000);        shutdown(sockfd, 0);        WSACleanup();        //system("del S.tga");        delete[] buffer,s;        return 0;    }    //std::cin.ignore();}

Вот результат работы клиента файл скриншота S.tga, зашифрованный

Видно, что это рабочий стол

А вот результат который был передан на сервер и расшифрован Screen.tga

Как видите обычная сеть Фейстеля не подходит для шифрования, но можно воспользоваться CBC и CFB методами, возможно будет лучше зашифровано, если честно не проверял.

Спасибо за внимание!

Подробнее..

Удаляем фон с изображений с помощью бесплатного API

08.03.2021 22:21:25 | Автор: admin

Background Cleaner API полностью бесплатный API для удаления фона с изображений с помощью нейросети. Его можно назвать бесплатным аналогом известного remove.bg.

Данный API, в отличии от вышеупомянутого remove.bg, не накладывает никаких ограничений на число запросов. Нейросеть вернёт обрезанное изображение в исходном качестве.

Адрес API-сервиса:http://roughs.ru/api/remove-bg
Поддерживаются как GET, так и POST запросы.

Для обрезки фона изображения необходимо передать параметрurl, содержащий адрес изображения в сети. Форматы изображений: JPEG, PNG.

Пример запроса:

http://roughs.ru/api/remove-bg?url=https://cdn.wallpapersafari.com/43/39/Vih9G5.jpg

Данный API позволяет без особого труда создавать утилиты и плагины для дизайнерских программ, сайтов и прочих сервисов, направленных на работу с фотографиями. Например, я использую его для создания простого эффекта боке.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru