LINUX.ORG.RU

Сообщения Kogrom

 

Про нейросети для машинного зрения

Тут будут некоторые рассуждения об особенностях применения нейросетей в машинном обучении. Просьба указать на неточности.

  1. Альтернативы. Алгоритмы с обучением в машинном зрении применялись давно. В основном использовался «метод опорных векторов» (SVM) и «К ближайших соседей» (KNN, где NN не имеет никакого отношения к нейросетям). По скорости обучения и требовательности к ресурсам они были намного лучше свёрточных нейросетей из популярных фрейворков. По точности были где-то наравне с нейросетями, а иногда и лучше. Основной их недостаток — необходимость предобработки изображений, выделение признаков «ручками».

Правка. Критерием выбора нейросети может быть Inductive bias (априорные знания о природе данных, которые человек некоторым образом вкладывает в модель машинного обучения), а также размер датасета и число категорий сортировки. При малом датасете и числе категорий классические решения могут дать лучшую точность. При большом датасете нейросети обычно выигрывают.

  1. Эпохи. При обучении нейросетей используются две выборки с фото — тренировочная и тестовая. На тренировочной сеть обучается, а тестовая используется для оценки полученной точности. В каждой эпохе мы подгоняем коэффициенты так, чтобы результаты сортировки тестовой выборки становились лучше. Соответственно, на определённом этапе мы получаем так называемое «переобучение», когда мы слишком сильно подогнали решение под тестовую выборку. Номер эпохи, в которой недообучение переходит в переобучение сказать трудно. Поэтому если датасаентист берёт точность сортировки в, например, сотой эпохе и говорит, что это точность у полученной модели, то он лукавит или заблуждается. Данная точность может быть результатом переобучения. Вопрос в том, может ли быть переобучение уже во второй эпохе.

Правка: влияние тестовой выборки некорректно называть переобучением. Более точно будет говорить об «утечке данных из валидационной части».

  1. Аугментация данных. Для улучшения точности сортировки производят деформации изображений датасета. Например, мы можем повернуть или растянуть изображения. При удачной аугментации будет прирост точности. С другой стороны, работоспособность такого приёма может говорить о несовершенстве нейросетей.

Правка: аугментация помогает внедрить inductive bias в нейросеть.

  1. Кропы. Обычно для обучения нейросетей используются квадратные изображения заданного размера (кропы), в котором объект размещается оптимально. Если объект вылезает из кропа или занимает слишком мало места, то точность будет понижаться. Вторая проблема — выделение кропа из фона. При использовании альтернативных методов обучения мы можем не использовать квадратных кроп с жёстким размером. Мы можем даже использовать непрямоугольные изображения, если удалим фон. Нейросеть же «ест» объекты прямо с фоном из-за чего могут быть внесены искажения.

Правка: для выделения кропа датасаентистам может помочь YOLO.

  1. Распознавание в 3Д. Если мы сделали снимки объекта с разных сторон, то при использовании своего алгоритма мы можем воссоздать 3Д-модель (облако точек) и работать с ней. При использовании нейросетей из фреймворков мы можем оценить фото каждого ракурса отдельно как 2Д, а потом как-то усреднить. Очевидно, что такой подход не идеален. При использовании же трёхмерного облака точек нейросети будут обучаться вечно.

 , , ,

Kogrom
()

О статической типизации для обычных людей

Навеяло темой Снова о статической типизации . Там всё как-то сложно, для умных, через мьютексы. Я решил упростить задачу для понимания обычными программистами:

Есть три функции, которые должны всегда идти по порядку. То есть func_1(), func_2(), func_3() - правильно, а func_3(), func_2(), func_1() или func_2(), func_1(), func_3() - неправильно. Ошибка должна определяться на этапе компиляции.

Решаем с помощью немного нестандартного чейнинга:

#include <iostream>

using namespace std;

class Chain3
{
private:
    Chain3(){}
public:
    friend class Chain2;
    void func_3()
    {
        cout << "func_3()" <<  endl;
    }
};

class Chain2
{
private:
    Chain3 chain3{};
    Chain2(){}
public:
    friend class Chain1;
    Chain3 & func_2()
    {
        cout << "func_2()" <<  endl;
        return chain3;
    }
};

class Chain1
{
private:
    Chain2 chain2{};
public:
    Chain2 & func_1()
    {
        cout << "func_1()" <<  endl;
        return chain2;
    }
};

int main()
{
    Chain1().func_1().func_2().func_3();
    return 0;
}

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

Кроме типизации тут использованы ещё и особенности языка C++, позволяющие обойтись без макросов. В си или расте, вероятно, без макросов не получится. На Go, вероятно, такой код вообще не написать, хотя там и статическая типизация.

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

 ,

Kogrom
()

9 мая

Поздравляю с Праздником!

Понимаю, что время не простое, все думают как бы чего не вышло, как бы кто не обиделся, не устроил вакханалию. Но на этот случай была рекомендация от Альфы и ответ Хоббита. Надеюсь эти цитаты ещё актуальны.

 ,

Kogrom
()

Растровый 64-битный шрифт 7x9

Делюсь реализацией одной идеи. В библиотеках типа SDL2 своих встроенных шрифтов обычно нет. Для этого предусмотрены дополнительные библиотеки, зависеть от которых не хочется, да и придётся цеплять файл со шрифтом. Поэтому в Allegro, например, предусмотрели альтернативу: простейший растровый шрифт 8x8. Но там нет кириллицы.

У шрифтов 8x8 есть ещё такие недостатки: буквы маленькие и широкие, что особенно заметно на строчных. Это усугубляется тем, что некоторые буквы выступают вниз (например, «Д», «Щ») или вверх (Ё), из-за чего приходится оставлять пустое место сверху и снизу для остальных букв.

Шрифт 7x9 по битам занимает почти столько же, но выше и уже, что выглядит приятнее. Кроме того, лишний 64 бит можно использовать для признака сдвига вниз. Тогда не надо будет оставлять пустое место снизу. То есть строчка будет высотой даже не 9, а 10.

Коды для символов можно посмотреть тут (raw.githubusercontent.com). В отличие от Allegro я использовал не 8 uint8_t на символ, а одну uint64_t.

Исходный файл для правки тут (raw.githubusercontent.com). В качестве исходника используется не растровое изображение, а текстовое (ASCII art), для удобства трансляции. Приведу пример таких исходных символов:

В
.
.......
.#####.
.#....#
.#....#
.#####.
.#....#
.#....#
.#....#
.#####.
Г
.
.......
.#####.
.#.....
.#.....
.#.....
.#.....
.#.....
.#.....
.#.....
Д
#
...###.
..#..#.
.#...#.
.#...#.
.#...#.
.#...#.
.#...#.
#######
#.....#

Перед каждым изображением буквы оставил признак сдвига: точка если сдвига нет, # - если сдвиг на 1 вниз.

 , ,

Kogrom
()

Stodin DSL. Тема 5. Графический редактор (пиксель-арт).

Продолжаю развлекать публику. Почти создал графический редактор на своём DSL-е с помощью SDL2. Видео с примерами использования тут (youtu.be) и тут (youtu.be). Видео записано в XUbuntu 20.04. Исходный код тут (github.com).

Интересные особенности.

  • Картинка сохраняется в текстовом виде. Каждый пиксель кодируется одним читаемым ASCII символом. Так сделано для простого внедрения картинки в текст программ (игрушек). Соответственно, число цветов ограничено 64 оттенками. В первом ролике видно, что на практике я не сразу научился правильно подбирать нужные цвета.
  • Я решил не использовать библиотеки шрифтов. Навелосипедил свой простой растровый шрифт. Каждая буква занимает одну 64-битную переменную (uint64_t). Исходник шрифта в виде абзацев 8x8 тут (github.com). Преобразованные символы тут (github.com).
  • Не использовалось ООП, указатели, функции обратного вызова. При этом в Windows и Linux компьютер особо не нагружается. В Wine почему-то тормозит.

Пока что недоделал диалоги сохранения. Нормальные люди дергают диалоги из имеющихся в системе библиотек. Но такой путь мне представляется ненадёжным. Буду что-то велосипедить. Пока что просто сохраняю в picture.txt.

 ,

Kogrom
()

Stodin DSL. Тема 4. Квадраты.

Продолжаю серию тем про язык программирования Stodin DSL, который разрабатываю через проекты. В этот раз создал игру «Квадраты», на основе ранее созданной игры «Четыре героя». Основное назначение игры - занять себя чем-то во время видеоконференций или прослушивания «болтологов».

Процесс игры записал на видео: https://www.youtube.com/watch?v=YZUAp45pT8Q (ссылку уже давал в другой теме)

Код игры: https://github.com/kupriyanov-sn/StodinDSL/blob/master/examples/sdl_four_heroes_game

Инструкция и бинарики здесь: https://disk.yandex.ru/d/xJhJrNFPqgNLyg?w=1

Версия для Linux требует библиотеку SDL2. Работу проверял только в Убунте. Также можно запустить под Wine виндовую версию.

Не удержался и внёс изменения в синтаксис языка: добавил case. Через if-elif некоторые конструкции тяжело читать. В питоне в таких случаях делают словарь с указателями на функции, но это сложнее для восприятия. Может быть когда-нибудь и реализую через делегаты.

Вопросов у меня нет. Просто решил поделиться.

 , ,

Kogrom
()

7.1 Ответ на некорректное сообщение (авто, уровень 0) (-2)

Мне пришло два уведомления, что я ответил на некорректное сообщение в теме: Stodin DSL. Тема 3. Тетрис. . Но я там общался только с monk и правильным Владимиром (который создаёт ЯП на метаданных). Я перестраховывался и не отвечал на сообщения от ox55ff, seiken и Binkledum, которые могли быть восприняты как некорректные. Понимаю, что в некоторых темах я по неосторожности Царю отвечал и за это мне даже через пол года приходят уведомления. Но тут то что?

 , ,

Kogrom
()

Stodin DSL. Тема 3. Тетрис.

Очередная тема про язык программирования без скобочек.

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

https://github.com/kupriyanov-sn/StodinDSL/tree/master/examples/sdl_tetris

Сделано с применением основной библиотеки SDL2. Теоретически, будет работать под Linux, хотя сборку проверял только под Windows.

 , ,

Kogrom
()

Stodin DSL. Тема 2. Четыре героя.

Моему «коллеге» по созданию средств программировании на форуме задали задачку: создать тетрис, чтобы проверить возможности языка. Он отказался, а мне идея мне показалась интересной. Графика у меня пока не прикручена, поэтому я решил в качестве теста сделать консольную игрушку, которая только по духу близка к тетрису, лайнс, пасьянсу и т.д. За прототип я взял «Darkest Dungeon» и упростил до минимума.

Исходный код тут: https://github.com/kupriyanov-sn/StodinDSL/tree/master/examples/four_heroes_game

Также есть временная ссылка на архивы с бинариками и транслированным кодом C++: https://yadi.sk/d/0rjcBol5eJ_cBg

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

 , ,

Kogrom
()

Stodin DSL

Здравствуйте!

В данной теме представляю для обсуждения язык программирования, созданный с использованием принципов разработки предметно-ориентированных языков (по книге Мартина Фаулера). Ссылка на проект языка: https://github.com/kupriyanov-sn/StodinDSL

Язык называю DSL только по методу разработки и по синтаксису. По возможностям он близок к языкам общего назначения. При этом, по лаконичности он близок к Python, хотя и статически типизированный. Назначение языка - ускорение разработки небольших проектов на C++.

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

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

 , ,

Kogrom
()

RSS подписка на новые темы