Category: Видео

09
Июн
2021

Видео: Необычный Python. Паттерны, продолжение. Урок 5

В пятом уроке видеокурса автор продолжает рассказывать о паттернах и показывает реальные примеры их использования.
— Читать дальше «Видео: Необычный Python. Паттерны, продолжение. Урок 5»

08
Июн
2021

🎨 Используем CycleGAN для применения стиля к видео, полученному с веб-камеры

Вы когда-нибудь задумывались, как выглядел бы ваш портрет работы Моне? Или легендарного Ван Гога? Современные технологии позволяют увидеть это своими глазами.

Текст публикуется в переводе, автор оригинальной статьи Бен Сантос.

Замечание: эта статья подразумевает, что вы уже знаете, что такое GANы. Вот отличный ресурс, объясняющий, что это такое.

Чем больше я изучал CycleGAN, тем больше меня привлекала одна из областей его применения: передача стиля (style transfer). Цель передачи стиля – это изучение того, как поставить в соответствие изображениям из пространства A изображения из другого пространства B. Классический пример – одно из пространств является коллекцией фотографий, а второе – картины знаменитого художника, например, Клода Моне. Применение передачи стиля заставляет обычные фотографии выглядеть так, как если бы их рисовал Моне.

Взято из <a href="https://arxiv.org/abs/1703.10593" target="_blank" rel="noopener noreferrer nofollow">"Беспарного перевода изображений с помощью цикло-устойчивых соревновательных сетей"</a>
Взято из “Беспарного перевода изображений с помощью цикло-устойчивых соревновательных сетей”

Этот процесс известен как перевод изображений, и традиционно он требует большого набора данных с парными изображениями – то есть, для обучения переводу вам нужны рисунки и фотографии одних и тех же мест, сделанные под одним и тем же углом, в одно и то же время дня и так далее. По очевидным причинам, получение таких парных данных нереалистично, а зачастую даже невозможно. Разве не было бы замечательно, если бы можно было переводить изображения в картины без парных примеров? Эта задача была исследована, и в результате появился эффективный беспарный метод перевода изображений в виде “циклически-согласованных соревновательных сетей” (CycleGAN), использующих архитектуры GAN для изучения необходимых соответствий и выполнения высококачественного перевода изображений. Меня заинтересовало, насколько эффективен CycleGAN при обработке видео, поэтому в этой краткой статье я приведу краткое описание принципов работы CycleGAN, а потом расскажу, как использовать официальную реализацию CycleGAN для применения художественных стилей Моне, Ван Гога и прочих к вашей собственной веб-камере.

Идеи, лежащие в основе CycleGAN

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

  • Научиться устанавливать соответствие и переводить изображения из пространства X в пространство Y (и наоборот)
  • Сохранять целостность изображений: изображение из пространства X, переведенное в пространство Y (и наоборот) должно выглядеть, как исходное изображение, но с применением необходимых стилистических изменений.

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

LGAN(G,DY,X,Y)=Ey∼pdata(y)[logDY(y)]+Ex∼pdata(x)[log(1−DY(G(x)))]

Здесь генератор G принимает изображение X и генерирует изображение G(X), выглядящее так, как могло бы выглядеть изображение из пространства Y. Дискриминатор DY пытается корректно отличить сгенерированные изображения от случайно выбранных изображений из пространства Y. G пытается минимизировать эту цель (генерируя реалистичные изображения), а DY пытается его максимизировать (верно различая сгенерированные и реальные изображения). Эта же цель может использоваться при установке соответствия и переводе из пространства Y в пространство X.

Одного этого недостаточно для достижения желаемой передачи стиля. Обучение с одними соревновательными потерями приведет к успешной генерации из пространства X в пространство Y, но не даст гарантий того, что сгенерированное изображение будет похожим на оригинал. Мы хотим, чтобы преобразование было “цикло-устойчивым”, то есть изображение, переведенное в целевое пространство, а затем переведенное обратно, должно быть как можно ближе к исходному изображению: X -> G(X) -> F(G(X)) примерно эквивалентно X, где F – это генератор, переводящий изображения из пространства Y в пространство X.


Взято из <a href="https://arxiv.org/abs/1703.10593" target="_blank" rel="noopener noreferrer nofollow">"Беспарного перевода изображений с помощью цикло-устойчивых соревновательных сетей"</a>
Взято из “Беспарного перевода изображений с помощью цикло-устойчивых соревновательных сетей”

Чтобы обеспечить этот принцип и достичь нашей второй цели, определим функцию потерь цикло-устойчивости, показанную ниже. Эта функция потерь стимулирует, чтобы X -> G(X) -> F(G(X)) было примерно эквивалентно X, а Y -> F(Y) -> G(F(Y)) было примерно эквивалентно Y.

Lcyc(G,F)=Ex∼pdata(x)[‖F(G(x)−x)‖1]+Ey∼pdata(y)[‖G(F(y))−y‖1]

Итак, у нас есть три функции потерь, которые мы используем для обновления весов CycleGAN в процессе обучения:

  • Соревновательные потери G против DY (X -> Y)
  • Соревновательные потери F против DX (Y -> X)
  • Потери цикло-устойчивости.

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

Автор CycleGAN рекомендует присваивать этим функциям потерь разные веса с помощью переменной lambda. Если вас интересует, что это такое, или какие-либо другие аспекты архитектуры CycleGAN, (например, архитектура слоев), я советую вам обратиться к исходной статье. А теперь, имея некоторое представление о CycleGAN, давайте заставим ее работать с веб-камерами!

Применяем передачу стиля к вашей веб-камере

Чтобы применить стиль Моне, Ван Гога или какой-нибудь другой к вашей веб-камере, мы будем использовать предобученные модели CycleGAN, созданные авторами статьи. Начнем с клонирования репозитория и перейдем на корень в терминале или командной строке. Оттуда нужено запустить несколько bash-команд, предоставленных в папке ./scripts, чтобы загрузить необходимые модели.

        bash ./scripts/download_cyclegan_model.sh style_monet_pretrained
bash ./scripts/download_cyclegan_model.sh style_ukiyoe_pretrained
bash ./scripts/download_cyclegan_model.sh style_cezanne_pretrained
bash ./scripts/download_cyclegan_model.sh style_vangogh_pretrained
    

Эти команды сохранят предобученные CycleGAN’ы в папке ./checkpoints.

Теперь мы создадим в корневой папке файл Python по имени webcam.py – измененную версию test.py, который вместо прогона набора данных через CycleGAN пропустит через нее поток данных с веб-камеры.

Когда вы создадите файл webcam.py, начните с импорта необходимых пакетов:

webcam.py
        import os
from options.test_options import TestOptions
from data import create_dataset
from models import create_model
import cv2
import torch
import numpy as np
    

Затем скопируйте из test.py строки кода для разбора параметров из командной строки:

webcam.py
        if __name__ == '__main__':
    opt = TestOptions().parse()  # получаем опции теста
    # прописываем значения по умолчанию для теста
    opt.num_threads = 0   # тестовый код поддерживает только num_threads = 0
    opt.batch_size = 1    # тестовый код поддерживает только batch_size = 1
    opt.serial_batches = True  # запретить перетасовку данных; закомментируйте эту строку, если нужны результаты для случайно выбранных изображений 
    opt.no_flip = True    # нет поворотов; закомментируйте эту строку, если нужно поворачивать изображения
    opt.display_id = -1   # тестовый код сохраняет результаты в файл HTML
    model = create_model(opt)      # создать модель по заданному opt.model и другим параметрам
    model.setup(opt)               # обычные настройки: конвейеры загрузки и печати; создание scheduler'ов
    if opt.eval:
        model.eval()
    

Мы собираемся изменить параметры webcam.py, отредактировав ./options/base_options.py и установив требуемое логическое значение –dataroot в False, поскольку при использовании веб-камеры нам не нужно указывать папку с данными. Теперь мы используем cv2 для настройки нашей веб-камеры и выдачи ошибки в случае неудачи:

webcam.py
        # начинаем получение видео / настройка веб-камеры
    webcam = cv2.VideoCapture(0)
    # Проверим, удачно ли открылась камера
    if not webcam.isOpened():
        raise IOError("Cannot open webcam")
    

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

webcam.py
         # CycleGan принимает данные в виде словаря
    # проще выполнить это требование, чем переделывать
    # начинаем бесконечный цикл - читаем фреймы с веб-камеры, пока пользователь не прервет цикл с клавиатуры
    data = {"A": None, "A_paths": None}
    while True:

        #ret - это bool, который вернула cap.read() -> независимо от того, удалось ли считать фрейм
        #если считали удачно, сохраняем его в frame
        ret, frame = webcam.read()

        #изменяем размеры frame
        frame = cv2.resize(frame, (256,256), interpolation=cv2.INTER_AREA)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        #модель рассчитывает получить batchsize * channels * h * w
        #добавляем измерение для размера пакета 
        frame = np.array([frame])
        #теперь форма - batchsize * channels * h * w
        frame = frame.transpose([0,3,1,2])

        #переводим массив numpy в тензор
        #данные должны быть тензором для совместимости с запущенной моделью, ожидающей floatTensor'ы
        data['A'] = torch.FloatTensor(frame)
        
        model.set_input(data)  # распаковать данные из загрузчика 
        model.test()

        #получаем только сгенерированное изображение - ищем в словаре ключ "fake"
        result_image = model.get_current_visuals()['fake']
        #используем tensor2im, предоставленный в файле util
        result_image = util.tensor2im(result_image)
        result_image = cv2.cvtColor(np.array(result_image), cv2.COLOR_BGR2RGB)  
        result_image = cv2.resize(result_image, (512, 512))  
    

В конце концов, мы показываем стилизованные фреймы в новом окне. Если пользователь в любой момент нажмет клавишу “Esc”, это окно закроется.

webcam.py
            cv2.imshow('style', result_image)

    #код ASCII клавиши Esc - 27.
    c = cv2.waitKey(1)
    if c == 27:
        break
  cap.release()
  cv2.destroyAllWindows()
    

В данный момент вы уже можете запустить webcam.py с выбранной вами моделью CycleGAN, используя следующую команду из корневой папки:

        python webcam.py  --name MODEL_NAME --model test --preprocess none --no_dropout
    

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

Переход от одного стиля к другому

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

webcam.py
        #настройка циклического переключения стилей
style_models = ['style_monet_pretrained', 'style_vangogh_pretrained', 'style_ukiyoe_pretrained', 'style_cezanne_pretrained']
style_model_index = 0
    

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

Вставьте этот код перед циклом while, кроме предыдущего кода
        #настройка текста
# шрифт
font = cv2.FONT_HERSHEY_SIMPLEX 
# расположение
org = (0, 25) 
# масштаб шрифта
fontScale = 1
# Синий цвет фона 
color = (255, 255, 255) 
# Толщина линий 2 пикселя
thickness = 2
    

Чтобы поместить текст в левом верхнем углу, мы используем функцию cv2.putText(), а для изменения стилей добавим условие, что при нажатии клавиши ‘c’ программа должна загрузить следующую модель из списка style_models. Полная итоговая реализация webcam.py приведена ниже:

webcam.py
        """Тестовый скрипт общего назначения для перевода изображений.

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

Сначала он создает модель и набор данных в соответствии с опциями. Некоторые параметры жестко прописаны в коде.
Затем он запускает перевод для '--num_test' изображений и сохраняет результаты в файл HTML.

Пример (Сначала надо обучить модели или загрузить предобученные с нашего сайта):
    Тестировать модель CycleGAN (в обе стороны):
        python test.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan

    Тестировать модель CycleGAN (только в одну сторону):
        python test.py --dataroot datasets/horse2zebra/testA --name horse2zebra_pretrained --model test --no_dropout

    Опция '--model test' используется для генерации результатов CycleGAN только в одну сторону.
    Эта опция автоматически устанавливает '--dataset_mode single', при которой изображения загружаются только из одного набора.
    Напротив, использование '--model cycle_gan' требует загрузки и генерации результатов в обе стороны,
    что иногда не нужно. Результаты будут сохранены в ./results/.
    Use '--results_dir <directory_path_to_save_result>' to specify the results directory.

    Test a pix2pix model:
        python test.py --dataroot ./datasets/facades --name facades_pix2pix --model pix2pix --direction BtoA

См. больше опций в options/base_options.py и options/test_options.py.
См. подсказки для обучения и тестов на: https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/blob/master/docs/tips.md
Часто задаваемые вопросы см: https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/blob/master/docs/qa.md
"""
import os
from options.test_options import TestOptions
from data import create_dataset
from models import create_model
import cv2
import torch
import numpy as np


if __name__ == '__main__':
    opt = TestOptions().parse()  # загружаем тестовые опции
    # жестко пропишем некоторые параметры для теста
    opt.num_threads = 0   # тестовый код поддерживает только num_threads = 0
    opt.batch_size = 1    # тестовые код поддерживает только batch_size = 1
    opt.serial_batches = True  # запретить перетасовку данных; закомментируйте эту строку, если нужен перевод случайно выбранных изображений.
    opt.no_flip = True    # нет поворотов; закомментируйте эту строку, если нужен результат на повернутых изображениях.
    opt.display_id = -1   # тестовый код сохраняет результаты в файл HTML.
    model = create_model(opt)      # создать модель по заданному opt.model и другим параметрам
    model.setup(opt)               # обычные настройки: конвейеры загрузки и печати; создание scheduler'ов
    if opt.eval:
        model.eval()
    
    #начать съемку видео/настроить камеру
    webcam = cv2.VideoCapture(0)
    # Проверить, корректно ли открылась камера
    if not webcam.isOpened():
        raise IOError("Cannot open webcam")
    
    #циклический проход по стилям
    style_models = ['style_monet_pretrained', 'style_vangogh_pretrained', 'style_ukiyoe_pretrained', 'style_cezanne_pretrained']
    style_model_index = 0

    #настройка текста
    # шрифт
    font = cv2.FONT_HERSHEY_SIMPLEX 
    # начальная точка
    org = (0, 25) 
    # масштаб шрифта
    fontScale = 1
    # Синий цвет фона
    color = (255, 255, 255) 
    # Толщина линий 2 пикселя
    thickness = 2


    #CycleGan принимает данные в виде словаря
    # проще выполнить это требование, чем переделывать
    # начинаем бесконечный цикл - читаем фреймы с веб-камеры, пока пользователь не прервет цикл с клавиатуры
    data = {"A": None, "A_paths": None}
    while True:

        #ret - это bool, который вернула cap.read() -> независимо от того, удалось ли считать фрейм
        #если считали удачно, сохраняем его в frame
        ret, frame = webcam.read()

        #изменяем размеры frame
        frame = cv2.resize(frame, (256,256), interpolation=cv2.INTER_AREA)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        #модель рассчитывает получить batchsize * channels * h * w
        #добавляем измерение для размера пакета
        frame = np.array([frame])
        #теперь форма - batchsize * channels * h * w
        frame = frame.transpose([0,3,1,2])

        #переводим массив numpy в тензор
        #данные должны быть тензором для совместимости с запущенной моделью, ожидающей floatTensor'ы
        data['A'] = torch.FloatTensor(frame)
        
        model.set_input(data)  # распаковать данные из загрузчика
        model.test()

        #получаем только сгенерированное изображение - ищем в словаре ключ "fake"
        result_image = model.get_current_visuals()['fake']
        #используем tensor2im, предоставленный в файле util
        result_image = util.tensor2im(result_image)
        result_image = cv2.cvtColor(np.array(result_image), cv2.COLOR_BGR2RGB)  
        result_image = cv2.resize(result_image, (512, 512))      
        result_image = cv2.putText(result_image, str(opt.name)[6:-11], org, font,  
                   fontScale, color, thickness, cv2.LINE_AA)   
        cv2.imshow('style', result_image)

        #ASCII value of Esc is 27.
        c = cv2.waitKey(1)
        if c == 27:
            break
        if c == 99:
            if style_model_index == len(style_models):
                style_model_index = 0
            opt.name = style_models[style_model_index]
            style_model_index += 1
            model = create_model(opt)      # создаем модель с заданными опциями create a model given opt.model and other options
            model.setup(opt) 
      
        
    cap.release()
    cv2.destroyAllWindows()
        
    

Этот скрипт можно запустить той же командой bash:

        python webcam.py  --name MODEL_NAME --model test --preprocess none --no_dropout
    

Заключение

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

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

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

<a href="https://unsplash.com/photos/T7K4aEPoGGk" target="_blank" rel="noopener noreferrer nofollow">Исходное изображение</a> от Пьетро Ди Гранди
Исходное изображение от Пьетро Ди Гранди
"Ван-Гогнутое" изображение!
“Ван-Гогнутое” изображение!
Это было всего лишь одно из применений CycleGAN, и я рекомендую прочитать в Сети или в литературе о других замечательных возможностях, которыми она обладает.

Файл webcam.py и файлы репозитория можно найти в моей ветке на GitHub.

31
Май
2021

Видео: Необычный Python. Интерфейсы и паттерны. Урок 4

В очередном видео автор рассматривает интерфейсы и паттерны Python. Подробное объяснение и демонстрация реальных примеров.
— Читать дальше «Видео: Необычный Python. Интерфейсы и паттерны. Урок 4»

31
Май
2021

🎥 Делаем DeepFake на коленке: пошаговое практическое руководство

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

28
Май
2021

Видео в surface view не корректно отображается при повороте экрана

Проблема возникает только при изменении ориентации. Если запустить сразу в вертикальном состоянии – все отображается корректно.

Если сразу в горизонтальном, то тоже более-менее все нормально

Но при изменении ориентации начинается беда:

27
Май
2021

Видео: Необычный Python. Полиморфизм, инкапсуляция и перегрузка методов. Урок 3

Продолжение серии видеоуроков по основам Python, которые помогут вам разработать первое приложение. В третьей части — полиморфизм и инкапсуляция.
— Читать дальше «Видео: Необычный Python. Полиморфизм, инкапсуляция и перегрузка методов. Урок 3»

24
Май
2021

Как проигрывать видео в videoview в яндекс или гугл диске?

Хочу проигрывать видео с интернета, лежащее на яндекс или гугл диске.
Просто передать ссылку в ресурс видео не получается.
Снизу пример кода, как я пытался это сделать с гугл диска, но таким образом видео не воспроизводиться:
protecte…

17
Май
2021

Видео: Необычный Python. Циклы, классы и декораторы. Урок 2

Продолжение серии уроков, которые помогут создать первое приложение на Python. Во второй части — знакомство с циклами, классами и декораторами.
— Читать дальше «Видео: Необычный Python. Циклы, классы и декораторы. Урок 2»

13
Май
2021

Видео: основы Python и разработка первого приложения с помощью FastAPI. Урок 1

Автор объясняет основы Python, различия функционального программирования и ООП, а также показывает, как разработать приложение c помощью FastAPI.
— Читать дальше «Видео: основы Python и разработка первого приложения с помощью FastAPI. Урок 1»

07
Май
2021

HTML5 video player работа с субтитрами

https://i.stack.imgur.com/NqoY7.gif
пробую создать свой плеер с интерактивными субтитрами, подскажите как можно реализовать данную идею, на данный момент у меня есть видео и файл с субтитрами к нему, они воспроизводятся и субтитры отобража…

21
Апр
2021

Видео: разработка микросервисов на Python на примере реального проекта

Автор рассматривает код проекта с микросервисной архитектурой, разбирает паттерны DTO и Dependency Injector, а также разъясняет принятые решения.
— Читать дальше «Видео: разработка микросервисов на Python на примере реального проекта»

15
Апр
2021

Какой протокол(http или rtsp) лучше использовать для захвата видео с записью и сохранением? Почему возникает задержка и как исправить? И др. вопросы

Какой протокол(http или rtsp) лучше использовать для захвата видео с записью и сохранением?
Я пробовал использовать по отдельности, у меня получилось так, что http работает с небольшими прерываниями и задержкой(1-2 секунды), а rtsp работа…

11
Апр
2021

Как скачать видео?

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

16
Мар
2021

Подгрузка видео при окончании предыдущего видео

Имеется 4 кусочка видео на сайте
Лежать друг на друге и получается что видно только один
И нужно сделать так чтобы перед тем как закончится первое видео начать подгружать второе, а как первое закончится отключить его и включить второе виде…

05
Мар
2021

Видео блокирует запуск js кода

Проблема такая, на сайте есть видео которые вставлены с помощью тега video, из-за этого js включается через 15-20 секунд, есть предположение что на это влияет загрузка видео, скрипты подключаются снизу страницы, подскажите если предполжени…

27
Фев
2021

Возможно ли мультиплексировать в один медиаконтейнер несколько видеопотоков?

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

16
Фев
2021

📊 Какие медиа предпочитают российские айтишники?

Proglib.io проводит опрос читательской аудитории, чтобы определить популярность используемых российскими ИТ-специалистами медиа-ресурсов. В качестве бонуса – 10 самых популярных русскоязычных каналов на YouTube.

В изобилии информационных продуктов легко запутаться. Proglib.io проводит опрос читательской аудитории, чтобы определить популярность различных ресурсов в российской ИТ-среде. Пройдя по этой ссылке и ответив на вопросы, вы можете получить скидку в 5% на все наши курсы.

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

На данный момент в исследовании уже приняло участие 440 человек – все они или иначе связаны с миром ИТ. На диаграмме ниже наглядно показаны профессии и опыт работы опрошенных специалистов.


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

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


  • Результаты этой диаграммы красноречивы. Подавляющее большинство разработчиков сидят в Telegram. Хотя это больше мессенджер с функциями соц. сети, детище Павла Дурова пользуется огромной популярностью. По состоянию на январь 2021 года количество активных пользователей сервиса составляет около 500 млн. человек и ежемесячно увеличивается примерно на 600 тысяч. Помимо обмена сообщениями тут можно хранить неограниченное количество файлов, создавать и использовать ботов, а также вести группы и микроблоги (каналы). Именно каналы публикуют полезную информацию без отвлекающих факторов, что выгодно отличает Telegram от традиционных социальных сетей. Нет ленты, которую приходится перелистывать – меньше шансов залипнуть на чьей–то странице.
  • Это довольно странно, но занявший второе место в нашем списке соцсетей ресурс тоже не является социальной сетью в привычном понимании. Видеохостинг Youtube – второй сайт в мире по посещаемости – заслуженно находится на лидирующих позициях в нашем исследовании. Все благодаря десяткам тысяч видеороликов по разработке, настройке, отладке и тестированию. Опытные профессионалы делятся здесь с новичками знаниями, готовыми решениями, рабочими методами и идеями, а также дают советы на любые темы.
  • Также стоит отметить довольно часто упоминающийся сайт medium.com. Это быстрая и простая в обращении блог-платформа от создателей Twitter, которая является местом для публикации заметок по связанной с ИТ тематике. Каждый желающий человек или компания могут зарегистрироваться в сервисе и что-то написать.
  • Традиционные социальные сети тоже прекрасно с этим справляются: чтобы потеснить лидеров нашего топа им не хватило совсем чуть-чуть голосов.

Далее мы детально разберем, какие интернет-издания читает наша аудитория.


  • В списке лидеров оказались три крайне полезных ресурса. Во-первых, это Habr.com – русскоязычный сайт в формате системы коллективных блогов (хабов) с техническими и аналитическими статьями. На сайте есть т.н. карма – социальный рейтинг пользователя, который зарабатывается знаниями и авторитетом. Чем у автора она больше, тем весомей его мнение в глазах читателей, поэтому будьте внимательны и учитесь у профессионалов.
  • На втором месте по популярности, по результатам опроса, оказался наш сайт proglib.io. Здесь вы всегда найдете актуальные материалы, которые помогут освоить не только программирование, но и множество других ИТ-профессий. Книги, лекции, видеоуроки и советы, тесты знаний и обсуждение горячих наболевших тем, а также анонсы, туториалы, ссылки, интервью, обзоры, онлайн-курсы, свежие вакансии и много чего еще. Мы запускаем даже собственные авторские курсы, которые ведут опытные преподаватели из главного вуза страны.
  • Третий популярный у опрошенной аудитории ресурс – образовательный проект tproger.ru («Типичный программист»). Известное российское издание посвящено разработке и всему, что с ней связано. Пользователи могут оставлять комментарии к публикациям, ставить лайки, делать закладки и т.д.

10 популярных каналов на Youtube

В нашем исследовании был отдельный вопрос о популярных у аудитории каналах в Telegram и на YouTube. Давайте рассмотрим это более детально:

  1. Канал «АйТиБорода». Автор и ведущий Алексей Картынник (тимлид в компании “SoftTeco”) рассказывает о жизни айтишников изнутри, без цензуры, ярлыков и лишнего пафоса. Его видеоролики помогут вам найти себя в мире цифровой индустрии.
  2. Youtube-канал «Хауди Хо» узбекского блогера Абрахама Тугалова. Здесь вы найдете уроки по программированию, выпуски про хакинг, подборки, топы, гайды и многое другое из типичной жизни программиста.
  3. Канал Сергея Немчинского. Сергей – программист с двадцатилетним стажем, 15 из них – в Java. Проводит авторские интенсивы и освещает актуальные вопросы по разным направлениям в ИТ.
  4. Гоша Дударь – популярный ютубер. У него на канале более 1000 видеороликов на тему разработки, уроков о создании игр и сайтов, изучении языков программирования (C++, C#, Java, Python, С, Swift, Go и др.).
  5. Тимофей Хирьянов, преподаватель кафедры информатики МФТИ, выкладывает свои довольно занимательные лекции и занятия в открытый доступ при помощи своего ютуб-канала.
  6. Владилен Минин – программист со стажем. У него на канале вы найдете большое количество уроков, посвященных веб-разработке. JavaScript и фреймворки, теория и много практики.
  7. «Диджитализируй!» Канал о разработке, цифровом бизнесе, операционных системах, софте и железе. Стримы с обзорами на самые разные темы.
  8. Олег Молчанов. Здесь вы найдете видео уроки по программированию на Python, созданию сайтов и веб-приложений. Есть уроки парсингу сайтов, по Flask, уроки по Django 2, по созданию блокчейна на Python, ботов для Telegram.
  9. «Фрилансер по жизни». Занимательный ютуб-канал украинского ИТ-фрилансера, который регулярно делится со зрителями опытом, наработками, секретами и лайфхаками.
  10. #SimpleCode. Подробные уроки программирования на самых разных языках для новичков и не только.

Стоит также отметить, что наши читатели довольно активно интересуются и не связанными с ИТ каналами, в основном общественно-политической направленности.

Итоги

Судя по результатам, опрошенные нами пользователи стремятся развиваться и двигаться вперед, постоянно самосовершенствуясь. Читают, учатся, прислушиваются к мнению профессионалов и следят за последними тенденциями в мире разработки – и это прекрасная новость. Редакция «Библиотеки программиста» желает вам профессиональных успехов. Со своей стороны мы постараемся помочь читателям интересными и актуальными публикациями. Удачи!

***

Наш опрос все еще продолжается: ответив на несколько вопросов вы можете получить скидку в 5% на онлайн-курс по высшей математике в Data Science Pro от «Библиотеки программиста». За 5 месяцев (2 занятия по 2 академических часа в неделю) вы сможете наработать необходимые для освоения востребованной профессии знания. Занятия ведут опытные преподаватели из МГУ, а программа рассчитана на желающих поступить в «Школу анализа данных» от Яндекс. Качественный материал и живые трансляции с наглядными примерами помогут понять даже самые сложные темы.

08
Фев
2021

Проекты на Django для начинающих: двухчасовой видеокурс

Сделайте эти проекты на Django, чтобы познакомиться с самым популярным фреймворком для создания веб-приложений на языке Python.
— Читать дальше «Проекты на Django для начинающих: двухчасовой видеокурс»

19
Янв
2021

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

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

12
Янв
2021

Data Science для начинающих: 12 проектов на Python за 3 часа

Если только начинаете путь в Data Science, попробуйте сделать эти проекты для начинающих. Они научат вас собирать и визуализировать данные.
— Читать дальше «Data Science для начинающих: 12 проектов на Python за 3 часа»

11
Янв
2021

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

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

07
Янв
2021

Веб-скрейпинг на Python: запускаем парсинг сайтов за 1 час

Парсинг решает кучу практических задач — например, можно отслеживать скидки и сравнивать цены. Простое решение на Python.
— Читать дальше «Веб-скрейпинг на Python: запускаем парсинг сайтов за 1 час»

25
Дек
2020

Боты для Discord на Python: проект для начинающих

Не нужно ничего устанавливать и платить за размещение. Такие боты для Discord без проблем могут работать в бесплатном «облаке».
— Читать дальше «Боты для Discord на Python: проект для начинающих»

20
Дек
2020

Как создать видео "бегущего графика" и объединить его с другим видео?

Мне надо делать подобное видео . Левую часть у меня получается делать – я скачиваю спутниковые снимки и объединяю их в видео в формат mp4 с помощью ffmpeg. Каким образом с помощью каких технологий можно сделать "бегущий график" и…

15
Дек
2020

12 проектов на Python для новичков: трёхчасовой видеокурс

Попробуйте выполнить все эти проекты на Python, от простых к сложным. Видеокурс с подробным объяснением задач и способов их решения.
— Читать дальше «12 проектов на Python для новичков: трёхчасовой видеокурс»