Сделано чайниками для чайников

Это серия статей, в которых описывается моя работа над приложением для iOS на основе модели Tensorflow с индивидуальным обучением, Firebase и CoreML. Я сосредоточился на создании полнофункционального приложения и изучении машинного обучения, в то же время встраивая полученные знания в идею, достаточно простую для новичка и которая могла бы извлечь выгоду из дальнейших исследований и дальнейшей работы над оптимизацией.

Заявление об ограничении ответственности: это первая версия приложения, и в нее вносятся улучшения в пользовательском интерфейсе и технической реализации.

Прежде чем говорить о том, для чего я хочу использовать машинное обучение, мне нужен интерфейс для взаимодействия пользователя с моим машинным обучением, лежащим в основе часового механизма. Стоит упомянуть тот факт, что у меня не было Ни информации о Машинном обучении и использовании каких-либо моделей, кроме только определений, ни разработки этого интерфейса (что было бы iOS) перед запуском этого проекта. Этот проект занял у меня 2 месяца неполного рабочего дня (вы можете потянуть его за один с максимальным фокусом), не считая моего расписания обучения в колледже, экзаменов, сроков и, конечно же, неудачных испытаний. Три месяца были для принятия решения об идее, которая объединит оба опыта, изучит детали реализации, изучит концепции и инструменты, которые затем будут реализованы (включая прокрастинацию 🙄)

Шаг 1. Идея 💡

Идея заключалась в том, чтобы ограничить формат данных, с которыми я хотел бы работать с моими моделями машинного обучения. Я выбрал изображения, потому что меня всегда интересовали компьютерное зрение и распознавание объектов.

Меня вдохновило приложение для помощи людям с нарушениями зрения под названием Be My Eyes. Мне понравилась эта идея, но я думал о работе над функциями доступности для мобильных устройств, которые позволят слабовидящим людям быть максимально самостоятельными без необходимости общаться с добровольцами, чтобы читать ему / ей то, что перед ними.

Именно тогда я решил включить в свое приложение три функции:

1. Функция распознавания текста для извлечения текста из изображения, снятого камерой телефона, и озвучивания его для человека в режиме реального времени.

2- Я был потрясен тем фактом, что на некоторых банкнотах еще нет шрифта Брайля, чтобы их можно было различить. доступные варианты, когда автономное устройство, которое сканирует банкноту и произносит ее, или они просто сложили их по-другому.

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

3- Дополнительная функция, похожая на банкноты, но для обнаружения объектов это не было так важно, но я все равно хотел попробовать.

Примечание. Он по-прежнему выглядит некрасиво! Я знаю. Требуется дополнительная работа над пользовательским интерфейсом.

Шаг 2: Исследование 🧐

В тот момент я понял, что мое приложение - это умная задница, которая теперь должна сама решать, какие действия предпринять, и говорить. И что может быть лучше здесь, чем мощная нейронная сеть? … Нейронные… нейроны? … Как можно ближе к мозгу!

Я начал искать лучший способ эффективной классификации изображений. Под эффективностью я подразумеваю максимальную точность, которую я могу получить с наименьшими затратами времени и ресурсов (у меня был только Lenovo Z510i с 4 ГБ оперативной памяти Nvidia). Тогда, конечно, я наткнулся на сверточные нейронные сети. они предназначены для обработки огромных объемов данных и классификации изображений по категориям, принимая решения по нескольким уровням, пока они не сведут его к нескольким категориям с процентами, в которые может попасть ваше изображение. И они также специально разработаны для обработки огромного количества обучающих данных. Подходит к изображениям ... МНОГО!

Легкое проникновение в интуицию нейронных сетей стало возможным благодаря этим удивительным двум ресурсам.

  1. Нейронные сети и глубокое обучение, книга Майкла Нильсена:

Это фантастическая книга, она интуитивно понятна, проста и посвящена математике и линейной алгебре, лежащим в основе нейронных сетей.



2. Плейлист 3Blue1Brown:

этот плейлист был прекрасным визуальным объяснением.

он предлагает как концепции, так и математику, и вы всегда можете копнуть глубже или продолжить более подробный курс.

Для специальных курсов я полагался на эти два:



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



Курс очень дружелюбен к новичкам и информативен, особенно когда речь идет об интуиции, моей любимой и самой важной части при изучении чего-то нового.

После изучения концепций наступает следующий шаг

Инструменты выбора ваших сверхспособностей 🐱‍💻

Существует множество фреймворков для обучения нейронных сетей. Назову четыре самых популярных, которые я обнаружил в ходе исследования:

  1. Tensorflow
  2. PyTorch
  3. Керас
  4. Кафе

Эти два видео Сираджа Равала («Следуйте за ним, рекомендуется!») Указывают на основные различия между каждой из четырех платформ:

Я выбрал Tensorflow, потому что он позволил мне экспортировать мою модель в облегченной форме, совместимой с мобильными устройствами TFLite. Подробнее о TFLite можно узнать здесь: Ссылка

После выбора фреймворка начинается его настройка на вашей рабочей станции.

Я использовал и Windows 10, и Ubuntu 16.04 (я переключался между ними, если что-то не поддерживалось)

Шаг 3: Инструменты + Настройка рабочей станции 🔧

  1. ОС: Windows 10 + Ubuntu 16.04 LTS (как уже упоминалось)
  2. (Если у вас уже есть Macbook, пропустите это!) VMWare Workstation Pro 14.0.0 (для запуска версии MacOS для разработки приложений iOS) Почему я выбрал разработку для iOS, не имея системы MacOS? потому что я просто хотел попробовать! и это сработало!
  3. Менеджер пакетов Anaconda (Python 3.5)
  4. Tensorflow GPU 1.7 (вы можете использовать Tensorflow без поддержки графического процессора, если у вас нет карты NVIDIA gfx, и она все равно будет работать)
  5. cuDNN 7 (библиотека) и CUDA 9.0 (платформа) предоставлены NVIDIA для повышения производительности вышеупомянутых фреймворков за счет использования вычислений с ускорением на графическом процессоре на видеокарте NVIDIA.
  6. (Если у вас уже есть Macbook, пропустите это!) Образ MacOS High Sierra 10.13.1
  7. Xcode 9.2 для разработки приложения iOS.

Следуйте этому руководству по установке Anaconda + Python3 в Windows 10 (это применимо и к более новым версиям) и установите tenorflow-gpu из Anaconda.

Вы можете настроить его сразу или использовать виртуальную среду, чтобы отделить его от рабочего пространства по умолчанию.

  1. Непосредственно с помощью этой команды в подсказке Anaconda pip install tensorflow-gpu
  2. Создание виртуальной машины и установка 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 lines
export 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

Теперь у вас есть все скрипты, которые вам понадобятся для обучения. Вам просто нужно

  1. выберите модель для обучения из пула предварительно обученных моделей Google.
  2. настроить некоторые параметры для запуска скрипта.

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 Здесь