Сделано чайниками для чайников
Это серия статей, в которых описывается моя работа над приложением для iOS на основе модели Tensorflow с индивидуальным обучением, Firebase и CoreML. Я сосредоточился на создании полнофункционального приложения и изучении машинного обучения, в то же время встраивая полученные знания в идею, достаточно простую для новичка и которая могла бы извлечь выгоду из дальнейших исследований и дальнейшей работы над оптимизацией.
Заявление об ограничении ответственности: это первая версия приложения, и в нее вносятся улучшения в пользовательском интерфейсе и технической реализации.
Прежде чем говорить о том, для чего я хочу использовать машинное обучение, мне нужен интерфейс для взаимодействия пользователя с моим машинным обучением, лежащим в основе часового механизма. Стоит упомянуть тот факт, что у меня не было Ни информации о Машинном обучении и использовании каких-либо моделей, кроме только определений, ни разработки этого интерфейса (что было бы iOS) перед запуском этого проекта. Этот проект занял у меня 2 месяца неполного рабочего дня (вы можете потянуть его за один с максимальным фокусом), не считая моего расписания обучения в колледже, экзаменов, сроков и, конечно же, неудачных испытаний. Три месяца были для принятия решения об идее, которая объединит оба опыта, изучит детали реализации, изучит концепции и инструменты, которые затем будут реализованы (включая прокрастинацию 🙄)
Шаг 1. Идея 💡
Идея заключалась в том, чтобы ограничить формат данных, с которыми я хотел бы работать с моими моделями машинного обучения. Я выбрал изображения, потому что меня всегда интересовали компьютерное зрение и распознавание объектов.
Меня вдохновило приложение для помощи людям с нарушениями зрения под названием Be My Eyes. Мне понравилась эта идея, но я думал о работе над функциями доступности для мобильных устройств, которые позволят слабовидящим людям быть максимально самостоятельными без необходимости общаться с добровольцами, чтобы читать ему / ей то, что перед ними.
Именно тогда я решил включить в свое приложение три функции:
1. Функция распознавания текста для извлечения текста из изображения, снятого камерой телефона, и озвучивания его для человека в режиме реального времени.
2- Я был потрясен тем фактом, что на некоторых банкнотах еще нет шрифта Брайля, чтобы их можно было различить. доступные варианты, когда автономное устройство, которое сканирует банкноту и произносит ее, или они просто сложили их по-другому.
К тому времени я решил, что простой задачей для начала может быть классификация египетских банкнот и озвучивание их пользователю по сделанной фотографии в режиме реального времени. Простое начало дает вам возможность тщательно и внимательно рассмотреть процесс. Так что теперь это была проблема классификации, которую нужно было решить, но с помощью изображений.
3- Дополнительная функция, похожая на банкноты, но для обнаружения объектов это не было так важно, но я все равно хотел попробовать.
Примечание. Он по-прежнему выглядит некрасиво! Я знаю. Требуется дополнительная работа над пользовательским интерфейсом.
Шаг 2: Исследование 🧐
В тот момент я понял, что мое приложение - это умная задница, которая теперь должна сама решать, какие действия предпринять, и говорить. И что может быть лучше здесь, чем мощная нейронная сеть? … Нейронные… нейроны? … Как можно ближе к мозгу!
Я начал искать лучший способ эффективной классификации изображений. Под эффективностью я подразумеваю максимальную точность, которую я могу получить с наименьшими затратами времени и ресурсов (у меня был только Lenovo Z510i с 4 ГБ оперативной памяти Nvidia). Тогда, конечно, я наткнулся на сверточные нейронные сети. они предназначены для обработки огромных объемов данных и классификации изображений по категориям, принимая решения по нескольким уровням, пока они не сведут его к нескольким категориям с процентами, в которые может попасть ваше изображение. И они также специально разработаны для обработки огромного количества обучающих данных. Подходит к изображениям ... МНОГО!
Легкое проникновение в интуицию нейронных сетей стало возможным благодаря этим удивительным двум ресурсам.
- Нейронные сети и глубокое обучение, книга Майкла Нильсена:
Это фантастическая книга, она интуитивно понятна, проста и посвящена математике и линейной алгебре, лежащим в основе нейронных сетей.
Нейронные сети и глубокое обучение
В академической работе цитируйте эту книгу как: Майкл А. Нильсен,« Нейронные сети и глубокое обучение , Определение… нейронные сети и углубленное обучение .com »
2. Плейлист 3Blue1Brown:
этот плейлист был прекрасным визуальным объяснением.
он предлагает как концепции, так и математику, и вы всегда можете копнуть глубже или продолжить более подробный курс.
Для специальных курсов я полагался на эти два:
Курс Эндрю Нг по машинному обучению был моим стартовым набором, он состоит из двух глав, посвященных нейронным сетям, и он также сделал серию новых курсов, посвященных глубокому обучению в частности (нейронные сети считаются парадигмой глубокого обучения).
Курс очень дружелюбен к новичкам и информативен, особенно когда речь идет об интуиции, моей любимой и самой важной части при изучении чего-то нового.
После изучения концепций наступает следующий шаг
Инструменты выбора ваших сверхспособностей 🐱💻
Существует множество фреймворков для обучения нейронных сетей. Назову четыре самых популярных, которые я обнаружил в ходе исследования:
- Tensorflow
- PyTorch
- Керас
- Кафе
Эти два видео Сираджа Равала («Следуйте за ним, рекомендуется!») Указывают на основные различия между каждой из четырех платформ:
Я выбрал Tensorflow, потому что он позволил мне экспортировать мою модель в облегченной форме, совместимой с мобильными устройствами TFLite. Подробнее о TFLite можно узнать здесь: Ссылка
После выбора фреймворка начинается его настройка на вашей рабочей станции.
Я использовал и Windows 10, и Ubuntu 16.04 (я переключался между ними, если что-то не поддерживалось)
Шаг 3: Инструменты + Настройка рабочей станции 🔧
- ОС: Windows 10 + Ubuntu 16.04 LTS (как уже упоминалось)
- (Если у вас уже есть Macbook, пропустите это!) VMWare Workstation Pro 14.0.0 (для запуска версии MacOS для разработки приложений iOS) Почему я выбрал разработку для iOS, не имея системы MacOS? потому что я просто хотел попробовать! и это сработало!
- Менеджер пакетов Anaconda (Python 3.5)
- Tensorflow GPU 1.7 (вы можете использовать Tensorflow без поддержки графического процессора, если у вас нет карты NVIDIA gfx, и она все равно будет работать)
- cuDNN 7 (библиотека) и CUDA 9.0 (платформа) предоставлены NVIDIA для повышения производительности вышеупомянутых фреймворков за счет использования вычислений с ускорением на графическом процессоре на видеокарте NVIDIA.
- (Если у вас уже есть Macbook, пропустите это!) Образ MacOS High Sierra 10.13.1
- Xcode 9.2 для разработки приложения iOS.
Следуйте этому руководству по установке Anaconda + Python3 в Windows 10 (это применимо и к более новым версиям) и установите tenorflow-gpu из Anaconda.
Вы можете настроить его сразу или использовать виртуальную среду, чтобы отделить его от рабочего пространства по умолчанию.
- Непосредственно с помощью этой команды в подсказке Anaconda
pip install tensorflow-gpu
- Создание виртуальной машины и установка Tensorflow:
$ conda create -n nameofenv python=3.5
#then install Tensorflow-GPU using this command
$nameofenv pip install tensorflow-gpu
Для Ubuntu убедитесь, что вы скачали последнюю версию драйвера карты NVIDIA gfx для Ubuntu и загрузили пакеты cuDNN и CUDA для Ubuntu, а затем установите графический процессор Tensorflow со своего терминала с помощью этой команды:
pip install tensorflow-gpu
Примечание: при установке убедитесь, что вы добавили каталог CUDA в вашей системе в ваш PATH (как указано в видео).
В Windows: найдите переменные среды в поиске Windows, выберите переменную «Путь» и аналогичным образом добавьте каталог CUDA.
В Ubuntu:
Вот как вы это делаете в Ubuntu → перейдите в свой HOME каталог и отредактируйте файл «bashrc».
$ gedit ~/.bashrc #will open the gedit for you to add the linesexport PATH="$PATH:/path/to/dir"
#save the file then in terminal write:
$ source ~/.bashrc
Чтобы получить подробное руководство с другим вариантом, отметьте это.
Шаг 4: Сбор денег 🤑… .Dataset 😏
После настройки нам понадобятся данные для обучения нашей модели определению валюты. Я делал фотографии с помощью камеры своего телефона (лучше быть в высоком качестве) и делал снимки с разными египетскими валютами в разных положениях и условиях освещения (то есть, держа его в руке (поскольку в основном это будет то, как вы снимаете с помощью приложения) и на разные поверхности с большим количеством элементов на заднем плане и с меньшим количеством элементов, среди прочего, валюты ... и т. д.)
Затем я собрал все фотографии каждой валюты в отдельной папке, например:
Примеры фотографий:
Шаг 5: Пусть начинается волшебство!
Я полагался на это руководство от Google CodeLabs.
Я клонировал их репо из Github и использовал скрипты для обучения своего классификатора для валют.
Примечание. Чтобы клонировать репозиторий, вам необходимо установить пакет git в виртуальной среде Anaconda.
Во-первых: активируйте его в подсказке Anaconda.
$ activate yourenvname
Во-вторых: установите Git для Anaconda.
$(yourenvname) conda install -c anaconda git
Третье: клонирование
$ git clone https://github.com/googlecodelabs/tensorflow-for-poets-2
Теперь у вас есть все скрипты, которые вам понадобятся для обучения. Вам просто нужно
- выберите модель для обучения из пула предварительно обученных моделей Google.
- настроить некоторые параметры для запуска скрипта.
A. Выбор модели
Есть несколько предварительно обученных сетей, с которыми вы можете работать, но они различаются по точности, размеру модели и скорости обнаружения. .
Найди их здесь
Я выбрал MobileNet_v1_0.50_224, потому что мне нужна была более легкая модель, и ее точность была приемлемой для моего приложения с соответствующими шагами обучения и более высоким качеством изображения.
MobileNet можно настроить двумя способами:
Разрешение входного изображения: 128, 160, 192 или 224 пикселей. Неудивительно, что загрузка изображения с более высоким разрешением требует больше времени на обработку, но приводит к повышению точности классификации.
После загрузки модели добавьте ее в каталог с названием «models» (создайте его) и добавьте в каталог «tf_files» в клоне репозитория GitHub на вашем компьютере. Затем добавьте каталог изображений после категоризации фотографий в каталог tf_files. (Вы можете разместить их где угодно, но рекомендуется хранить все ваши данные и модели в одной рабочей области для облегчения доступа)
Б. Переобучение модели
Перед началом обучения мы откроем сессию тензорной доски, чтобы отслеживать процесс обучения и сохранять статус обучения в файлах журнала в нашем каталоге журналов.
tensorboard --logdir tf_files/training_summaries &
затем следуйте URL-адресу, который он дает вам для мониторинга. это должно быть примерно так http: // your-pc-name: 6006
Перейдите в папку репозитория с помощью приглашения anaconda, затем перейдите в папку скриптов, чтобы запустить скрипт retrain.py, написав в командной строке следующее.
но сначала нам нужно настроить две переменные среды
IMAGE_SIZE=224 ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}"
чтобы сделать это в нашей среде Anaconda сразу после ее активации, мы перейдем в каталог среды anaconda и создадим файл bat, следуя этим инструкциям в приглашении anaconda.
cd %CONDA_PREFIX% mkdir .\etc\conda\activate.d mkdir .\etc\conda\deactivate.d type NUL > .\etc\conda\activate.d\env_vars.bat type NUL > .\etc\conda\deactivate.d\env_vars.bat
затем мы отредактируем файл env_vars с указанными выше переменными среды следующим образом.
set IMAGE_SIZE=224 set ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}"
Совет. Вы можете
1. перейдите в каталог anaconda, в котором он установлен в вашей системе, а затем в каталог envrionments (C: \ users \ yourusername \ Anaconda3 \ envs \ yourenvname \ etc \ conda) и создайте каталоги activate.d, deactivate.d и Файл env_vars.bat с вашими переменными внутри каталога activate.d.
2. вместо того, чтобы устанавливать переменные среды, вы можете запустить сценарий и отредактировать свои флаги при написании команды во время выполнения.
Начать обучение так же просто, как отправить эту команду на свой терминал.
python -m scripts.retrain --bottleneck_dir=tf_files/bottlenecks --how_many_training_steps=500 --model_dir=tf_files/models/ --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" --output_graph=tf_files/retrained_graph.pb --output_labels=tf_files/retrained_labels.txt --architecture="${ARCHITECTURE}" --image_dir=tf_files/money_photos
То, что я выделено жирным шрифтом, вы можете настроить в зависимости от введенных вами данных и регистра. Вы можете либо изменить их в своей команде, как я упоминал в пункте 2 последнего совета, либо вы можете установить их в переменных среды. Флаги должны быть
training_steps: первая команда повторного обучения повторяется всего 500 раз. Вы можете улучшить его, тренируясь для большего количества итераций. Вы можете удалить
--how_many_training_steps
, чтобы использовать 4000 итераций по умолчанию.
АРХИТЕКТУРА: он настроен в вашем файле env_var, или вы можете заменить его в приведенной выше команде, добавив mobilenet_0.50_224 между двойными кавычками.
image_dir: путь, указывающий на каталог, в котором фотографии вашего тренировочного набора сгруппированы по папкам.
model_dir: путь к загруженной модели.
output_graph: путь к которому вы хотите экспортировать обученную модель после обучения.
output_labels: путь к которому вы хотите экспортировать метки обучения после обучения.
Начнется обучение, и вы получите что-то похожее на это
Вы получите точность обучения, точность проверки и перекрестную энтропию (ваша ошибка). Мы хотим максимально увеличить первые два и свести к минимуму нашу ошибку ofc.
По окончании указанных вами шагов обучения вы должны просмотреть свой статус обучения и убедиться, что точность и ошибка приемлемы для вас или вы хотите повторно обучиться. Вот что я получил к концу тренировки.
точность обучения 100%, проверка 95% и ошибка = 0,002313
Поздравляю! 🎉 У вас есть обученная модель, и вы найдете файл модели и метки в выходном каталоге, указанном в наших флагах, в нашем случае: в каталоге tf_files (если вы не изменили выходные каталоги). Модель будет представлять собой файл: retrained_graph.pb и метки: retrained_labels.txt.
Держите их в безопасности, так как они понадобятся нам на следующем шаге.
Вы можете протестировать свою модель на фотографиях, не входящих в ваш обучающий набор, и увидеть результаты с помощью сценария label_image в репозитории, который вы клонировали.
python -m scripts.label_image --graph=tf_files/retrained_graph.pb --image=tf_files/your_photos_dir/'Ten Pounds'/1.jpg
Вы получите вывод категорий классификации в процентах для выбранной вами фотографии.
C. Преобразование модели в формат Tf-Lite
Чтобы преобразовать обученную модель в облегченную версию, которую мобильный телефон может обрабатывать и обрабатывать, мы сначала используем инструмент оптимизации, предоставляемый Tensorflow, который удаляет некоторые ненужные узлы в вашей сети, которые не влияют на операцию вывода, а также ускоряют процесс. он в основном инкапсулирует некоторые операции и удаляет те, которые не сильно влияют на них и не поддерживаются нашими мобильными телефонами.
Мы запустим сценарий оптимизации для нашего файла обученной модели следующим образом.
python -m tensorflow.python.tools.optimize_for_inference --input=tf_files/retrained_graph.pb --output=tf_files/optimized_graph.pb --input_names="input" --output_names="final_result"
Теперь, после оптимизации модели, мы произведем окончательное преобразование в модель TFLite, запустив скрипт конвертера моделей.
Установив переменную среды IMAGE_SIZE = 224 и указав путь к обученной модели и выходной путь для файла .lite, который будет результатом процесса преобразования, вы готовы нажать ENTER.
IMAGE_SIZE=224 tflite_convert --graph_def_file=tf_files/retrained_graph.pb --output_file=tf_files/optimized_graph.lite --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3 --input_array=input --output_array=final_result --inference_type=FLOAT --input_data_type=FLOAT
после завершения преобразования вы найдете файл .lite в указанном вами пути вывода, и именно эту модель мы будем использовать в нашем приложении для iOS.
Фух! Миссия выполнена!… Только первая часть, не волнуйтесь 🤪. Но вы можете немного расслабиться, чтобы отпраздновать первые шаги, при необходимости провести углубленное исследование концепций, с которыми вы столкнулись, пока я не опубликую следующую часть этой серии, где я подробно расскажу о процессе создания приложения для iOS с помощью три функции, которые я представил в начале, и то, как использовать модель, которую мы обучили, и развернуть ее в нашем приложении.
Вторая часть серии: скоро! (Разработка приложений для iOS и развертывание моделей)
Ссылка на проект на Github Здесь