Сегодня у нас нестандартный проект: будем устанавливать и запускать настоящую нейросеть у себя на компьютере.
👉 Мы пока не будем подробно разбирать тонкости работы алгоритмов и писать нейронку с нуля. Вместо этого мы используем уже готовые скрипты и алгоритмы и попробуем повторить это в домашних условиях. Вам достаточно использовать команды в той же последовательности, и вы получите тот же результат.
И ещё: нейросети — это на самом деле скучно, медленно и не очень эффектно в настройке. Мы привыкли сразу видеть классный и красивый результат, а то, что было до этого, нам обычно не показывают. Эта статья работает наоборот: долго показывает весь процесс, а финальный результат получается за пару секунд.
В этом суть нейросетей: долгая и кропотливая работа ради эффектной концовки.
Что сделаем
Мы настроим и обучим нейросеть, которая будет распознавать картинки и говорить, какой цветок мы ей показываем — розу, тюльпан или что-то другое. Мы используем цветы, потому что скачали уже готовый, собранный и размеченный набор фотографий, на котором нейронка может научиться. Если вы хотите, чтобы она научилась распознавать на фото вас или ваших друзей, нужно будет собрать другой датасет и переобучить нейронку.
Как собрать и настроить такой датасет — расскажем в другой раз.
Что понадобится
Python версии 3.8 и выше, обязательно под архитектуру x64. Если взять 32-разрядную версию, то нужная в проекте библиотека tensorflow работать не будет. Мы использовали версию 3.9.7.
Остальное установим в процессе. Главное — рабочий Python (по ссылке — как его установить).
👉 Все команды, которые есть в проекте, мы будем запускать в командной строке. Чтобы не было ошибок и затыков, лучше всего запустить её от имени администратора (в Windows) или с правами суперпользователя root (в Mac OS и Linux).
Создаём виртуальное окружение
Чтобы не раскидывать файлы, скрипты и картинки по всему компьютеру, создадим в питоне виртуальное окружение — специальный проект, который хранит все данные внутри своей папки. Он не мешает остальным проектам и не влияет на работу других программ.
Чтобы подключить себе виртуальное окружение, запускаем команду:
pip install --upgrade virtualenv
Теперь можно устанавливать окружение. Для этого придумаем ему название — мы выбрали tell-me, но вы можете выбрать любое другое:
virtualenv --system-site-packages tell-me
Запускаем окружение:
source tell-me/bin/activate (если у вас мак или линукс)
tell-me\scripts\activate (если у вас виндоус)
Эта команда создаст папку на компьютере (путь к ней можно посмотреть на предыдущем скриншоте на третьей строке, параметр «dest») и запустит в ней виртуальное окружение:
Устанавливаем tensorflow
Tensorflow — открытая библиотека для машинного обучения и работы с нейросетями. Она будет отвечать за то, чтобы наш компьютер мог запустить нейросеть и правильно с ней работать.
Для установки пишем команду:
pip install tensorflow
pip — это программа, которая отвечает в Python за скачивание, установку и обновление библиотек и вспомогательных пакетов. Это как магазин приложений Apple, только для командной строки и для разработчиков.
Чтобы убедиться, что библиотека установилась правильно и работает штатно, проверим её простым тестом.
1. Пишем команду:
python
2. Начало командной строки поменялось на >>> — это значит, питон готов к приёму своих команд. Пишем по очереди такое:
hello = tf.constant('Hello, TensorFlow')
sess = tf.compat.v1.Session()
print(sess.run(hello))
Если в ответ питон нам выдал что-то вроде 'Hello, TensorFlow', это значит, что мы всё сделали правильно.
Устанавливаем классификатор
Классификатор в нейросетях — это алгоритм, который смотрит на объекты и пытается понять, к какой категории их отнести. То есть классифицировать.
Задача нашего классификатора — научить нейросеть понимать, чем одни цветы отличаются от других. Если бы мы вместо цветов использовали фото зданий, нейронка бы научилась отличать барокко от роккоко и неоклассицизма.
- Качаем архив с классификатором.
- Распаковываем архив.
3.Копируем содержимое архива в папку tell-me. Если вы выбрали другое название для проекта, замените tell-me на своё название.
Добавляем фото для обучения
Скачиваем уже собранный датасет с цветами, распаковываем его и копируем в папку tell-me → tf_files.
Адаптируем скрипты под актуальную версию tensorflow
👉 На момент написания статьи актуальная версия tensorflow — 2.0. Но скрипты и алгоритмы, которые мы используем, заточены под старую версию, поэтому нужно применить немного магии автозамены:
- Переходим в каталог tell-me/scripts и находим файл retrain.py.
- Открываем его в любом редакторе кода, например Sublime Text 3.
- Нажимаем Ctrl + H или Command + H — включится режим поиска и автозамены текста.
- Первая строка (что заменить) → пишем tf. (с точкой).
- Вторая строка (на что заменить) → пишем tf.compat.v1. (тоже с точкой в конце).
- Нажимаем Replace All (Заменить всё).
- То же самое делаем в файле label-image.py.
- В том же файле label-image.py добавляем после строки 25 «import tensorflow as tf» такую строку:
tf.compat.v1.disable_eager_execution()
Благодаря этому колдунству мы заставим старый скрипт работать с новой библиотекой.
Обучаем нейросеть
- В командной строке командой cd переходим в папку tell-me (или в другую, если у вас проект называется по-другому).
- Запускаем команду:
python scripts/retrain.py
--output_graph=tf_files/retrained_graph.pb
--output_labels=tf_files/retrained_labels.txt
--image_dir=tf_files/flower_photos
Пошёл процесс обучения. В нём 4000 этапов, по времени занимает примерно 20 минут. За это время нейросеть обработает около 250 фото (это очень мало для нейросети) и научится отличать розу от ландышей:
Запускаем нейросеть
Чтобы проверить работу нашей нейросети, скачиваем любой файл с розой из интернета, кладём его в папку tell-me (или как у вас она называется) и пишем такую команду:
python scripts/label_image.py --image image.jpg
Нейросеть думает, а потом выдаёт ответ в виде процентов. В нашем случае она на 98% уверена, что это роза:
А вот как нейросеть реагирует на фото Цукерберга:
50% — что на фото тюльпан, и на 18% — что это одуванчик. А всё потому, что она умеет различать только 5 видов цветов, а не всяких там цукербергов.