<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Tatiana Gaintseva</title><generator>teletype.in</generator><description><![CDATA[Разбираю научные статьи по AI. 
Тг-канал: https://t.me/dl_stories]]></description><image><url>https://img2.teletype.in/files/1c/1a/1c1a0fa7-de49-4811-a6b3-0e3a62bd88fd.png</url><title>Tatiana Gaintseva</title><link>https://teletype.in/@atmyre</link></image><link>https://teletype.in/@atmyre?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/atmyre?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/atmyre?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 30 Apr 2026 21:55:11 GMT</pubDate><lastBuildDate>Thu, 30 Apr 2026 21:55:11 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@atmyre/1dZUxGS4yag</guid><link>https://teletype.in/@atmyre/1dZUxGS4yag?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre</link><comments>https://teletype.in/@atmyre/1dZUxGS4yag?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre#comments</comments><dc:creator>atmyre</dc:creator><title>PhD в Лондоне: важные моменты</title><pubDate>Sat, 26 Oct 2024 15:42:13 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1a/0d/1a0d6372-b935-4d2b-970c-bcff44ed3a0d.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/55/df/55dfbaf7-cb5f-4b61-a767-16a0614923de.jpeg"></img>В ноябре будет два года, как я на PhD в Queen Mary University of London. В этом посте опишу некоторые моменты, которые стоит учитывать, если рассматриваете PhD в UK.]]></description><content:encoded><![CDATA[
  <figure id="J227" class="m_original">
    <img src="https://img2.teletype.in/files/55/df/55dfbaf7-cb5f-4b61-a767-16a0614923de.jpeg" width="600" />
  </figure>
  <p id="bzWj">В ноябре будет два года, как я на PhD в <a href="https://www.qmul.ac.uk" target="_blank">Queen Mary University of London</a>. <strong>В этом посте опишу некоторые моменты, которые стоит учитывать, если рассматриваете PhD в UK.</strong></p>
  <p id="axB5">Скажу сразу: когда я выбирала место для PhD, я по личным причинам рассматривала только Лондон. Поэтому я не особо погружалась в нюансы и различия между PhD программами в UK и в других странах. А зря =( Общую идею поста, наверное, можно подвести так: <strong>если бы я заранее осознавала моменты, описанные ниже, я бы выбрала поехать куда-то еще</strong>.</p>
  <p id="bljv">Ну и Disclaimer: я пишу это на основе своего опыта, где-то я могу чего-то не знать. И я могу судить только о PhD в области AI, о других программах не скажу (хотя все моменты, описанные ниже, именно к AI непосредственно не относятся, они общие).</p>
  <p id="vQIj"><strong>Итак:</strong></p>
  <ol id="18jL">
    <li id="tErP">В UK нет (ну или много где нет, за все места прямо не скажу) финансирования PhD позиций от университета. То есть, <strong>если ты хочешь пойти на PhD в какую-то лабу, то нужно искать себе грант/стипендию</strong>. Таких стипендий, конечно, не сильно мало (например, <a href="https://www.qmul.ac.uk/scholarships/database/" target="_blank">вот список</a> тех, что есть в моем универе), но все же. Нужно найти среди них те, под которые ты подходишь, податься, и ждать результат. Я еще слышала о ситуациях, когда научник готов был взять студента в лабу в одном из UK универов, но с условием, что студенту нужно самому найти себе финансирование.<br /><br />Мой PhD, например, финансируется DeepMind, я подавала на эту стипендию отдельно от договоренностей с научником и проходила конкурс. Из моей PhD группы у пары людей тоже стипендии от компаний, одна девочка финансируется организацией из ее страны (и ей потом нужно вернуться и это финансирование отработать).<br /><br />Еще бывают стипендии, которые покрывают косты на обучение, но не дают стипендии — живи на что хочешь. Я говорила с одним студентом из соседней группы, у которого такой грант. Спрашивала его, как же он живет. Оказалось, у его мамы в Лондоне квартира, и она же высылает ему деньги на жизнь ¯\_(ツ)_/¯</li>
    <li id="qD2g"><strong>Если даже по вашему гранту стипендия все-таки есть, то она очень маленькая</strong>, а жизнь в Лондоне ппц дорогая. И это не только про цены на молоко и кофе, аренда в Лондоне — просто жопа. Стандартная стипендия, которая дается большинством грантов — £1715 в месяц. В Лондоне на это выжить ну ооочень сложно.</li>
    <li id="fXix"><strong>Даже если грант получен, он часто дается только на 3 (три!!) года</strong>. Сделать хороший PhD за три года – это какое-то чудо, это очень сложно. Насколько я слышу вокруг, PhD занимает в среднем 4 года, но многие в итоге делают его 5 или 6 лет. И это нормально: если уж ты пошел на PhD, то хочется сделать <em>хороший</em> PhD, а не какой попало. И, если подумать, три года на такой путь — это очень мало. Учитывая еще, что у многих в начале PhD бывает стресс. Ну и разные жизненные обстоятельства, влияющие на продуктивность в любой другой момент жизни, никто не отменял.<br /><br />Справедливости ради, любой PhD в UK рассчитан на 4 года. Т.е. ожидается, что ты защитишься ровно через 4 года после начала, а не через 3. Но после трех лет ты должен перейти на writing-up stage, т.е. сказать универу, что &quot;все, я приступаю к написанию диссера&quot;. Учитывая, что написание и защита диссера — процесс не быстрый, на это типа дается год. И в этот последний год у тебя еще и нет стипендии, и приходится уже искать работу.<br /><br />Недавно я еще узнала, <strong>почему так устроено, что финансирование дается на 3 года</strong>. Оказывается, в UK у универов есть метрика, или даже требование: нужно, чтобы PhD студенты заканчивали диссер не позже чем через 4 года. Мой научник дословно сказал фразу &quot;universities are punished if it takes somebody more than 4 years&quot;. Я, если честно, вообще не понимаю, что это за бред, потому что, еще раз: PhD  — сложный процесс, у всех разный, и хочется сделать его хорошо, а не просто сделать.<br /><br />Единственное, как можно продлить время PhD — ездить на стажировки. Это время в те 4 года не считается. Моя стипендия тоже только на 3 года, и поэтому прямо сейчас я на стажировке в лондонском Huawei, и планирую найти еще одну на лето. Но тут тоже есть огромнейший нюанс — на студенческой визе в UK нельзя работать full-time, только 20 часов в неделю. А еще, чтобы время стажировки не считалось в 4 года PhD, нужно просить interruption of studies. А когда просишь interruption of studies, универ сообщает об этом в UKVI (UK Visas and Immigration), и они могут попросить тебя свалить из страны, потому что ты же на студенческой визе, а чет не учишься 🫠<br />Поэтому варианты тут такие: <br />- ехать на стажировку в другую страну, где тебе сделают визу, просить на это время  interruption of studies в UK;<br />- проходить стажировку в UK на 20 часов, но тогда это время не вычтется из этих 4 лет;<br />- менять визу в UK со студенческой на другую. Например, Global Talent. Но и тут, блин, есть проблема: в июле 2023 года вышла поправка к положению Global Talent визы, которая запрещает PhD студентам менять визу на GT или любую другую work-related визу, пока не пройдут два года PhD. Запрет смены визы на любую work-related также означает, что вы не можете сделать себе временную work визу на период стажировки. Этот вариант становится доступен только на третий год PhD, а в первые два года сделать interruption of studies и пойти на full-time стажировку внутри UK не выйдет.<br /><br />Я сама напоролась на эту подставу с GT визой в прошлом году. Я получила endorsement (справку о том, что я талант) в июне 2023 года, и с ней в июле подалась на смену визы. И за 5 дней до моей подачи вышла эта поправка, которая запретила PhD студентам переходить на GT до истечения двух лет PhD. О ней нигде не сообщали, я об этом не знала. В итоге у меня в UK есть официальный отказ по визе, из-за которого каждый раз при въезде в UK меня теперь проверяют с фразой &quot;у вас был отказ, I need to investigate&quot;<br /><br />В данный момент у меня проходят два года PhD, я снова подалась на GT, и надеюсь, что в этот раз мне ее одобрят. Нужно это мне как раз за тем, чтобы сделать interruption of studies на время моей стажировки в Huawei, и продлить PhD хотя бы месяца на 3.</li>
    <li id="p2GZ">Есть еще неприятный момент по UK в целом: UK не отосится к шенгенской зоне. То есть, в Европу поехать просто так нельзя. А учитывая текущие сложности с шенгенскими визами для россиян, сейчас это особенно неприятно. Например, для поездки на конфу в Милан мне пришлось бронить поездку в Испанию (что стоит денег), подаваться на визу за £100, и все это чтобы получить визу на 15 дней пребывания 🫠<br /><br />Смешно еще то, что теперь даже в Ирландию поехать по UK визе нельзя (ну, можно только в Северную Ирландию, которая часть UK).</li>
    <li id="FRnD">Студенческая виза в UK не ведет к ВНЖ и гражданству. Это время не считается вообще. Для меня это не играет сильной роли, но для кого-то может. </li>
  </ol>
  <p id="CDQl">Для сравнения, <strong>ситуация по PhD в Европе по всем пунктам другая</strong>. Там в большинстве мест есть финансирование позиций от универа, размер стипендии относительно cost of living гораздо лучше, и PhD спокойно можно делать лет так 6. Ну и если делать PhD в Европе, то по этой самой Европе можно спокойно перемещаться. А еще часто студенческие годы в Европе засчитываются для получения ВНЖ или паспорта. Например, в Германии год по студенческой визе считается за полгода для паспорта.</p>
  <p id="6QYg"></p>
  <p id="W6MD">Это были <s>горения жопы</s> минусы по PhD в UK. Справедливости ради, <strong>давайте попробуем найти плюсы</strong>. На мой взгляд, они такие: </p>
  <ul id="mrdV">
    <li id="qoJh">UK и Лондон в частности — довольно большой AI-хаб. Тут много компаний, с которыми можно взаимодействовать, ходить на ивенты и стажировки (subject to см. пункт 3 выше). Также из-за этого тут большое коммьюнити AI-related людей, включая русскоязычные. Можно найти митап/ивент и профессиональный круг общения на любой вкус;</li>
    <li id="jbXY">Возможность получить Global Talent визу (но после двух лет PhD). Это хорошая виза для тех, кто хочет возможность делать почти что угодно в UK и получить ВНЖ/паспорт через 3-5 лет. </li>
    <li id="vN9Y">Уровень университетов в UK в целом довольно высок, есть много хороших профессоров и сильных лаб.</li>
  </ul>
  <p id="1TnF"></p>
  <p id="dp4Q">Пока что это все, что приходит на ум. Спасибо, что дочитали! Если вам есть, что добавить/исправить в посте, пишите в тг @atmyre.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@atmyre/NXEHPCIxZJz</guid><link>https://teletype.in/@atmyre/NXEHPCIxZJz?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre</link><comments>https://teletype.in/@atmyre/NXEHPCIxZJz?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre#comments</comments><dc:creator>atmyre</dc:creator><title>Новый подход к CLIP guidance для задачи backlit image enhancement.</title><pubDate>Wed, 02 Oct 2024 21:41:00 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/95/e2/95e20450-b918-4ce3-b690-dfd26f5d21fc.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/d7/a3/d7a3401f-ec88-45be-8122-4327d50cb11b.png"></img>Тут я расскажу о своей статье, которая опубликована на ECCV-2024. Она называется RAVE: Residual Vector Embedding for CLIP-Guided Backlit Image Enhancement. Это статья о новом способе использовать CLIP guidance для обучения модели улучшения засвеченных картинок (backlit image enhancement). На картинке выше — пример засвеченных и восстановленных картинок. Тут надо, правда, сказать, что идею из статьи можно использовать не только для задачи backlit image enhancement, но и для других задач, связанных с улучшением картинок. Но в статье эксперименты ставились именно на этой задаче, поэтому называется статья именно так.]]></description><content:encoded><![CDATA[
  <figure id="nkAC" class="m_column">
    <img src="https://img2.teletype.in/files/d7/a3/d7a3401f-ec88-45be-8122-4327d50cb11b.png" width="2856" />
  </figure>
  <p id="YjB9">Тут я расскажу о своей статье, которая опубликована на <strong>ECCV-2024</strong>. Она называется <strong>RAVE: Residual Vector Embedding for CLIP-Guided Backlit Image Enhancement</strong>. Это статья о новом способе использовать CLIP guidance для обучения модели улучшения засвеченных картинок (backlit image enhancement). На картинке выше — пример засвеченных и восстановленных картинок. Тут надо, правда, сказать, что <strong>идею из статьи можно использовать не только для задачи backlit image enhancement, но и для других задач, связанных с улучшением картинок.</strong> Но в статье эксперименты ставились именно на этой задаче, поэтому называется статья именно так. </p>
  <p id="rYah"><strong>Сразу ссылки:</strong></p>
  <p id="noy8"><a href="https://atmyre.github.io/rave/" target="_blank">Project page</a></p>
  <p id="3XPC"><a href="https://arxiv.org/pdf/2404.01889" target="_blank">Paper</a></p>
  <p id="ooTC"><a href="https://github.com/Atmyre/RAVE/tree/main" target="_blank">GitHub </a>(буду рада звездочкам🌝)</p>
  <p id="ZMNR">И небольшой тизер: по сравнению с SOTA методом CLIP-LIT, который RAVE улучшает, <strong>RAVE выдает картинки лучшего визуального качества без артефактов</strong>. Ниже пара примеров. А еще <strong>вектор, который строится в RAVE, интерпретируем</strong>! Об этом всем подробно — ниже в этой статье.</p>
  <figure id="GwRc" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/53/56/5356590e-b32a-426e-bed1-eba22948fe69.png" width="1354" />
    <figcaption>Сравнение результатов CLIP-LIT и RAVE на картинках с сильным затемнением</figcaption>
  </figure>
  <p id="RyL6"></p>
  <h2 id="10oX">Описание метода</h2>
  <p id="TuRe"></p>
  <p id="4yiH">Идея RAVE основана на другой статье (не моей), которая была представлена на ICCV-2023. Это статья <a href="https://zhexinliang.github.io/CLIP_LIT_page/" target="_blank">Iterative Prompt Learning for Unsupervised Backlit Image Enhancement</a>. Она тоже про то, как использовать CLIP guidance для задачи backlit image enhancement. Метод из этой статьи называется CLIP-LIT. Я прочитала эту статью и у меня возник вопрос: <strong>а зачем так сложно?</strong> Можно же проще. И, как оказалось, еще и лучше по качеству. Так и родилась моя статья.</p>
  <p id="xUUt">Сейчас кратко разберу, в чем идея подхода CLIP-LIT. И затем перейдем к двум идеям его улучшения, которые и вошли в мою статью.</p>
  <h3 id="j5Ew">CLIP-LIT</h3>
  <p id="OWjb">Итак, как работает <a href="https://zhexinliang.github.io/CLIP_LIT_page/" target="_blank">CLIP-LIT</a>. </p>
  <p id="zkIm">Давайте мы будем учить UNet (enhancement network на картинке), который принимает на вход засвеченную (backlit) картинку, а выдает на выходе восстановленную (enhanced). Если у нас в обучающих данных есть пары (backlit img, well-lit img), которые соответствуют дргу другу, то мы могли бы учить этот UNet втупую, подавая ему backlit картинку на вход и сравнивая выход с well-lit картиной. Но давайте представим, что у нас в тренировочных данных нет таких пар. Есть кучка каких-то backlit картинок и кучка well-lit картинок, которые могут иметь совершенно другую семантику. Назовем этот сетап unpaired data.</p>
  <figure id="T0hR" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c7/24/c7243d3b-1a2f-4003-8617-b415fb6d7f60.png" width="1446" />
    <figcaption>Initial pseudo prompts and enhancement model training</figcaption>
  </figure>
  <p id="ZZs3">В этом случае давайте учить UNet с помощью двух лоссов:</p>
  <ul id="jipq">
    <li id="syoh">identity loss, который не позволяет картинке сильно далеко отходить от изначальной (т.е. помогает сохранить семантику нетронутой)</li>
    <li id="ynE7"> CLIP-Guided Loss, который заставляет UNet делать из backlit картинки well-lit картинку.</li>
  </ul>
  <p id="a2r6"><strong>Вот в  CLIP-Guided Loss и вся соль.</strong> Авторы CLIP-LIT строят его так:</p>
  <ul id="x4py">
    <li id="Frqz">Давайте заведем два псевдо-промпта: positive и negative. На основе тренировочных backlit и well-lit картинок будем учить эти промпты так, чтобы CLIP-эмбеддинг positive промпта был близок по косинусному расстоянию к CLIP-эмбеддингам well-lit картинок, а CLIP-эмбеддинг negative промпта был близок к CLIP-эмбеддингам backlit картинок.</li>
    <li id="pwW4">Теперь используем выученные эмбеддинги для обучения UNet. Делаем это так: подаем в UNet backlit картинку, получаем enhanced картинку на выходе. Получаем CLIP-эмбеддинг enhanced картинки. Сравниваем его по косинусному расстоянию с эмбеддингами выученных positive и negative промптов. Требуем, чтобы расстояние до positive промпта было ближе, чем расстояние до negative промпта.</li>
  </ul>
  <p id="ssLH">Но это еще не все: <strong>после этих двух шагов результаты получаются такие себе.</strong> Поэтому авторы предлагают сделать несколько итераций этих двух пунктов. Т.е. после первичного обучения промптов и UNet вернуться к дообучению псевдо-промптов, используя картинки из датасета и картинки, которые UNet выдает на данном этапе обучения. Там аж 4 лосс-функции, которые используются для более оптимального дообучения этих промптов. И чтобы получить UNet, который будет хорошо восстанавливать засвеченные картинки, нужно где-то 10-12 итераций этих двух пунктов. Вот иллюстрация к этим итерациям дообучения:</p>
  <figure id="MZIP" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/17/5e/175ea0a3-4194-401a-8f21-90cb434a5c94.png" width="1448" />
    <figcaption>Pseudo prompts and enhancement model fine-tuning</figcaption>
  </figure>
  <p id="7W2b">Сразу можно сказать, что <strong>обучение CLIP-LIT довольно нестабильное:</strong> от итерации к итерации улучшенные картинки получаются то пересвеченные, то обратно слишком темные. Скорее всего, это потому, что от итерации к итерации меняются псевдо-промпты, а их обучение довольно нестабильно и неточно. Неточно в том плане, что при таком виде обучения псевдо-промпты никогда не будут идеально отражать смыслы backlit и well-lit картинок. Из-за этой нестабильности и требуется так много итераций обучения, прежде чем получится нормальный результат.</p>
  <p id="UwrA">Вот такая идея у CLIP-LIT. Теперь перейдем к тому, что в этой идее странного и как ее улучшить. Идеи будут две — CLIP-LIT-Latent, и, собственно, RAVE. Идея CLIP-LIT-Latent очень простая и тупая, а RAVE уже поинтереснее.</p>
  <p id="4Ggd">Начнем с первой.</p>
  <h3 id="DWxi">CLIP-LIT-Latent</h3>
  <p id="iqIq">Давайте посмотрим еще раз на то, что делает CLIP-LIT, и подумаем: <strong>а зачем нам псевдо-промпты?</strong> Они же нужны, чтобы сравнивать их CLIP-эмбеддинги с эмбеддингами картинок. <strong>Почему бы тогда не учить что-то прямо внутри латентного пространства CLIP?</strong></p>
  <p id="RwJp">То есть, первая идея упрощения подхода приходит такая: давайте вместо псевдо-промптов учить сразу псевдо-векторы внутри CLIP embedding space. Т.е. типа сразу выучивать эмбеддинги этих промптов. Тогда мы сможем вообще выкинуть CLIP text encoder и не делать лишние движения типа &quot;прогоним псевдо-промпты через CLIP text encoder, чтобы получить их эмбеддинги&quot;. Назовем этот подход CLIP-LIT-Latent.</p>
  <p id="AHuW">Общая идея, получается, такая: <strong>зачем учить что-то, что дает хорошие фичи при прогоне через какое-то сложное преобразование, когда можно учить эти фичи сразу напрямую? </strong>Под сложным преобразованием здесь понимается CLIP Text Encoder.</p>
  <p id="9dEP">Вот картинка со сравнением CLIP-LIT и CLIP-LIT-Latent:</p>
  <figure id="ndHK" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/97/25/97257552-2ada-482e-bc21-04bfadc597e0.png" width="1888" />
    <figcaption>Иллюстрация CLIP-LIT и CLIP-LIT-Latent</figcaption>
  </figure>
  <p id="8IQv">CLIP-LIT-Latent дает такие же по качеству результаты, что и оригинальный CLIP-LIT (как по метрикам, так и по визуальной оценке получаемых картинок). Обучение только занимает чуть-чуть меньше времени, потому что нам больше не надо кучу раз проталкивать псевдо-промпты через CLIP Text Encoder. Заметим, что для получения хороших результатов в CLIP-LIT-Latent тоже нужно делать итерации дообучения латентных векторов и UNet, и обучение тоже не очень стабильное. </p>
  <p id="HAvH">Получается, <strong>CLIP-LIT-Latent просто чуть упрощает модель, сохраняя все остальные ее свойства</strong>.</p>
  <p id="nemM">Перейдем теперь ко второй идее улучшения CLIP Guidance, которую мы назвали RAVE.</p>
  <h3 id="U7kX">RAVE</h3>
  <p id="8TGt">Вспомним теперь, что на эмбеддингах латентного пространства CLIP определена метрика — косинусное расстояние. Косинусое расстояние линейно. Это значит, что над эмбеддингами в латентном пространстве CLIP можно проводить арифметику — например, отнять от одного вектора другой, и полученный вектор будет иметь смысл. </p>
  <p id="ndlt">RAVE использует это свойство латентного пространства CLIP. В RAVE мы не будем обучать никакие псевдоним-векторы или псевдо-промпты. Вместо это сделаем вот что: </p>
  <ul id="QeER">
    <li id="ObBw">Возьмем backlit картинки из обучающего датасета. Получим их CLIP-эмбеддинги. Усредним, получим один усредненный CLIP-эмбеддинг backlit картинок <code>v_backlit</code>;</li>
    <li id="bieB">Возьмем well-lit картинки из обучающего датасета. Получим их CLIP-эмбеддинги. Усредним, получим один усредненный CLIP-эмбеддинг well-lit картинок <code>v_well-lit</code>;</li>
    <li id="tlp6">Отнимем от вектора <code>v_well-lit </code> вектор <code>v_backlit. </code>Получим вектор <code>v_residual</code>. Этот вектор в латентном пространстве CLIP будет иметь смысл перехода от backlit к well-lit изображениям. Действительно, этот вектор содержит в себе те смыслы, что есть в well-lit картинках, но нет в backlit картинках. А это и есть смысл &quot;backlit -&gt; well-lit&quot;.</li>
  </ul>
  <p id="FSKC">В итоге формула получения <code>v_residual</code> такая:</p>
  <figure id="acn5" class="m_custom">
    <img src="https://img3.teletype.in/files/25/96/2596be16-0307-407a-9d01-3dad762dd4a5.png" width="415" />
  </figure>
  <p id="HBkm"><code>f_norm</code> здесь — <em>L2-</em>нормализация вектора. <code>Ф_image</code> — CLIP Image Encoder. <code>N_p</code> — количество well-lit картинок в обучающих данных, <code>N_n</code> — количество backlit картинок в обучающих данных.</p>
  <p id="B7yW">Проиллюстрировать это можно так:</p>
  <figure id="ue6r" class="m_custom">
    <img src="https://img3.teletype.in/files/23/b8/23b8ead5-681a-4587-92c4-1a05c0036bbc.png" width="428.5263157894737" />
  </figure>
  <p id="dFRF">Этот вектор <code>v_residual </code>мы и будем использовать для обучения UNet. Guidance с помощью  <code>v_residual</code>  устроен следующим образом: получаем картинку, которую выдает UNet, получаем ее CLIP-эмбеддинг <code>v_enhanced</code>. Лосс-функция заставляет  косинусое расстояние между <code>v_enhanced</code> и <code>v_residual</code>быть таким же, как и косинусое расстояние между  <code>v_well-lit</code> и <code>v_residual.</code> </p>
  <figure id="7eEr" class="m_custom">
    <img src="https://img3.teletype.in/files/ea/8c/ea8c62f2-ca02-4309-b8dc-7a010a03c395.png" width="510" />
  </figure>
  <p id="j4cs">Иными словами, мы хотим, чтобы картинка, которую выдает UNet, имела CLIP-эмбеддинг, близкий к CLIP-эмббедингам well-lit картинок. Мы &quot;двигаем&quot; поданную на вход backlit картинку по пространству эмбеддингов CLIP вдоль вектора <code>v_residual</code> от части пространства, где находятся эмбеддинги backlit картинок, к части пространства, где находятся эмбеддинги well-lit картинок. </p>
  <p id="mhTr">Общая иллюстрация метода тогда выглядит так:</p>
  <figure id="0tc4" class="m_column">
    <img src="https://img4.teletype.in/files/7e/f9/7ef9040b-87c5-45aa-bc15-1f1e380862a6.png" width="1468" />
  </figure>
  <p id="IOwP"><strong>Преимущества RAVE:</strong></p>
  <ul id="tjqy">
    <li id="VRJt">Не надо обучать промпты/векторы, только обучаем UNet;</li>
    <li id="JTrh">Не нужно делать много итераций обучения, обучение сходится очень быстро;</li>
    <li id="fGLV">Обучение более стабильно (и, как следствие, быстрее) за счет того, что CLIP guidance устроен на основе вектора, который имеет достаточно четкий смысл, а не на основе псевдо-векторов или псевдо-промптов, которые неоптимально обучаются;</li>
    <li id="VDyo">Визуальная оценка результатов и метрики показывают, что RAVE работает лучше, чем CLIP-LIT и CLIP-LIT-Latent.</li>
  </ul>
  <h3 id="jJSB">Результаты</h3>
  <p id="Tsbm">Таблица со сравнением подходов по классическим метрикам для image enhancement (PSNR, LPIPS, SSIM, FID). Результаты для двух вариантов обучающих данных: paired (где для каждой backlit картинки есть соответствующая ей well-lit картинка) и unpaired (где backlit и well-lit картинки могут быть совершенно разные). В случае paired данных в таблице больше моделей для сравнения, чем в случае unpaired: это потому, что некоторые подходы просто нельзя обучить на unpaired данных. </p>
  <figure id="dyiY" class="m_column">
    <img src="https://img1.teletype.in/files/c9/a7/c9a7dca8-471e-4555-afa0-921fd1a6ece1.png" width="1714" />
  </figure>
  <p id="h13r">Видно, что в случае paired данных RAVE показывает лучшие результаты. В случае же unpaired данных у обычного RAVE результаты смешанные, но вот вариант RAVE shifted впереди по большинству метрик. Давайте поясню, почему так и что такое RAVE shifted.</p>
  <h3 id="AByv">Интерпретация v_residual</h3>
  <p id="k7o4">Давайте попробуем проинтерпретировать смысл вектора v_residual, который мы строим. Благо у CLIP совместное латентное пространство для картинок и текстов. Что мы можем сделать: давайте переберем все токены из словаря CLIP Text Encoder, и найдем те, эмбеддинги которых по косинусом расстоянию <em>ближе всего</em> и <em>дальше всего</em> от <code>v_residual</code>. Получим вот что:</p>
  <figure id="yV8X" class="m_column">
    <img src="https://img3.teletype.in/files/a6/54/a654ed26-ef4c-4adb-a059-4028241b4d5b.png" width="1776" />
  </figure>
  <p id="I4i9">Видно, что если считать <code>v_residual</code> на основе paired данных, то этот вектор очень хорошо отражает смысл перехода от backlit к well-lit картинкам: токены с самыми далекими от <code>v_residual</code> эмбеддингами имеют смысл вокруг &quot;dark&quot; — solhouette, darkness и т.п., а токены с самыми близкими к <code>v_residual</code> эмбеддингами не имеют какой-то общей семантики. Поэтому этот вектор так хорош при обучении UNet, и в случае paired данных результаты получаются хорошими. </p>
  <p id="yL70">А вот в случае unpaired данных у <code>v_residual</code> появляются какие-то странные смыслы. Токены с самыми далекими от <code>v_residual</code> эмбеддингами имеют смысл вокруг Азии, а токены с самыми близкими к <code>v_residual</code> эмбеддингами имеют смысл вокруг природы. Это произошло потому, что в unpaired обучающих данных backlit картинки были в основном картинками азиатских городов и людей, а на well-lit картинках была природа. Поэтому при вычислении <code>v_residual </code>семантика картинок не до конца схлопнулась, оставив ненужные смыслы. Поэтому в этом случае <code>v_residual </code>не отражает идеального направления в латентном пространстве CLIP, куда нужно двигать backlit картинки, и результаты RAVE в случае unpaired данных получаются чуть хуже (хотя все равно SOTA).</p>
  <p id="spJ7">Но <strong>тут есть простой хак, как это исправить</strong>. Давайте возьмем токены, эмбеддинги которых наиболее близки и наиболее далеки от <code>v_residual,</code> и удалим их смысл из  <code>v_residual.</code> Сделать это можно, например, так: возьмем 15 токенов, эмбеддинги которых наиболее близки к  <code>v_residual</code>, и 15 токенов, эмбеддинги которых наиболее далеки от  <code>v_residual, </code>и построим на их основе еще один вектор <code>v_add_residual</code>:</p>
  <figure id="tEpx" class="m_custom">
    <img src="https://img4.teletype.in/files/3b/fd/3bfd6725-6459-48fb-9ac7-729d842122b2.png" width="464.99999999999994" />
  </figure>
  <p id="9OBR">И дальше отнимем этот вектор от изначального <code>v_residual</code>:</p>
  <figure id="Xl0R" class="m_custom">
    <img src="https://img4.teletype.in/files/b1/23/b1238a2c-8050-44e0-b75b-4d52ebc1fb37.png" width="534" />
  </figure>
  <p id="f3RA">Теперь если мы похожим образом проинтерпретируем новый <code>v_residual,</code> то увидим, что ненужная семантика действительно исчезла, и вектор стал более похож по смыслу на тот, что получался в случае paired дата:</p>
  <figure id="6BQP" class="m_column">
    <img src="https://img3.teletype.in/files/a2/a5/a2a5d9c3-e4ec-4299-803b-6941f661a131.png" width="1722" />
  </figure>
  <p id="Wv43">Ну и результаты (как метрики, так и визуальное сравнение) показывают, что RAVE-shifted действительно работает лучше. </p>
  <p id="nzJD">Вот так вот. Ну и ниже немного картинок со сравнениями подходов.</p>
  <h3 id="F2pW">Визуальное сравнение</h3>
  <p id="O3z4">Больше примеров можно найти на <a href="https://atmyre.github.io/rave/" target="_blank">странице проекта</a> и в <a href="https://arxiv.org/pdf/2404.01889" target="_blank">статье</a>. </p>
  <figure id="9CuQ" class="m_custom" data-caption-align="center">
    <img src="https://img2.teletype.in/files/56/dc/56dc0dbe-3d46-4f46-9d9f-697b7700e98a.png" width="902.496" />
    <figcaption>Сравнение CLIP-LIT, CLIP-LIT-Latent и RAVE на примерах с сильным затемнением, Видно, что у RAVE не появляются зеленоватые артефакты в местах с сильным затемнением. </figcaption>
  </figure>
  <p id="6Kf9"></p>
  <figure id="sSwA" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/cc/8c/cc8c409d-a523-4046-9def-d866c6cd2e74.png" width="1578" />
    <figcaption>Еще примеры сравнения CLIP-LIT, CLIP-LIT-Latent и RAVE</figcaption>
  </figure>
  <figure id="EtYF" class="m_custom" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fc/ea/fcea0716-8b0a-47c2-8a11-39f91510e688.png" width="572" />
    <figcaption>Сравнение картинок, полученных при RAVE и RAVE shifted. Shifted вариант выдает более well-lit картинки</figcaption>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@atmyre/J6qcyBNcPcw</guid><link>https://teletype.in/@atmyre/J6qcyBNcPcw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre</link><comments>https://teletype.in/@atmyre/J6qcyBNcPcw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre#comments</comments><dc:creator>atmyre</dc:creator><title>Задача fake images detection</title><pubDate>Thu, 11 May 2023 20:16:43 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f3/4c/f34c4f53-acff-44e6-ac11-bb324b0b3b13.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/7b/4f/7b4f4773-cac1-4dff-a40c-4b0d3e53413d.png"></img>В этом посте я расскажу о задаче детекции сгенерированных изображений (fake image detection). Сначала мы поймем, почему эта задача не так проста, как кажется на первый взгляд, а затем разберем основные подходы к решению этой задачи. ]]></description><content:encoded><![CDATA[
  <p id="3VpY">В этом посте я расскажу о задаче <strong>детекции сгенерированных изображений (fake image detection). </strong>Сначала мы поймем, почему эта задача не так проста, как кажется на первый взгляд, а затем разберем основные подходы к решению этой задачи. </p>
  <h2 id="HGwE">В чем суть задачи и почему она не так проста </h2>
  <p id="MuZw">Задача fake image detection — отличить изображения, сгенерированные нейросетью, от реальных. В свете того, что в последнее время выходит много классных open-source моделек для генерации картинок, и генерируют они уже довольно качественно (вы только посмотрите на <a href="https://t.me/mishin_learning/1710" target="_blank">IF</a>!), задача начинает быть актуальной. Вспомним хотя бы картинку <a href="https://edition.cnn.com/style/article/pope-francis-puffer-coat-ai-fashion-lotw/index.html" target="_blank">Папы Римского в пуховике</a> и картинки <a href="https://newsone.com/playlist/trump-arrest-fake-photos/" target="_blank">Трампа за решеткой</a>: насколько я слышала, на них реально повелось много народу.</p>
  <p id="bzPA">Несмотря на актуальность задачи, с исследовательской точки зрения подступиться к ней не так просто. <strong>Главный нюанс — непонятно, как построить датасет и систему оценки моделей.</strong></p>
  <p id="EnBJ">Смотрите, мы, по сути, решаем задачу бинарной классификации: отличаем фейки от реальных картинок. Логично, что датасет должен состоять из двух видов картинок: реальных и фейковых. И вот тут начинаются проблемы:</p>
  <p id="T3JY">1️⃣ Моделей для генерации картинок много разных. И постоянно выходят новые. Если собрать датасет картинок из конкретных моделей и учить на нем нейронку, есть риск переобучить ее на эти конкретные модели. И когда выйдет новая генеративка IF-2.0, на ней детекция фейков работать не будет. Ну и смысла в таком детекторе, который детектит только картинки из конкретных моделей, нет.</p>
  <p id="nZVK">Эту проблему чаще всего решают так: собирают датасет фейковых картинок из нескольких моделей. И в тренировочной части оставляют фейки только из одной модели (например, ProGAN). А в тестовой части данных остаются фейки из всех других моделей — SD, Glide, других ГАНов, DALL-E и т.п. Таким образом проверяется то, что ваша модель для детекции может быть обучена на фейках из одной конкретной модели, но при этом научиться детектить фейки и из других генеративок.</p>
  <p id="odEQ">Такой принцип разделения данных на трейн и тест сейчас, насколько я вижу, стандартный для статей в области детекции фейков.</p>
  <p id="b8ma">2️⃣ Вторая проблема связана с балансированием фейковых и реальных картинок в датасете. Мы хотим, чтобы наша модель научилась отличать любые фейковые картинки от любых реальных. Для этого нужно убедиться, что в ваших данных реальные картинки отличаются от фейковых именно теми характеристиками, которые влияют на &quot;фейковость&quot;. А в остальном распределения фейковых и реальных картинок должны быть одинаковы. Если сделать датасет из реальных картинок попугаев и фейковых картинок слонов, нейросеть прекрасно обучится их разделять, но что-то мне подсказывает, что на картинках вне этого датасета она хорошо работать не будет)</p>
  <p id="UOq8">А сбалансировать датасет сложно. Нужно придумать такой принцип генерации данных, чтобы можно было из разных генеративных моделей генерировать максимально разнообразные, но похожие между собой по распределению данные. Задача еще усложняется тем, что некоторые модели генерят картинки на основе текста, а некоторые — нет.</p>
  <p id="x8bM">3️⃣ Третья проблема такая: мы хотим, чтобы наша модель для детекции работала &quot;в полевых условиях&quot;. То есть, детектила фейки в интернете и где угодно. А в интернете картинки проходят 100500 стадий изменений: где-то они сжимаются (тот же jpeg), где-то на них накладывается шум. Да и сами люди после генерации картинки нейросетью могут изменять ее: накладывать фильтры или править что-то в фотошопе. Все это меняет характеристики картинки, и может сломать модели для детекции. Кажется, что решение — это добавить в датасет картинки, измененные разными способами, но этих способов — просто уйма. Поэтому вместо этого хочется уметь создавать модели, робастные к подобным изменениям. А эту робастность нужно уметь проверять — и тут тоже непонятно, какой протокол тестирования этой робастности выбрать.</p>
  <p id="Q5tt">4️⃣ А можно же не только генерить картинки с нуля, но и изменять реальные картинки. И получать фейки. И тут непонятно, учитывать ли такие &quot;полуфейковые&quot; картинки в подобных датасетах, или нет. И насколько картинка должна быть &quot;изменена&quot;, чтобы считать ее фейком.</p>
  <p id="XJ6X">Из-за подобных проблем какого-то общепринятого бенчмарка (датасета) для задачи fake image detection пока нет. Ну, или я его не нашла. Каждая статья, которую я читала, придумывала свой датасет, собранный вручную авторами. В последней <a href="https://arxiv.org/pdf/2302.10174.pdf" target="_blank">статье,</a> которую я видела (будет на CVPR-23, кстати!) авторы вообще не сказали, как именно они генерили свой датасет ¯\_(ツ)_/¯ Они, правда, его выложить обещали, посмотрим)</p>
  <p id="vs6O"></p>
  <p id="3Ty2"><strong>Ну и еще к описанию задачи можно добавить два замечания:</strong></p>
  <ul id="uR81">
    <li id="lFyN">Задача fake image detection очень похожа на задачу deepfake detection. Отличие в том, что под &quot;дипфейками&quot; обычно понимают картинки или видео <em>людей</em>, которые либо сгенерированы с нуля, либо изменены. Вот по этой задаче литературы и датасетов уйма. Конечно, модели для deepfake detection заточены именно под дипфейки (т.е. картинки людей), но некоторые идеи, может быть, можно использовать и в более общей задаче fake image detection.</li>
    <li id="OA4M">Если мы научимся делать хорошие детекторы фейковых картинок, начнутся поиски идей, как эти детекторы обмануть. То есть, приходим к той же парадигме, что в adversarial attacks: строим защиту -&gt; строим атаку, которая сбивает защиту -&gt; строим защиту от этой атаки -&gt; ...<br /><br />На самом деле, так даже уже немного происходит) Это мы увидим ниже, когда будем разбирать идеи детекции фейковых картинок.</li>
  </ul>
  <p id="POe2">Вот так как-то. В целом, область fake images detection довольно нова, работы и подходы тут только развиваются, поэтому и много неопределенности. Но область явно важная с практической точки зрения. </p>
  <p id="VgV0">На этой ноте давайте переходить к тому, как эту задачу можно решать: </p>
  <p id="A4Y6"></p>
  <h2 id="gkYU">Подходы к решению задачи fake images detection</h2>
  <p id="qnxX">Здесь я суммарную идеи решения задачи, которые встретились мне, когда я эту задачу разбирала.</p>
  <h3 id="Ahxv">Идея #1: решение &quot;в лоб&quot;</h3>
  <p id="nibv">То есть, берем какую-нибудь нейросеть вроде ResNet или ViT, и обучаем ее на тренировочной части наших данных на задачу бинарной классификации (&quot;fake&quot; или &quot;real&quot;). Тут всплывает первая проблема, описанная выше: при таком подходе нейросеть легко переобучается под те модели генераторов, картинки из которых находились в тренировочной выборке.</p>
  <p id="Pi4Y">Примеры статей, предлагающих подобный подход: </p>
  <ul id="mZdi">
    <li id="292M"><a href="https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136740089.pdf" target="_blank">Detecting Generated Images by Real Images</a> (ECCV-2022)</li>
    <li id="YSUX"><a href="https://www.mdpi.com/2076-3417/12/6/2953" target="_blank">DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer</a></li>
    <li id="Kdq8"><a href="https://arxiv.org/pdf/2102.11126.pdf" target="_blank">Deepfake Video Detection Using Convolutional Vision Transformer</a></li>
    <li id="VtSE"><a href="https://gaurijagatap.github.io/assets/CGI.pdf" target="_blank">ResNets for detection of computer generated images</a></li>
  </ul>
  <p id="IOY4"></p>
  <h3 id="ZL0R">Идея #2: model fingerprints</h3>
  <p id="2WRD">Оказывается, есть такая интересная вещь: еще в 2019 году было замечено, что <strong>модели-генераторы оставляют на сгенеренных картинках свои спецефичные &quot;отпечатки&quot; (fingerprints)</strong>.</p>
  <p id="pLQl">Как получается фингерпринт:</p>
  <ul id="vDYd">
    <li id="C9Jq">берем картинку X, прогоняем ее через denoising filter, получаеся f(X). Получаем шум R = X - f(X). Этот шум считается суммой некоей случайной компоненты, и некоей детерминированной компоненты, которая спецефична для модели-генератора, который эту картинку создал.</li>
    <li id="6j4c">чтобы выделить детерменированную компоненту, проделываем операцию выше для батча картинок и усредняем их шумы (усредняем R). К итоговому R_mean применяем преобразование Фурье и результат визуализируем.</li>
  </ul>
  <p id="swxD">В итоге получаются картинки, которые вы видите ниже. Тут визуализированы fingerprints нескольких разных моделей, в том числе диффузий. Картинки взяты из <a href="https://arxiv.org/pdf/2211.00680.pdf" target="_blank">этой статьи</a>, в ней авторы подробно исследовали эту тему:</p>
  <figure id="Urd0" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7b/4f/7b4f4773-cac1-4dff-a40c-4b0d3e53413d.png" width="2558" />
    <figcaption>Fingerprints нескольких разных генеративных моделей. Источник: https://arxiv.org/pdf/2211.00680.pdf</figcaption>
  </figure>
  <p id="GOEo">Видно, что у каждой модели &quot;отпечаток&quot; свой, но при этом у всех моделей он есть, и довольно заметный. </p>
  <p id="KZ62">На основе этих отпечатков можно пытаться строить детекторы фейковых картинок. Да их и строят, на самом деле. Но тут есть две сложности:</p>
  <ol id="zqdo">
    <li id="KOG0">Как видно, отчетливый отпечаток визуализируется только при усреднении шума с нескольких изображений. У каждой отдельной картинки он не такой отчетливый. А детектор хочется построить такой, чтобы он мог по одному изображению понять, фейковое оно или нет;</li>
    <li id="xP6r">Можно пытаться придумать техники постобработки сгенерированных картинок, которые будут картинки от подобных отпечатков избавлять. И такое уже есть: на CVPR-2022 была статья под названием &quot;<a href="https://openaccess.thecvf.com/content/CVPR2022/papers/Dong_Think_Twice_Before_Detecting_GAN-Generated_Fake_Images_From_Their_Spectral_CVPR_2022_paper.pdf" target="_blank">Think Twice Before Detecting GAN-generated Fake Images from their Spectral Domain Imprints</a>&quot;. В ней авторы предлагают нормализовать спектральную компоненту изображения, чтобы &quot;отпечаток&quot; исчез.</li>
  </ol>
  <p id="Vv7Y">Вот это я имела в виду выше, когда писала о том, что гонка &quot;fake detection -&gt; защита -&gt; обход защиты&quot; в этой задаче уже началась =)</p>
  <p id="k1vd">Да и вообще, обычная обработка картинки типа сжатия jpeg или наложения фильтров уже может исказить эти спектральные компоненты.</p>
  <p id="FO3c">Но <strong>само по себе то, что fingerprints существуют — штука интересная</strong>. Можно еще подумать, почему у разных генеративок &quot;отпечатки&quot; выглядят именно так.</p>
  <p id="GA5U">Вот какие статьи можно по этой теме почитать: </p>
  <ul id="kI3X">
    <li id="fRN1"><a href="https://arxiv.org/pdf/2304.06408.pdf" target="_blank">Intriguing properties of synthetic images:<br />from generative adversarial networks to diffusion models</a></li>
    <li id="pfzy"><a href="https://arxiv.org/pdf/2211.00680.pdf" target="_blank">On the Detection of Synthetic Images Generated by Diffusion Models</a></li>
  </ul>
  <p id="gJQh"></p>
  <h3 id="rQyC">Идея #3: чем проще, тем лучше</h3>
  <p id="Qu9g">Авторы этого типа подходов к детектированию фейковых картинок говорят вот что: мы видим, что модели для fake detection постоянно переобучаются на те модели, картинки из которых были в обучающей выборке. А значит, лучшим подходом будет тот, в котором обучаемая компонента как можно меньше. А в качестве модели-выделятора фичей из изображений для последующей классификации на фейк-не фейк используется что-нибудь предобученное. </p>
  <p id="aYWg">Эту идею хорошо иллюстрируют две следующие статьи:</p>
  <p id="9zHk">1. <strong><a href="https://arxiv.org/pdf/2302.10174.pdf" target="_blank">Towards Universal Fake Image Detectors that Generalize Across Generative Models</a></strong></p>
  <p id="FAoG">Идея тут такая: берем предобученный image encoder из CLIP. Из него получаем эмбеддинги всех картинок тренировочного датасета. На этих эмбеддингах обучаем простую модель: KNN или логрегрессию. Когда к нам приходит новая (тестовая) картинка, получаем ее эмбеддинг из CLIP и подаем в модель (KNN/логрег). Так получаем ответ. </p>
  <p id="i7as">Иллюстрация метода вот:</p>
  <figure id="OzwB" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/3f/d6/3fd6f796-11a9-4d84-b3f5-7987da003bf1.png" width="2504" />
    <figcaption>Иллюстрация метода статьи https://arxiv.org/pdf/2302.10174.pdf</figcaption>
  </figure>
  <p id="MuRk">То есть, идея такая: обучаем что-то суперпростое поверх эмбеддингов из предобученной модели. Это суперпростое что-то сильно явно не переобучится.</p>
  <p id="wAcF">И это работает. Ниже показаны результаты по метрике accuracy, которые репортят в статье. Протокол обучения и тестирования был стандартный: обучаем на фейковых картинках только из BigGAN, тестируем на всем остальном. Правда, тут есть один нюанс: в статье не написано, как был сгенерирован обучающий дотаяет. Но авторы обещали выложить код (<a href="https://github.com/Yuheng-Li/UniversalFakeDetect" target="_blank">он будет тут</a>), посмотрим.</p>
  <figure id="UcSR" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/29/df/29dff81a-ca35-4795-966c-46ded5affc93.png" width="2468" />
    <figcaption>Результаты по метрике accuracy метода из статьи https://arxiv.org/pdf/2302.10174.pdf</figcaption>
  </figure>
  <p id="MDHO"></p>
  <p id="HWyp">2. <strong><a href="https://arxiv.org/pdf/2105.12479.pdf" target="_blank">Pattern Detection in the Activation Space for Identifying Synthesised Content</a></strong></p>
  <p id="yRZM">Общая идея этой статьи такая: берем предобученную сеть для классификации картинок. Можно взять даже сеть, обученную детектировать фейковые картинки: например, дискриминатор ГАНа. Далее берем набор реальных картинок, прогоняем их через сеть, запоминаем активации нейронов скрытых слоев. </p>
  <p id="0cYL">Далее когда к нам приходит новая картинка, прогоняем ее также через сеть, получаем активации. Эти активации с помощью статистического критерия сравниваем с набором активаций реальных картинок. На основе стат. критерия выдаем ответ — реальная картинка или фейковая. </p>
  <p id="GRRN">Здесь, как видно, вообще не предлагается никакого обучения. (в статье, правда, предлагают еще один вариант алгоритма, где небольшое обучение присутствует. Об этом можно прочитать в разделе 3.2)</p>
  <p id="1smP">Минус этой работы в том, что тут странный, я бы сказала, протокол тестирования. В качестве реальных изображений для получения активаций сети брались картинки из датасетов CelebA HQ, MNIST и CycleGAN, а фейковые картинки генерировались с помощью PGGAN. При чем я не смогла понять, на чем PGGAN был обучен. </p>
  <p id="Yn0N">Но да ладно, это не столько важно. Суть тут в том, что такая идея — использовать стат. критерии для проверки фейковости картинки — тоже имеет место быть. Я видела эту идею еще в одной статье, более недавней, но сейчас снова найти ее не смогла. Если найду, добавлю на нее ссылку. </p>
  <p id="YoTz"></p>
  <h2 id="8bzO">Заключение</h2>
  <p id="YiQW">Как-то так. В этой статейке мы описали задачу fake image detection, поняли, почему задача не так проста, и обсудили, какие бывают подходы к ее решению. В целом, задача довольно новая и актуальная. Посмотрим, как будут развиваться дела: получатся ли у нас настолько хорошие генераторы картинок, что их нельзя будет распознать ни одним методом, или же найдется универсальный способ детекции фейковых картинок =)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@atmyre/ooMFzB7YADA</guid><link>https://teletype.in/@atmyre/ooMFzB7YADA?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre</link><comments>https://teletype.in/@atmyre/ooMFzB7YADA?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre#comments</comments><dc:creator>atmyre</dc:creator><title>Разбор DINO — идеи self-supervised обучения CV моделей</title><pubDate>Sun, 23 Apr 2023 18:08:11 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e8/66/e86681aa-bc42-42e7-a79d-bebd176face6.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/5e/63/5e633b34-6dc6-49c7-9976-f78e02329f24.png"></img>В этой статье я разберу идею для self-supervised обучения моделей для обработки изображений под названием DINO (если вы не знаете, что такое self-supervised обучение, то я делала об этом ликбез в тг-канале DLStories: ссылка). Мы узнаем, что за это идея такая, а также какие интересные свойства появляются у моделей, обученных с помощью DINO.]]></description><content:encoded><![CDATA[
  <p id="IJf6">В этой статье я разберу идею для self-supervised обучения моделей для обработки изображений под названием DINO (если вы не знаете, что такое self-supervised обучение, то я делала об этом ликбез в тг-канале DLStories: <a href="https://t.me/dl_stories/669" target="_blank">ссылка</a>). Мы узнаем, что за это идея такая, а также какие интересные свойства появляются у моделей, обученных с помощью DINO.</p>
  <p id="Kaos">DINO был представлен еще в 2021 году в статье &quot;<a href="https://arxiv.org/pdf/2104.14294.pdf" target="_blank">Emerging Properties in Self-Supervised Vision Transformers</a>&quot;. Кроме самого DINO, в статье приводится наблюдение, что у self-supervised трансформеров (например, у ViT, обученного с помощью DINO) обнаруживается интересное свойство: если подать такому трансформеру на вход картинку, то ее карты внимания будут неплохо сегментировать объект на картинке. Об этой находке и о том, как с ее помощью получить неплохую zero-shot сегментацию нескольких объектов на картинке, я <a href="https://t.me/dl_stories/667" target="_blank">писала в посте в телеграме тут</a>.</p>
  <p id="bsVi">А еще совсем недавно выпустили вторую версию DINO (<a href="https://ai.facebook.com/blog/dino-v2-computer-vision-self-supervised-learning/?utm_source=twitter&utm_medium=organic_social&utm_campaign=dinov2&utm_content=video" target="_blank">DINOv2</a>). В этой статье мы разберем устройство оригинального DINO, а в следующем статье — устройство DINOv2.</p>
  <p id="3wVN">Итак, поехали: </p>
  <h2 id="Gbup">Как работает DINO</h2>
  <p id="kdRW">Идея DINO основана на принципе <strong><a href="https://towardsdatascience.com/knowledge-distillation-simplified-dd4973dbc764" target="_blank">knowledge distillation</a></strong> (KD). </p>
  <p id="1a9x">В двух словах, KD – это когда у нас есть две модели — модель-учитель и модель-студент. Модель-учитель умеет хорошо решать какую-то задачу. И мы учим модель-студента с нуля решать эту же задачу таким образом: подаем на вход учителю и студенту одинаковые данные. И с помощью некоторого лосса заставляем выходы модели-студента быть похожими на выходы модели-учителя. </p>
  <p id="4fJ9">Получается, студент учится решать задачу, имитируя поведение учителя на входных данных. Иногда к обучению модели-студента также добавляют и стандартный лосс между выходами модели-студента и правильными ответами на входных данные.</p>
  <figure id="Mzxq" class="m_retina" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5e/63/5e633b34-6dc6-49c7-9976-f78e02329f24.png" width="571" />
    <figcaption>Иллюстрация идеи Knowledge Distillation. Источник: https://towardsdatascience.com/knowledge-distillation-simplified-dd4973dbc764</figcaption>
  </figure>
  <p id="xM5s">Чаще всего в KD модель-студент меньше, легковеснее, чем модель-учитель. То есть, KD используется для того, чтобы получить более легкую модель, которая умеет решать задачу примерно так же хорошо, как большая и умная модель-учитель.</p>
  <p id="Bi8m"><strong>Авторы из Meta адаптировали идею KD для self-supervised обучения, и получили DINO</strong>. Вот как именно это работает:</p>
  <p id="SzjZ">Берем датасет картинок. Из каждой картинки датасета вырезаем два <em>глобальных</em> патча картинки и несколько <em>локальных</em>. <em>Глобальный</em> патч — это кусок картинки, который покрывает &gt;50% всей картинк (в статье берут размер 224х224). <em>Локальные</em> патчи — куски картинки размера 96х96.</p>
  <p id="XnXF">Теперь делаем две копии одной и той же модели для обработки картинок: F_s и F_t. F_s  — модель-студент, F_t — модель-учитель. Это могут быть модели любого типа: ResNet, ViT, или что-то еще. </p>
  <p id="OsG9">Изначально F_s и F_t не обучены. Обучаем мы их так:</p>
  <figure id="fOGp" class="m_custom" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c2/e2/c2e2a797-b30d-4e82-907c-5d43e19a7513.png" width="358" />
    <figcaption>Иллюстрация устройства и обучения DINO. sg означает stop gradient, т.е. то, что во время обучения лосс не бэкпропагейтится в веса модели-учителя. Источник: https://arxiv.org/pdf/2104.14294.pdf</figcaption>
  </figure>
  <p id="tEBK">В течение эпохи веса F_t заморожены. Берем картинку x из датасета, подаем на вход F_t один из ее двух глобальных патчей, а на вход F_s подаем любой рандомный патч (локальный или глобальный, но не тот же, что подали на вход F_t). Обе модели выдают на выход эмбеддинги одинкового размера. Эти эмбеддинги мы сравниваем с помощью лосса и бэкпропагейтим градиенты в модель-студент F_s:</p>
  <figure id="0FgZ" class="m_retina" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b5/c0/b5c0edb5-48b7-481e-83e1-e0a845399e70.png" width="440" />
    <figcaption>Лосс-функция для DINO</figcaption>
  </figure>
  <p id="IQMj">То есть, тут идея примерно такая: в течение эпохи сеть-студент учится имитировать выходы замороженной сети-учителя. И сеть-студент получает на вход в основном <em>локальные</em> патчи, а сеть-учитель — только <em>глобальные</em>. Это как бы &quot;учит&quot; сеть-студента по локальным частям картинки понимать, что глобально на этой картинке изображено. Учась на такую задачу, сеть-студент может выучить что-то умное о том, как устроены картинки. </p>
  <p id="mgtl">Ну и в конце каждой эпохи веса модели-учителя F_t обновляются на основе весов модели-студента F_s c помощью running mean:</p>
  <figure id="IFdT" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1e/16/1e1631a5-966b-474c-b752-eab63b128fbb.png" width="294" />
    <figcaption>Обновление весов W_t модели-учителя на основе весов модели-студента W_s с помощью running mean </figcaption>
  </figure>
  <p id="L77d">Здесь:</p>
  <ul id="7j4c">
    <li id="6t1Q">W_t — веса модели-учителя F_t;</li>
    <li id="tMUd">W_s — веса модели-студента F_s;</li>
    <li id="N24O">a — некоторое число от 0 до 1.</li>
  </ul>
  <p id="YCAp">Авторы замечают, что пробовали разные варианты того, как и когда обновлять веса модели-учителя. Running mean оказался лучше всего. Вообще, в последнее время я эту идею вижу много где в местах, в которых используется одновременное обучение две моделей под одну задачу. Нужно будет про это почитать подробнее и понять, есть ли объяснения, почему именно так работает лучше всего. </p>
  <p id="wqyp">Вот псевдокод обучения DINO:</p>
  <figure id="ygi9" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/04/e9/04e975a1-3bf2-4990-9790-4de670127b13.png" width="1284" />
    <figcaption>Псевдокод обучения DINO. Источник: https://arxiv.org/pdf/2104.14294.pdf</figcaption>
  </figure>
  <h3 id="Ybpu">Как избежать collapse</h3>
  <p id="gazJ">Self-supervised методы часто страдают проблемой коллапса. Это когда модель в процессе обучения начинает для всех картинок датасета выдавать ограниченный набор векторов на выходе. Например, модель может начать для вообще всех картинок датасета выдавать один и тот же вектор. Это логично, так как такое поведение позволит модели лучшим образом минимизировать лоск-функцию, на которую модель обучают. </p>
  <p id="tMn6">Есть много разных способов борьбы с коллапсом. Самый известный, наверное, <strong><a href="https://www.v7labs.com/blog/contrastive-learning-guide" target="_blank">contrastive learning</a></strong> — это когда модель учат не только выдавать близкие векторы на похожие входные объекты (&quot;позитивные&quot; пары объектов), но еще и выдавать далекие векторы на разные входные объекты (&quot;негативные&quot; пары объектов). Например, так можно обучать модель для распознавания лиц с помощью <a href="https://en.wikipedia.org/wiki/Triplet_loss" target="_blank">Triplet Loss</a>. Подаем на вход модели лица одного и того же человека и просим модель выдать на них похожие векторы. Потом подаем на вход модели лица разных людей и просим ее выдать как можно более далекие векторы. </p>
  <p id="iqsz">Вот иллюстрация идеи contrastive learning:</p>
  <figure id="iEF8" class="m_custom" data-caption-align="center">
    <img src="https://img4.teletype.in/files/73/51/73517e04-8342-439b-aa88-9376d166666a.png" width="583" />
    <figcaption>Иллюстрация contrastive learning. Источник: https://www.v7labs.com/blog/contrastive-learning-guide</figcaption>
  </figure>
  <p id="59lH">Из-за этой же проблемы в DINO не получится обновлять параметры обеих сетей (учителя и студента) одновременно. То, что параметры сети-учителя заморожены на протяжении эпохи обучения сети-студента, помогает избежать того, что сеть-студент и сеть-учитель одновременно быстро скатываются в коллапс. Пока параметры учителя заморожены, сеть-студент вынуждена пытаться подстроиться под выходы сети-учителя, что не позволяет ей просто начать выдавать одинаковые векторы на любой вход.</p>
  <p id="zTmZ">Однако в DINO contrastive learning не используется. Возможно, потому, что не совсем понятно, как лучше генерировать негативные пары картинок. Вместо этого авторы DINO предлагают использовать другие две идеи — <strong>centering and sharpening of the momentum teacher outputs</strong>. Каждая из этих идей по отдельности позволяет нивелировать один из факторов, который приводит к коллапсу, а совместное их применение позволяет DINO не впадать в коллапс совсем и успешно обучаться. Я в этих методах борьбы с коллапсом еще не разбиралась, но как разберусь, напишу об этом статью. Пока что о них можно почитать в секциях 3.1 и 5.3 <a href="https://arxiv.org/pdf/2104.14294.pdf" target="_blank">статьи о DINO.</a></p>
  <h2 id="3f6k">Результаты</h2>
  <p id="jepc">Идея обучения DINO действительно позволяет моделям выучивать что-то полезное о картинках. </p>
  <p id="H1RY">Чем это подтверждается: авторы провели много экспериментов, подтверждающих, что ViT, обученный с помощью DINO, выучивает полезную информацию о картинках. Один из них — стандартный способ сравнить &quot;хорошесть&quot; self-supervised модели. Он такой: </p>
  <ol id="JR5e">
    <li id="wnpA">Берем модель F, обучаем в self-supervised режиме на тренировочной части ImageNet;</li>
    <li id="sTSF">Из обученной модели F получаем эмбецдинги всех картинок тренировочной части ImageNet;</li>
    <li id="HAbG">На этих эмбеддингах обучаем простой классификатор (например, однослойную полносвязную сеть или KNN);</li>
    <li id="zRwE">Получаем из F эмбеддинги для картинок валидационной части ImageNet, прогоняем их через классификатор, получаем ответы, считаем accuracy.</li>
  </ol>
  <p id="Xlmu">Проделав такую процедуру для разных self-supervised методов, можно сравнить их &quot;хорошесть&quot; между собой (отмечу, что при сравнении архитектуры всех моделей должны быть одинаковы). А еще можно сравнить все эти модели с supervised подходом. Это все авторы статьи и сделали. Вот результаты:</p>
  <figure id="DLnK" class="m_custom" data-caption-align="center">
    <img src="https://img3.teletype.in/files/61/c2/61c23bef-5ff1-4a77-8f53-8f9e2733262c.png" width="528" />
    <figcaption>Результаты сравнения DINO с другими self-supervised подходами</figcaption>
  </figure>
  <p id="nxOD">Видно, что DINO выигрывает у многих self-supervised подходов, которые были SOTA&#x27;ми на момент выхода статьи.</p>
  <p id="vVis">В разделе 4 <a href="https://arxiv.org/pdf/2104.14294.pdf" target="_blank">статьи</a> описаны и другие сравнения ViT, обученного с помощью DINO, с другими подходами. </p>
  <p id="9fnx">А здесь скажем вот что: как упоминалось в начале этого разбора, у ViT, обученного с помощью DINO, появляется интересное свойство: его self-attention карты начинают сегментировать объекты на картинке. Вот примеры того, как выглядят self-attention карты модели для разных пикселей:</p>
  <figure id="6oR9" class="m_custom" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ad/cf/adcff7b0-c2b8-4519-b02c-67e56d0751af.png" width="510" />
    <figcaption>Как выглядят self-attention карты модели ViT, обученной с помощью DINO, для разных пикселей. Источник: https://arxiv.org/pdf/2104.14294.pdf</figcaption>
  </figure>
  <p id="yyId">Видно, что для каждого пикселя картинки self-attention карта, соответствующая этому пикселю, по сути сегментирует объект, который к этому пикселю относится. </p>
  <p id="BI5k">На основе этого наблюдения можно построить zero-shot сегментацию изображений. Просто берем карту self-attention, выбираем порог и оставляем все пиксели, значение которых больше порога. Это и будет картой сегментации. </p>
  <p id="uWqY">И это работает. Авторы провели такой эксперимент: взяли маленький ViT (ViT-s/8), обучили его в supervised режиме на задачу сегментации, и в self-supervised режиме с помощью DINO. Получилось, что self-attention карты DINO сегментируют объекты даже лучше, чем supervised модель! Вот результаты:</p>
  <figure id="ZIes" class="m_custom" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b1/2f/b12f6061-9a24-4bd6-810c-143e64143a10.png" width="577" />
    <figcaption>Сравнение сегментации картинок с помощью модели ViT-s/8, обученной в supervised режиме, и в self-supervised режиме с помощью DINO. </figcaption>
  </figure>
  <h2 id="Jn56">Заключение</h2>
  <p id="uLZL">Вот такая вот интересная идея self-supervised обучения vision моделей под названием DINO. Недавно вышла DINO-v2, ее я разберу в следующей статье. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@atmyre/hrnsBpXZMll</guid><link>https://teletype.in/@atmyre/hrnsBpXZMll?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre</link><comments>https://teletype.in/@atmyre/hrnsBpXZMll?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=atmyre#comments</comments><dc:creator>atmyre</dc:creator><title>Разбор SAM (Segment Anything Model) </title><pubDate>Mon, 10 Apr 2023 19:30:59 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/9b/9d/9b9d0797-3c1d-4872-b0a1-8573fb340f43.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/be/d2/bed216be-3a79-4772-80e2-fc75c884a30c.gif"></img>SAM — это модель от Meta AI, обученная на новом огромном датасете для сегментации изображений. Этот датасет содержит 11 млн картинок и 1.1 млрд масок сегментации. Meta AI описали, как собирали этот датасет, а также выложили его в открытый доступ вместе с моделью. ]]></description><content:encoded><![CDATA[
  <p id="gvMN">SAM — это модель от Meta AI, обученная на новом огромном датасете для сегментации изображений. Этот датасет содержит 11 млн картинок и 1.1 млрд масок сегментации. Meta AI описали, как собирали этот датасет, а также выложили его в открытый доступ вместе с моделью. </p>
  <p id="Atw4">Сразу все релевантные ссылки: </p>
  <ul id="JzTu">
    <li id="sYSG"><a href="https://arxiv.org/pdf/2304.02643.pdf" target="_blank">Статья</a> на arxiv;</li>
    <li id="Y5Dl"><a href="https://segment-anything.com" target="_blank">Сайт</a> с примерами работы;</li>
    <li id="dKz6"><a href="https://segment-anything.com/demo" target="_blank">Онлайн-демо</a>;</li>
    <li id="3ePr"><a href="https://segment-anything.com/dataset/index.html" target="_blank">Визуализация датасета</a>;</li>
    <li id="NmoR"><a href="https://ai.facebook.com/datasets/segment-anything/" target="_blank">Скачать датасет</a>.</li>
  </ul>
  <p id="KjyP">SAM — очень мощная модель. <strong>SAM способна</strong> <strong>на одном изображении сегментировать сразу множество объектов, включая объекты небольшого размера и даже те, что модель не видела во время обучения. </strong></p>
  <figure id="76Rr" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/be/d2/bed216be-3a79-4772-80e2-fc75c884a30c.gif" width="600" />
    <figcaption>Пример работы SAM</figcaption>
  </figure>
  <h3 id="fVwn"></h3>
  <p id="cKoJ">Кроме обычного режима &quot;сегментировать все, что есть на картинке&quot; модель еще умеет <strong>сегментировать отдельные объекты по запросу пользователя</strong>. Запросы могут быть таких видов: </p>
  <ul id="9wUo">
    <li id="jQGe"> точка (или несколько точек) на объекте. Ставите мышкой точку на объект, который хотите сегментировать, и модель сегментирует этот объект;</li>
    <li id="NlGm">bounding box объекта. Мышкой выделяете примерный прямоугольник, в котором находится объект, и модель его сегментирует;</li>
    <li id="7Vbs">примерная маска объекта. Ручкой как в Paint закрашиваете примерную область, в которой находится объект. И модель эту область уточняет;</li>
    <li id="gDWs">текст-описание объекта. Например, &quot;коричневый мишка в руках у девочки&quot;. Модель найдет этот объект и сегментирует. </li>
  </ul>
  <p id="H80S">Кроме этого, с помощью хитрого построения входа и постпроцессинга выхода модели можно без дообучения модели (т.е. в zero-shot режиме) решать некоторые задачи, на которые модель напрямую не обучалась. Например, такие задачи:</p>
  <ul id="jnei">
    <li id="PxA7">edge detection; </li>
    <li id="geza"> instance segmentation;</li>
    <li id="i0gm"><a href="https://paperswithcode.com/task/object-proposal-generation" target="_blank">object proposal.</a></li>
  </ul>
  <p id="yOnJ">Вообще, <strong>авторы считают, что SAM может стать foundation model</strong>, т.е. что-то вроде GPT-3 в сфере сегментации картинок. Foundation model — это модель, которая обучилась на какую-то задачу на огромном количестве данных, и это породило у нее способности к решению многих других задач, на которые она напрямую не обучалась, в few-shot и zero-shot режимах.</p>
  <p id="RpiB">Правда, прочитав статью, я не уверена, что я с этим согласна. На мой взгляд, те задачи, на которых SAM показывает способности к zero-shot — это та же сегментация, только вид подачи данных на вход модели немного отличается. Т.е. не то чтобы тут у модели возникают какие-то новые неожиданные способности. Но SAM — это точно foundation model в том смысле, что обучена модель была на огромном количестве данных, и из-за этого ее должно быть очень легко дообучить под свою конкретную задачу. Это такой ImageNet для задачи сегментации, короче.</p>
  <p id="xJf2">Но давайте подробнее разберемся с тем, как модель устроена и что умеет. А также что это за новый датасет и как его собирали.</p>
  <h2 id="iwog">Устройство модели SAM</h2>
  <figure id="0ZqS" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5f/a8/5fa8d218-bfa3-4250-b891-6d0e3d143db6.png" width="2476" />
    <figcaption>Устройство SAM. https://arxiv.org/pdf/2304.02643.pdf</figcaption>
  </figure>
  <p id="c1cj">Устройство модели — на картинке выше. Модель состоит из трёх частей:</p>
  <ul id="f5W6">
    <li id="Z1bI"><strong>Image encoder.</strong> Это ViT, предобученный с помощью MAE. Эта часть принимает входящую картинку, которую нужно сегментировать, и превращает ее в вектор (эмбеддинг на картинке)</li>
    <li id="JyAt"><strong>Энкодер дополнительной инфы (кондишена</strong>), на основе которой нужно сегментировать картинку. Это может быть:</li>
    <ul id="zKCy">
      <li id="7eX8"><strong>Mask </strong>— заданная юзером маска для объекта, который нужно сегментировать. Маска подаётся на вход сверточному энкодеру, который выдает эмбеддинг того же размера, что image encoder. Этот эмбеддинг потом суммируется с эмбеддингом из image encoder;</li>
      <li id="wtQ0"><strong>Points</strong> — набор точек, которые относятся к объекту, который хотим сегментировать. В этом случае точки переводятся в эмбеддинг с помощью positional encoding&#x27;а. Этот эмбеддинг затем подаётся на вход третьей части сети вместе с эмбеддингом картинки, которую нужно сегментировать;</li>
      <li id="s84s"><strong>Box</strong> — заданный юзером bounding box объекта, который нужно сегментировать. Box также переводится в эмбеддинг с помощью positional encoding. Конкретнее, с помощью positional encoding кодируются координаты его левого верхнего и правого нижнего углов;</li>
      <li id="wb3w"><strong>Text.</strong> <strong>Вот тут интереснее всего</strong>, потому что в датасете, на котором обучается SAM, нет текстовых описаний к изображениям. И если все другие виды инфы (points, box и mask) можно легко получить для любой пары (картинка, карта сегментации) датасета и на этом нейросеть обучать, то с текстом так легко не выйдет. Как же авторы добиваются того, чтобы SAM могла сегментировать объект на картинке на основе его текстового описания, разберём ниже.</li>
    </ul>
    <li id="Illv">Ну и третья составляющая модели — <strong>mask decoder</strong>. Она принимает на вход эмбеддинг картинки из image encoder и эмбеддинг допинфы. Архитектура — декодер трансформера с парой добавленных нюансов для лучшей обработки информации (об этом подробнее в разделе А аппендикса <a href="https://arxiv.org/pdf/2304.02643.pdf" target="_blank">статьи</a>).</li>
  </ul>
  <p id="Mb5E">Важно вот что: mask decoder выдает не одну карту сегментации, а три. Сделано это для того, чтобы модель могла эффективно обрабатывать нечёткие случаи: когда, например, юзер поставил точку, которая может относиться к нескольким объектам на картинке. Например, точка на лице человека: она может относиться как к объекту &quot;лицо&quot;, так и к объекту &quot;человек&quot;. Если модель выдает только одну карту сегментации, она будет стараться на такие нечёткие запросы выдать карту, которая будет чем-то средним между всеми возможными правильными картами сегментации. А если у нее есть возможность выдавать несколько карт, то каждая карта может соответствовать одному возможному объекту. Количество карт 3 было выбрано эмпирически: авторы говорят, что этого в целом хватает для большинства юзкейсов.</p>
  <p id="wFzU">Ниже — пример того, как модель генерирует три маски сегментации для одной точки на изображении:</p>
  <figure id="rqGd" class="m_custom" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ee/2c/ee2ce302-d034-4b24-8fc1-73a7163ceef3.png" width="439.99999999999994" />
    <figcaption>Пример генерации моделью трех масок сегментации по одной точке на изображении. https://arxiv.org/pdf/2304.02643.pdf</figcaption>
  </figure>
  <p id="vhB9"></p>
  <p id="Ukrs">Для каждой выданной карты сегментации сеть также предсказывает confidence этой маски. При обучении сети используется лосс только из самой confident головы.</p>
  <h2 id="KfEG"><strong>Датасет для обучения SAM </strong></h2>
  <p id="CPgW">Для обучения SAM авторы статьи собрали самый большой датасет пар (картинка, карта сегментации). В нем 11 млн картинок и 1.1 млрд масок. Масок больше, потому что на одной картинке в среднем находится много объектов, и для каждого из них маска своя. Можно считать, что у нас есть 1.1 млрд пар (объект на картинке, маска сегментации).</p>
  <p id="u5y7">Еще раз ссылки на датасет:</p>
  <ul id="E37e">
    <li id="BSSa"><a href="https://segment-anything.com/dataset/index.html" target="_blank">Визуализация датасета</a>;</li>
    <li id="61eg"><a href="https://ai.facebook.com/datasets/segment-anything/" target="_blank">Скачать датасет</a>.</li>
  </ul>
  <p id="QCkA"><strong>Интересно то, как они датасет готовили:</strong> это было не полностью с помощью людей-разметчиков (представьте, сколько бы времени заняло такой датасет собрать и сколько бы это стоило). Собирали датасет в три стадии:</p>
  <ol id="mV4K">
    <li id="EAlh">Manual stage. С помощью людей собрали 4.3 млн масок для 120 тысяч картинок;</li>
    <li id="Ob3N">Semi-automatic stage. На данных с пункта 1 обучили нейронку и ей разметили объекты на 180к картинках. Дальше дали эти размеченные картинки людям и попросили доразметить на них те объекты, которые нейронка пропустила. Чаще всего это были мелкие объекты. В течение этой стадии на новых полученных данных нейронку несколько раз дообучали. Это повысило способность сети сегментировать больше объектов на каждой картинке;</li>
    <li id="kLRG">Fully-automatic stage. Взяли нейронку, обученную на данных из второго шага. Для каждой картинки генерили плотную сетку точек, и просили модель сегментировать объекты, соответствующие этим точкам. Из полученных таким образом карт сегментации отбирали те, в которых модель наиболее уверена (confidence высокий). И далее их ещё улучшали с помощью классического NMS. Так и набрали 11 млн картинок с 1.1 млрд карт сегментации. <strong>В итоговом датасете 99% масок сегментации были получены полностью автоматически.</strong></li>
  </ol>
  <p id="P6Cn">Такой подход позволяет, при желании, нагенерить ещё данных. Датасет полностью выложен в открытый доступ вместе со статьей.</p>
  <p id="UKoi">Замечу ещё раз, что в датасет вообще нет никаких текстовых описаний к никаким объектам. И если из пар (объект на картинке, карта сегментации) можно легко для объекта сгенерить допинфу для обучения модели — кривую маску, bounding box или точку на объекте, то текстовое описание хорошо сгенерить не выйдет. Ниже обсудим, как же авторам удалось научить модель генерить карту сегментации для объекта на основе текстового описания.</p>
  <h2 id="P18e"><strong>Генерация маски сегментации объекта на основе текстового описания объекта</strong></h2>
  <p id="HOGW">Теперь, наконец, поговорим о том, как же в отсутствии любых текстовых описаний для картинок в датасете заставить модель понимать текст, и на его основе выдавать сегментацию нужного объекта.</p>
  <p id="exjX">А идея очень классная, на мой взгляд. Вот какая:</p>
  <p id="gLuT">Вспомним про CLIP: эта модель выучивает общее пространство эмбеддингов для картинок и текста. </p>
  <figure id="cavS" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/26/70/2670bbb7-48d5-4a5e-b884-1013f35caf23.png" width="2228" />
    <figcaption>Идея CLIP. https://www.google.com/url?sa=i&amp;url=https%3A%2F%2Fopenai.com%2Fresearch%2Fclip&amp;psig=AOvVaw3VIG5bknAMltNk65nBedp4&amp;ust=1681240388439000&amp;source=images&amp;cd=vfe&amp;ved=0CBIQjhxqFwoTCPDx9NKCoP4CFQAAAAAdAAAAABAE</figcaption>
  </figure>
  <p id="cjrz">Из этого возникает такая идея обучения SAM:</p>
  <p id="MWgt">У нас есть датасет вида (объект на картинке, маска сегментации для этого объекта). Давайте для каждого такого объекта вырежем прямоугольный кусок картинки с этим объектом и подадим ее на вход CLIP. На выходе получим эмбеддинг картинки, назовем его Х. Так как картинка в целом содержит только наш объект, то эмбеддинг Х будет содержать информацию о том, что на картинке изображен именно этот объект.</p>
  <figure id="ng1k" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9d/d7/9dd756a4-4b5d-4753-9560-ba97bd84aa1c.png" width="1802" />
    <figcaption>Вырезаем bounding box объекта и подаем в CLIP. Получаем эмбеддинг картинки,</figcaption>
  </figure>
  <p id="OQu6">Во время обучения SAM будем в качестве псевдо-эмбеддинга описания объекта подавать на вход модели эмбеддинг Х. То есть, CLIP-эмбеддинг куска картинки, содержащей этот объект: </p>
  <figure id="ayCf" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/18/85/18854c88-4c36-4b48-91a6-908ed61e5efd.png" width="1626" />
    <figcaption>Работа во время обучения SAM </figcaption>
  </figure>
  <p id="1Js9">А после обучения, на этапе инференса, будем уже прогонять текстовое описание желаемого объекта через CLIP, и уже его подавать в качестве кондишена. Так как CLIP выучивает общее пространство эмбеддингов для текста и картинок, такая замена эмбеддинга картинки на эмбеддинга текстового описания должна сработать.</p>
  <figure id="iBo3" class="m_column">
    <img src="https://img2.teletype.in/files/5d/bf/5dbf92e4-9fde-4054-83a1-f47ac40128bd.png" width="1656" />
  </figure>
  <p id="mLJN">Ну и правда работает, вот примеры результатов:</p>
  <figure id="t4Yf" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/70/f9/70f9db68-b1c1-46f3-a154-79bb4e69ba8b.png" width="1174" />
    <figcaption>Пример сегментации моделью SAM объектов на картинке по их текстовому описанию. https://arxiv.org/pdf/2304.02643.pdf</figcaption>
  </figure>
  <p id="YrS3"></p>
  <h2 id="ETlp">Заключение</h2>
  <p id="CJ4k"><strong>Вот такая идея модели</strong>. Подробнее о нюансах архитектуры, обучения и метриках читайте в <a href="https://arxiv.org/pdf/2304.02643.pdf" target="_blank">статье</a>.</p>
  <p id="U77s">Буду рада узнать, что вы думаете насчет того, насколько эта модель важна и как повлияет на прогресс в области сегментации и CV в целом =)</p>

]]></content:encoded></item></channel></rss>