Нейросети
Современно и модно в любой проект пихать нейросети. Одно упоминание этого, не всем пока понятного чуда современных инф. технологий, даёт +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.
- NV пока не прокидывается в докер. Или там ставить драйвера / CUDA, или пробовать NV контейнеры;
- улучшить отображение при обучении (какой-нить текстовый оконник, как свежий docker build);