Делаем перенос стилей изображений с помощью Keras и Tensorflow | #17 нейросети на Python

Поділитися
Вставка
  • Опубліковано 28 січ 2025

КОМЕНТАРІ • 72

  • @reabstractor
    @reabstractor 3 роки тому +74

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

    • @krv76
      @krv76 3 роки тому +16

      Я предлагаю принять просмотр этого видео за батч

    • @sanpavlovich9726
      @sanpavlovich9726 2 роки тому

      Ахахах

    • @sanpavlovich9726
      @sanpavlovich9726 2 роки тому +2

      Столько эпох, сколько тут лайков 👍

    • @Dmitrii-Zhinzhilov
      @Dmitrii-Zhinzhilov Рік тому +5

      Предполагаю, что тут всё же нужны видео разной тематики по теме + эксперименты + проекты (заказы). Иначе на "тестовой выборке" нейросеть вряд ли покажет хорошие результаты.
      P.S. Я запускаю 2 эпохи видео )) и через 3 месяца планирую ещё одну ))

  • @dubinin_s
    @dubinin_s 4 роки тому +8

    Спасибо большое за видео. Сначала подумал, что несколько видео пропустит, ничего не понял с первого раза. Потом законспектировал предыдущие видео, три раза пересмотрел это видео, построчно разобрал программу и через 3 часа все стало предельно понятно)))

    • @selfedu_rus
      @selfedu_rus  4 роки тому +7

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

    • @ywbc1217
      @ywbc1217 4 роки тому +4

      @@selfedu_rus спасибо вам

  • @mif4222
    @mif4222 3 роки тому +15

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

  • @userqh67vey6
    @userqh67vey6 2 роки тому +1

    Видео полезное. Симбиоз предыдущих уроков, немного ЦОС и особенностей Tensorflow2. Рекордное количество кода. Голова пухнет, особенно когда меняешь количество итераций + настройки оптимизации или параметры альфа и бетта и получаешь не то что ожидаешь. Как сказано ниже, нужно много эпох теории и эксперементов для понимания всего кода :)
    Лайк!

  • @СергейЮров-б6е
    @СергейЮров-б6е 2 роки тому +1

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

  • @discara
    @discara 3 роки тому +7

    использую этот же код для вкрб (который ты брал изначально)
    как же прекрасно, что я нашла этот плейлист, помогает "распутать мозги"
    нужны были видео про vgg + предыдущее + это
    спасибо огромное за объяснение, возможно буду использовать их в рпз :D

    • @discara
      @discara 3 роки тому

      написала для этого кода интерфейс на streamlit, даже есть задеплоенный вариант)

    • @itm6197
      @itm6197 2 роки тому

      @@discara привет, а можешь скинуть ?

  • @ll2pakll
    @ll2pakll 4 роки тому +7

    Мильярд лайкау)

  • @argrigorov
    @argrigorov 3 роки тому +2

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

    • @ravenalbatros
      @ravenalbatros 2 роки тому

      Можно просто подогнать любое изображение под сеть, - изменить качество, добавить дополнительную свертку в начало

  • @СарматПересветов
    @СарматПересветов 3 місяці тому

    вопрос, на 12.36 когда мы вычисляем матрицу ГРАМА - в предыдущем уроке мы записывали что нужно перемножить "матрицу признаков" на матрицу признаков".транспонированную. А На этом уроке в фукции gram_matrix мы наоборот перемножаем "матрицу признаков".транспонированную на "матрицу признаков". насколько это правильно? или нам в принцыпе не важно что на что перемножать, главное что бы этот алгоритм применялся ко все обьектам одинаковый???

  • @lyonya7025
    @lyonya7025 3 роки тому +2

    Какой же ты крутой, ну просто трындец

  • @yuriynaumov4466
    @yuriynaumov4466 Рік тому +1

    скажите пож-та, как сохранить веса модели и применить этот же стиль к другому изображению 224*224 ?

  • @fewra600
    @fewra600 2 роки тому +2

    Почему, если я подаю изображение большего размера на вход сети, то НС работает медленнее, но РАБОТАЕТ? При этом она даже значения выдаёт, как это, там же только 244х244 можно подавать?

    • @vovaaw
      @vovaaw 9 місяців тому

      Посмотри ещё раз видео в котором рассказывается об операции maxpool

  • @mormonteg4073
    @mormonteg4073 Рік тому

    Как всё работает то понятно, но вот сама реализация... Тьма просто. До такого уровня еще долго. надо будет глянуть курс по тензорфлоу

  • @VenatoresnamIgnotis
    @VenatoresnamIgnotis 3 роки тому +2

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

    • @selfedu_rus
      @selfedu_rus  3 роки тому

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

    • @VenatoresnamIgnotis
      @VenatoresnamIgnotis 3 роки тому +1

      ​@@selfedu_rus Ну т.е. в данном случае мы должны взять большое множество пар изображение-стиль чтобы обучить сеть конкретно задаче стилизации?

    • @vovaaw
      @vovaaw 9 місяців тому

      ​@@VenatoresnamIgnotisда

  • @veta_shine
    @veta_shine 2 роки тому +1

    Скажите, пожалуйста, как нам сохранять навыки созданной модели? Ведь выходит, что в данном коде модель не сохраняет никаких навыков, каждый запуск изображений для нее - это чистый лист

    • @selfedu_rus
      @selfedu_rus  2 роки тому

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

  • @РоманЛ-г6ш
    @РоманЛ-г6ш 3 роки тому +4

    Круто, конечно! Как я понимаю, приложение Prizma было основано на подобной сети (а может и прямо на этой?))). Один вопрос только возникает - зачем этой сети нужно еще одно измерение на подаваемых изображениях, если для положения/размера и цвета пикселя, вроде и трех достаточно?

    • @selfedu_rus
      @selfedu_rus  3 роки тому +1

      Вы имеете в виду скрытые слои? Зачем там брать дополнительные каналы? Это нужно только для оценки степени стилизации изображения, т.к. понятие несколько абстрактное, вот и приходится применять более сложный подход (кстати, далеко не единственный, есть и другие методы оценки степени стилизации изображений).

    • @РоманЛ-г6ш
      @РоманЛ-г6ш 3 роки тому

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

    • @РоманЛ-г6ш
      @РоманЛ-г6ш 3 роки тому +1

      @@selfedu_rus мой вопрос более простого характера. Для подачи на вход сети VGG каких-либо изображений приходится добавлять дополнительную нулевую ось (делать np.expand (...axis=0)). Не могу понять, зачем у сети VGG такое требование. Просто интересно. В этом измерении можно еще какой-то параметр изображения задавать?

    • @selfedu_rus
      @selfedu_rus  3 роки тому +4

      @@РоманЛ-г6ш а, ясно, это не то чтобы требование сети, скорее особенность реализации пакета Keras и Tensoflow. Они предполагают работу с пакетами данных (батчами), поэтому первая ось - это измерение для разных наблюдений (изображений). Если, например, подать тензор из двух изображений, то эта первая ось, как раз, и пригодится.

    • @РоманЛ-г6ш
      @РоманЛ-г6ш 3 роки тому +3

      @@selfedu_rus точно, в стандартной ситуации пакеты же подаются, а мы по одному изображению прогоняем! Спасибо за пояснение!

  • @albertasatryan1477
    @albertasatryan1477 2 роки тому +1

    А почему функция потерь не определяется в соответствии формулы, а просто берётся среднее через reduce_mean?

    • @selfedu_rus
      @selfedu_rus  2 роки тому +1

      константные множители при оптимизации не имеют смысла, их можно отбросить по идее

    • @albertasatryan1477
      @albertasatryan1477 2 роки тому

      @@selfedu_rus понятно, спасибо за ответ

  • @vanillaicecream4949
    @vanillaicecream4949 3 роки тому

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

    • @selfedu_rus
      @selfedu_rus  3 роки тому +1

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

  • @reklama63
    @reklama63 3 роки тому +2

    А можно ли по какому-то алгоритму обучить сеть стилизации без тензорных векторов? Сделать 1000+ входных картинок (оригинал + стиль) и столько же выходных (стилизованных).
    Смотрю видео. До VGG16 было идеально понятно. Дальше с каждыми видео становится много загадочного. понимаю, что уровень моей математики не на столько продвинутый. ((

  • @timon1816
    @timon1816 2 роки тому +2

    Ура! Я всё понял всего за 8 просмотров

  • @andrey_sautenko
    @andrey_sautenko 2 роки тому

    Здравствуйте!Подскажите, пожалуйста, а если не использовать ноубук как Вы, а использовать Pycharm....Как загрузить изображения с компьютера, аналогично Вашим действиям?

    • @selfedu_rus
      @selfedu_rus  2 роки тому +1

      еще проще, используйте Image.open(путь к файлу):
      from PIL import Image
      with Image.open("hopper.jpg") as im:
      im.rotate(45).show()

    • @andrey_sautenko
      @andrey_sautenko 2 роки тому +1

      @@selfedu_rus спасибо,Сергей!

    • @andrey_sautenko
      @andrey_sautenko 2 роки тому

      @@selfedu_rus уже сам нашел решение)

  • @Alex-un3nz
    @Alex-un3nz Рік тому +1

    в калабе ставьте Аппаратный ускоритель GPU и бедет счастье

  • @AcCeHu3aToP
    @AcCeHu3aToP 4 роки тому

    А есть ли предобученные модели для изображений большего размера чем 224x224? Как это все применять на практике, если размер изображений из "реального мира" гораздо больше?

    • @selfedu_rus
      @selfedu_rus  4 роки тому

      Надо уже искать в сети, или делать, обучать самому, но это непросто.

  • @networkpy8352
    @networkpy8352 4 роки тому

    А почему Learning Rate такой высокий? Обычно же должен быть не более 1

    • @selfedu_rus
      @selfedu_rus  4 роки тому

      Мы здесь меняем значения пикселей, для этого нужен высокий шаг изменения. Это не веса связей у НС.

    • @networkpy8352
      @networkpy8352 4 роки тому

      @@selfedu_rus Кстати, я тестировал 1000 итераций обучения с лр=0.02. Результаты стали намного лучше выглядеть, сохраняется детализация.

    • @networkpy8352
      @networkpy8352 4 роки тому

      @@selfedu_rus Вы не делали видео по переносу сразу нескольких стилей?

    • @selfedu_rus
      @selfedu_rus  4 роки тому

      @@networkpy8352 нет, только так как в видео

  • @ivanbezrukov3680
    @ivanbezrukov3680 3 роки тому

    Здравствуйте! Решил попробовать повторить то, что делалось в уроке. Единственным исключением было то, что делал не в гугл колаб, а в анаконде, открывал изображения при помощи opencv, командой cv2.imread. Изображение открывалось сразу в формате bgr, соответственно манипуляции с rgb->bgr->rgb можно было опустить. Дошел до конца, анаконда делает одну итерацию и все. Воевал несколько часов, в итоге скопировал Ваш код, только в начале свои изображения открывал так же при помощи imread, и приводил все к rgb командой cv2.cvtColor(img, cv2.COLOR_BGR2RGB). Все равно одна итерация и все. Код - прям копия, ctrl+c, ctrl+v. Подскажите пожалуйста, с чем это может быть связано?

    • @selfedu_rus
      @selfedu_rus  3 роки тому

      Ну так сложно сказать, тем более, что в Анаконде никогда не работал, не знаю ее нюансов.

    • @mif4222
      @mif4222 3 роки тому

      В смысле на 1 эпохе все застревало?

  • @костябельков
    @костябельков 4 роки тому +2

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

    • @selfedu_rus
      @selfedu_rus  4 роки тому

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

  • @artyomkolas6850
    @artyomkolas6850 3 роки тому

    Большое спасибо за крутые видео и материалы!)
    Не могу пофиксить эту ошибку никак((
    ValueError: Input 0 is incompatible with layer model_2: expected shape=(None, None, None, 3), found shape=(1, 224, 224, 4)

    • @selfedu_rus
      @selfedu_rus  3 роки тому +1

      у вас последняя размерность тензора 4, а должно быть 3

    • @artyomkolas6850
      @artyomkolas6850 3 роки тому +1

      @@selfedu_rus , спасибо, буду разбираться)

    • @cimoncimonoff515
      @cimoncimonoff515 3 роки тому

      @@artyomkolas6850 если разобрались подскажите пожалуйста, никак не могу преобразовать

    • @artyomkolas6850
      @artyomkolas6850 3 роки тому

      пока нет)

    • @fedotik827
      @fedotik827 3 роки тому +1

      у меня та же проблема была, когда картинку в png формате загрузил, а оказалось что у изображения в png размерность 4, переделал ту же картинку в jpeg, у неё уже 3 было и всё заработало.

  • @wMonarch
    @wMonarch 5 місяців тому

    Описать это видео можно одним словом - пиздец.

  • @ravenalbatros
    @ravenalbatros 2 роки тому

    жесть

  • @evgenykolesenko
    @evgenykolesenko 2 роки тому +1

    Спасибо за видео, но я никак не могу решить проблему:
    ModuleNotFoundError: No module named 'google.colab'

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      это все в коллаборатории гугл нужно прописывать: colab.research.google.com

  • @Zeding_Stuff
    @Zeding_Stuff Рік тому

    Сергей. здравствуйте. Спасибо за уроки!
    Учусь на 3 курсе информационной безопасности и делаю научный проект по объекту стеганографии.
    Если кратко, то моя задумка заключается в том. чтобы брать сообщение, которое нужно будет спрятать ("вписать") в изображение, разбить по символьно и через таблицу ascii представить в виде списка чисел от 0 до 255.
    Затем с помощью ГПСЧ с заданным сидом раскидать эти числа на холсте изображения в виде пикселей, и уже отталкиваясь от этих пикселей нейросеть должна генерировать какое-либо изображение (например, изображение кота).
    Скажите пожалуйста, какой тип НС для этого лучше подходит и слишком ли это сложная задача? Я пока только на 17 занятии, но дедлайны уже начинают гореть.
    В конце данного курса вы делали видео про генеративно-состязательную сеть (я очень поверхностно знаю что это), подойдут ли они для этой задачи, если на вход подавать не какой-то случайный шум, а конкретные значения символов сообщения по таблице ASCII?
    Подскажите, пожалуйста🙏

  • @pages777
    @pages777 3 місяці тому +1

    13102024