Нигерия — это благословленная Богом страна с тремя основными этническими группами (йоруба, хауса и ибо), и эти разные этнические группы имеют свои культурные различия в одежде, браке, еде и т. д.

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

Распознавание различных тканей по названию является проблемой даже для некоторых взрослых нигерийцев из-за их объема. Теперь вы можете представить, как это будет для молодого поколения, туристов и иностранцев (это должно быть очень громоздко 😢)

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

Затем я решил создать алгоритм машинного обучения, способный давать названия некоторым традиционным тканям йоруба,которые являютсяАнкара, Асо окэ, Atiku,и кружевныеткани с использованием их изображений. Я встроил модель в приложение для Android, чтобы туристы,иностранцы и нигерийцы могли использовать это приложение для фотографирования традиционных тканей, получения названий тканей, а также получить предложения о различных нарядах, которые можно сделать с ними.

Звучит круто, правда?

Конечно, это так.

Вот краткая демонстрация того, как это работает

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

Подход

Ниже приведены шаги, которые я выполнил для построения модели:

  • Сбор данных
  • Очистка и подготовка данных
  • Архитектура модели
  • Построение модели
  • Делать прогнозы

В следующем уроке я покажу вам, как легко развернуть модель в приложении Flutter для Android. Итак, давайте двигаться дальше.

Сбор данных

Когда я решил начать этот проект, я не смог найти в Интернете никаких наборов данных, содержащих различные нигерийские ткани и их этикетки. Это означало только одно,

Мне пришлось собирать набор данных самостоятельно

Я никогда не делал ничего подобного раньше. В этот момент у меня было два варианта.

  • Чтобы отказаться от проекта и выбрать более простой проект с доступным набором данных
  • Сам собрать набор данных

Я решил продолжить проект, так как мне понравилась идея, и я хотел, чтобы она работала. Я вручную собрал в Google изображения четырех классов: Акара, Асо окэ, Атику и Кружево. Я скачал по 50 образцов с каждого, но случилось несчастье — все изображения, которые я собрал, были удалены! Это произошло из-за ошибки в моем сценарии. Можете себе представить, что я должен был чувствовать, но это меня не остановило. Я исправил ошибку и набрался смелости, чтобы собрать их снова.

Мне также нужно было следить за тем, чтобы я загружал только хорошие фотографии интересующего меня текстиля. Всего я скачал около 200 изображений. Это минимальный набор данных, но это хороший способ начать. Затем я загрузил изображения на Google Диск, так как хотел использовать Google Collab для обучения модели.

Подготовка данных

Первым делом я импортировал необходимые библиотеки.

Мне нужно смонтировать данные, так как набор данных находится на моем Google Диске.

Что я сделал на этом этапе, так это поместил свои данные в подкаталоги обучения и проверки, чтобы генератор данных изображений автоматически помечал их для меня.

Я использовал отдельный скрипт Python для выполнения этой задачи. Это становится чрезвычайно полезным, когда вам нужно разделить тысячи изображений со многими классами в каталог для обучения и проверки. Доступ к скрипту можно получить здесь

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

Вот несколько примеров изображений:

Класс ImageDataGenerator доступен в Tensorflow в разделе Keras.preprocessing.image библиотеки TensorFlow.

Чтобы использовать генератор изображений, вы создадите его экземпляр. Затем вы вызываете “flow_from_directory”, чтобы получить объект генератора. Затем для набора обучающих данных вы укажете каталог обучения и укажите целевой размер.

Поскольку мы хотим классифицировать четыре класса, для параметра "class_mode" будет установлено значение "categorical".

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

Вот некоторые из тех, что я использовал:

  • Диапазон поворота: диапазон от 0 до 180 градусов, на который вы можете произвольно поворачивать изображения.
  • Width_shift_range и height_shift_range: они определяют в процентах от размера изображения, насколько мы должны переместить изображение в его кадре.
  • Shear_range: сдвигает изображение на случайную величину в заданной пропорции изображения.
  • Zoom_range: указывает относительную часть изображения, которую вы будете увеличивать.

К счастью, класс генератора данных изображения поставляется с множеством опций увеличения изображения. Вот как я его использовал:

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

Архитектура модели

Для построения модели я использовал метод переносного обучения.

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

Мы используем этот метод, когда у нас есть ограниченный объем доступных данных. Мы также можем назвать предварительно обученную модель «базовой моделью». Я использовал MobileNetV2в качестве базовой модели, поскольку она позволяет создавать и запускать нейронные сети, которые могут среды. Он был хорошо оптимизирован для работы на периферийных устройствах, таких как телефоны, микроконтроллеры, микропроцессоры и т. д., что хорошо подходит для моего варианта использования.

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

Чтобы узнать больше об архитектуре mobilenetv2, вы можете прочитать исследовательскую статью здесь

Я использовал комбинацию базовой модели и «полностью подключенных» слоев TensorFlow.

Построение модели

Чтобы построить модель, я первым делом загрузил предварительно обученную модель и ее вес с помощью Keras API.

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

Мы обнаружили, что общее количество слоев мобильной сети равно 152. Тогда я решил начать тонкую настройку со 120-го слоя.

Чтобы добиться этого, мне пришлось сделать все слои нейронной сети обучаемыми нейронной сетью, установив «layer. обучаемый» в true. Затем я замораживаю все слои перед 120-м, просматривая их и устанавливая «layer. обучаемый» в false.

При построении этой модели я использовал функциональный API Keras.

Функциональный API Keras позволяет создавать более гибкие модели, чем tf.keras.Sequential API. Функциональный API может работать с моделями с нелинейной топологией, общими слоями и даже с несколькими входами и выходами.

Сеть содержит слои base model, Maxpool, Dropout и Dense.

Выпадающий слой не позволяет функциям активации из предыдущих слоев полагаться на какую-либо функцию, поэтому ему придется распределить свой вес, тем самым помогая предотвратить переоснащение.

Затем я создал экземпляр своей модели, скомпилировал ее и показал сводку модели.

Чтобы скомпилировать вашу модель, вам нужно указать вашу функцию потерь, вашу функцию оптимизации и ваши показатели.

Функция потерь помогает нейронной сети рассчитать, насколько далеки ее прогнозы от целевого значения для каждого обучающего экземпляра. Мы воспользовались потерей «категориальной кросс-энтропии» в Keras API, потому что имеем дело с проблемой множественной классификации.

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

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

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

Затем я скомпилировал свою модель и распечатал сводку, как показано ниже.

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

Я передал генераторы поезда и проверки ранее. Я указал количество эпох равным 50.

Примечание. Эпохи — это просто один полный проход через обучающую выборку

Вот как выглядит обучение:

Давайте посмотрим, насколько точно работает наша модель, построив ее на основе истории с помощью Matplotlib.

Давайте также построим график потерь и точности обучения и проверки.

Делать прогнозы

Пришло время сделать несколько прогнозов! Для этого нам необходимо:

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

Вот функция для предсказания изображения:

Давайте протестируем модель со всеми классами продуктов питания и посмотрим, насколько хорошо она работает.

Мы видим, что модель допустила только одну ошибку из четырех. Модель не могла действительно отличить ткани Aso oke от Atiku, вероятно, потому, что они имеют похожий рисунок линий. Модель все еще можно улучшить, добавив больше классов разных изображений.

Нам нужно сохранить модель и преобразовать ее в облегченный формат TensorFlow, чтобы мы могли встроить ее в наше приложение для флаттера.

Затем я загрузил сохраненную модель и файл label.txt в свою локальную систему.

Спасибо, что остаётесь со мной так далеко! Во второй части я расскажу, как развернул модель на Android.

Пожалуйста, не стесняйтесь задавать вопросы или обращаться ко мне.