Что нового

Введение в машинное зрение или работа с нейросетями для самых маленьких

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Данный проект носит исключительно академический характер, поэтому изначально весь код будет реализован исключительно встроенными функциями AutoItа или функциями написанными на AutoItе. Без использования сторонних библиотек ускоряющих вычисления в принципе или оптимизированных для ведения нейросетевых вычислений в целом. Поэтому скорость работы нейросетей работающих на основе данного проекта будет в тысячи - миллионы раз медленнее скорости нейросетей работающих на основе профильных фреймворков. Но реализация проекта на чистом AutoItе - позволит заглянуть под капот нейросети и понять все происходящие внутри процессы и их логику, в отличии от реализаций на фреймворке в основе которого лежит целый ансамбль различных языков, ко всему прочему обильно смазанных ассемблерными вставками.

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

Разработка ведется через Git - для возможности в живую лицезреть процесс эволюции кода и всех вносимых правок.
Репозиторий в котором ведется разработка: https://github.com/Belfi/AutoitNNBuilder . Вообще я КРАЙНЕ не рекомендую разрабатывать проекты любых масштабов за пределами гита.
Git клиент используемый при разработке: https://www.syntevo.com/smartgit/
IDE используемая при разработке: https://www.isnetwork.at/isn-downloads/ . Вообще я КРАЙНЕ не рекомендую пользоваться чем-либо кроме ISN ведя разработку на AutoIt.

Доктрины использованные при разработке:

Что нужно знать:
https://ru.wikipedia.org/wiki/Умножение_матриц
https://ru.wikipedia.org/wiki/Перцептрон
https://ru.wikipedia.org/wiki/Сигмоида => https://ru.wikipedia.org/wiki/Логистическая_функция
Прочитать книгу "Тарик Рашид. Создаем нейронную сеть" https://www.ozon.ru/reviews/141796497/

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

v1.97 - Стабильный релиз
- Проведен рефакторинг многих функций в соответствии с используемыми доктринами
- Весь код актуализирован в соответствии результатами ремастеринга
- Добавлена функция сохранения нейросети в файл
- Добавлена возможность загрузки нейросети из файла


Текущий предполагаемый ход развития событий на ближайшие несколько лет:
1) Разработка первой тестовой версии для подтверждения работоспособности всех алгоритмов
2) Рефакторинг кода
3) Возможность выгрузки и загрузки нейросетей
4) Рефакторинг кода
5) Разработка инструментов для замеров производительности

6) Разработка инструментария для создания датасетов
7) Рефакторинг кода
8) Разработка гуя
9) Рефакторинг кода
10) Оптимизация скорости работы
11) Рефакторинг кода
 
Последнее редактирование:
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
perfLogReader

В репозиторий добавлена отдельная утилита perfLogReader. Она читает логи производительности генерируемые работающей или обучающейся нейросетью и выводит их на график.
v1.0g
Есть возможности:
1) Выбирать масштаб графика по оси X чтобы сжимать по горизонтали длинные графики
2) Автообновлять график с заданной паузой после завершения каждого обновления
3) Поиск файлов с расширением .perf в корне папки на уровень выше чем сам ридер
4) Можно выбирать какие именно из найденных логов будут отображаться.
 

Вложения

  • perfLogReader_v1.0g.PNG
    perfLogReader_v1.0g.PNG
    47.2 КБ · Просмотры: 59
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 3
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 4


Добавлено:
Сообщение автоматически объединено:

Оставьте сообщение, чтобы я смог создать еще один зарезервированный пост. Ваше сообщение будет удалено
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 5
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 6
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 7
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 8
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 9
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сообщение зарезервировано 10
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
v1.97 - Стабильный релиз
- Проведен рефакторинг многих функций в соответствии с используемыми доктринами
- Весь код актуализирован в соответствии результатами ремастеринга
- Добавлена функция сохранения нейросети в файл
- Добавлена возможность загрузки нейросети из файла
ОСТОРОЖНО! Запуск обучения нейросети на датасете mnist_train_15000.csv требует 2.5GB оперативной памяти!
Сеть обученная на датасете из 15000 цифр дала результат в 90% успеха при тесте на датасете в 1000 случаев.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Belfigor сказал(а):
... КРАЙНЕ не рекомендую пользоваться чем-либо кроме ISN ведя разработку на AutoIt...
Поясните пожалуйста.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
ISN позволяет организовать худобедно стандартизированный процесс разработки даже без гита. Ведение чейнджлогов, чеклистов, бекапы, встроенный редактор гуя и прочий функционал необходимый для цивилизованной разработки в одиночку или группой. Это позволяет стандартизировать сложный техпроцесс, к чему как правило не очень готовы "разработчики в блокнотике". Но это не более чем моя рекомендация и доктрина текущего проекта. Если скрипт не сложный, состоит из 1 файла в пару-тройку тысяч строк - можно обойтись и без ISN.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Вот как выглядит кривая обучения нейросети текущего проекта. Обучение ведется на выборке из 15000 образцов. Из датасета MNIST train, были взяты первые 15000 записей.
Оценка производится каждый раз после обучения сети на каждом новом примере. Тоесть показываем сети один пример - оцениваем результат, записываем, показываем следующий пример, снова оцениваем.
Для оценки были взяты первые 1000 цифр из датасета MNIST test. После каждого обучения из этого датасета берется 100 случайных цифр и подаются на вход сети. По результату 100 проверок случайными числами имеем % распознавания, он и отмечен на графике.
На графике изображено как росла эффективность сети с каждым обучением. На данный момент она изучила 333 примеров из 15000.
Из-за того что после каждого запуска _Train запускается оценка на 100 подходов, обучение идёт ооочень медленно. 333 примера изучено за 169 минут. На прохождение всего датасета из 15000 понадобится примерно двое суток непрерывной работы :smile:
 

Вложения

  • Обучение на 376 примерах.png
    Обучение на 376 примерах.png
    17.8 КБ · Просмотры: 29
  • Обучение на 1812 примерах.PNG
    Обучение на 1812 примерах.PNG
    13.4 КБ · Просмотры: 20

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
я так понимаю, что долго обучать смысла нет? Еще и вредно может быть?
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Да. Учить сеть сверх какой-то результативности которая устраивает - нету смысла. Есть риск её переучить. Обученная сеть пускается в продакшен и если там работает без сбоев - всё ок. Если же даются сбои - то расширяется учебный набор и всё начинается снова.
Позже я добавлю визуальный инструмент с помощью которого можно будет визуально сравнить графики успешности применения тех или иных стратегий и датасетов использованных для обучения.
При обучении имеет смысл играться с различными уровнями LR. В моём случае я пока везде использую 0.3, но есть большой смысл попытать счастье на меньших коэффициентах, это может дать лучший результат.
Так же имеет смысл тестировать меньший размер скрытого слоя. В моём случае я от балды взял 200 нейронов скрытого слоя, возможно хватит и 20. Чем меньше в сети нейронов тем она быстрее работает.
Сеть способная распознать цифру MNIST - готова на обучение на любых иконках. Нужно только добавить механизм генерации этих иконок. В частности иконки овервью евы - значительно меньше иконок MNIST и обучение на них происходит быстрее даже при их большем их количестве.
Незнаю добавлю ли я в проект такой готовый инструмент или же опишу лишь его теоретические концепты, в любом случае его реализация очень проста.


Добавлено:
Сообщение автоматически объединено:

Собственно вот что я имел ввиду http://www.gifyu.com/image/9s2s
Я запустил одновременно на обучение 6 нейросетей.
Настройки нейросети указаны в её названии [HR*] - Это количество скрытых слоёв, [LR*] - это коэффициент обучения. Каждая сеть училась на 3000 примеров. Каждый пример прежде чем быть поданным сети на обучение, был подан ей же на тест. Для построения графика, использовалось количество успешных распознований за последние 100 попыток. Именно эти результаты отображены на графиках.
Сеть MNIST_test_3000_[HR25][LR0.3]__NNTestResults всего с 25ю скрытыми слоями отработала быстро как понос, при том что достигнутый ею в конце результат, не смогла превзойти сеть с 50ю нейронами в скрытом слое, при том что LR у неё был такой же. При этом сеть с 25ю нейронами с самого начала и почти до самого конца показывала результаты хуже чем сеть с 50ю нейронами.
А сеть MNIST_test_3000_[HR100][LR0.99]__NNTestResults хоть и осуществила несколько попыток, но всё же не смогла перегнать сеть с таким же количеством нейронов, но с LR 0.3
Всё необходимое для повторения эксперимента есть в репозитории.
 

Вложения

  • MNIST_test_3000_[HR25][LR0.3]__NNTestResults.PNG
    MNIST_test_3000_[HR25][LR0.3]__NNTestResults.PNG
    15.1 КБ · Просмотры: 27
  • MNIST_test_3000_[HR100][LR0.99]__NNTestResults.PNG
    MNIST_test_3000_[HR100][LR0.99]__NNTestResults.PNG
    15.3 КБ · Просмотры: 24

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Хотелось бы уже перейти к практической части...
К примеру, иконка в EVE 12x12 пикселей.
Для того чтобы использовать нейросеть, нам нужно:
а) натренированная сеть.
а-1) для того что-бы натренировать сеть нам нужна тренировочная база, для этого мы скриншотим все нужные иконки во всех вариациях и сохраняем их в bmp формат
а-2) получаем со всех картинок карту яркости пикселей и сохраняем в массив. (я так понимаю одна строка массива: это одна картинка записанная в строку.)
а-3) вот тут что? Есть эталонный массив и что с ним делать?
...

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

OffTopic:
Что-то как-то не понятно...
выходные тяжело дались...
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Там инструменты все для создания иконок с экрана и генерации из них датасетов уже вроде есть в репозитории. Пока очень сильно занят другим проектом, думаю скоро найду время продолжить с этим :smile:
 
Верх