Skip to content
Oleg Milantiev edited this page Nov 5, 2023 · 9 revisions

Почему?

Современно и модно в любой проект пихать нейросети. Одно упоминание этого, не всем пока понятного чуда современных инф. технологий, даёт +146% всем характеристикам проекту! Что ж, не буду отставать от моды :)

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

С помощью чего?

YOLOv8 (torch). Очень шустрая нейросетка, обученная на ImageNet (размер 224х224 пикселя в задаче классификации). Позволяет делать вывод о картинке, искать его класс, на основе входного датасета, разделённого на классы.

Подробнее на их сайте - https://docs.ultralytics.com/

Как учить?

Закидываем все фиты, без разбору времени, лишь с пониманием чисто / облачно, в папки /opt/allsky.py/yolo/clear и /opt/allsky.py/yolo/cloud.

В консоли (SSH или клавиатура + комп, подключенные к мини-компу), запускаем /opt/allsky.py/yolo/train.sh.

Параметры запуска:

  • размер модели. Большие модели обучаются существенно дольше, но и точность их решения выше! Размер модели, в соответствии с этой таблицей, обозначается одной буквой из этого ряда: n, s, m, l, x;
  • кол-во эпох. Грубо говоря, кол-во повторов нейросети, пока она "запомнит" результат. Обычно 20 в этой задаче, но можно изменять;
  • номер версии. Число от 1 и выше. Попробовали раз обучить, результат не понравился или появились ещё отсортированные фиты. Запустил ещё раз, подняв номер версии.

В процессе обучения формируется датасет:

  • не учитыватся все засвеченные фиты с mean > 65к;
  • фиты раскидываются по dayTime (с учётом moon) / cloud|clear;
  • фиты уменьшаются до 224х224 - мелкая классификационная нейросеть;
  • картинки переводятся в жпег через imagemagick команду convert -normalize;
  • аугментацией меняются параметры яркости и гаммы.

Обучается 5 нейросеток (day, morning, evening, night, night/moon). Это долго на хилом железе без GPU. Это долго даже на нормальном железе с нейроускорителем!

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

Как использовать?

Живёт в отдельном контейнере. На удивление, хоть и ест память, но проц почти не грузит! Замеры подготовлю потом, так как сейчас пишу и тестирую на большой машине с i3-7xxx / 32 гиг / NVidia Tesla M40 24 Гб

Все части проекта связаны через rabbitmq. Вот и yolo/worker.py слушает очередь yolo и, получив имя фита:

  • определяет часть суток (утро, вечер, день или ночь. Если ночь, то с Луной или без);
  • используя базу весов этой части суток, солвит фит. Не забыв перевести его в жпег через imagemagick команду convert -normalize;
  • сделав вывод и проведя классификацию пришедшего фита, результат вписывается в заголовки фита:
AI-DPART= 'night/moon'         / Day part
AI-CLEAR= 8.99628441674519E-15 / Clear probability
AI-CLOUD=                  1.0 / Cloud probability

... исполнение передаётся дальше в process.py через того же rabbitmq.

TODO list

  • NV пока не прокидывается в докер. Или там ставить драйвера / CUDA, или пробовать NV контейнеры;
  • улучшить отображение при обучении (какой-нить текстовый оконник, как свежий docker build);