Основная проблема

В следующей статье предпринимается попытка найти решение проблемы, решаемой в этой статье, опубликованной в рамках Computer Vision Foundation.

Согласно заявлению Всемирной организации здравоохранения (ВОЗ), в мире насчитывается более 285 миллионов человек с некоторыми нарушениями зрения. И, как любой другой человек в 21 веке, они также хотят быть активными в мире социальных сетей и делиться фотографиями. Однако иногда они пропускают контент, которым они не хотят делиться. Это может быть такая информация, как цифры кредитной карты, отражение лица на экране, рецепты или результаты теста на беременность! (Рис. 1)

По сути, идея состоит в том, чтобы предложить модель ResNet50 (предложенную в статье), которая обнаруживает наличие такой информации. Однако я предпринял шаги для новичка и начал с создания модели CNN.

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

  1. Частные изображения с частным контентом заменены поддельным контентом
  2. Частные изображения заменены домашними средствами ImageNet

Для следующей модели я использую последний метод.

Архитектура

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

Как упоминалось ранее, я создал модель CNN в следующем формате:

В одной из моих предыдущих статей о Deep Learning я говорил о том, что разделение между обучающим набором и проверочным набором может быть ключевым фактором при определении того, как работает наша модель. Всего в нашем наборе данных 21636 изображений (включая как частные, так и частные изображения), разделение составляет 64–16–20; обучающий набор - проверочный набор - тестовый набор соответственно.

Для нашей модели были использованы следующие измерения и методы:

  • Набор данных: Vizwiz
  • Размер изображения: 28 x 28 (позже использовалось 64 x 64 для улучшения)
  • Тип модели: Последовательный
  • Классификаторы: [0, 1], где 0 обозначает частные изображения, а 1 - частные изображения.
  • Функция потерь: категориальная кросс-энтропия (позже использовалась двоичная)
  • Оптимизатор: использовал функцию оптимизатора Адама в обучении.
  • Метрики: точность
  • Эпох: 20
  • Размер партии: 32

Давайте попробуем Python!

Хватит говорить, давайте писать код!

Мы будем использовать Tensorflow и Keras API для запуска нашей сети CNN. Чтобы облегчить жизнь, я запускаю Jupyter на Anaconda3 Naviagtor.

Чтобы узнать, как запустить Jupyter на своей машине, посмотрите это видео. У меня загружены следующие ключевые среды:

  • керас, керас-аппликации, керас-база, керас-препроцессинг
  • libopencv
  • matplotlib
  • mkl_ftt, mkl_random
  • numpy, numpy-base
  • панды
  • соленый огурец
  • scikit-learn
  • тензорный поток / тензорборд

Примечание: я остановлюсь только на важных частях кода. Если вы хотите увидеть полную версию, посетите мой репозиторий git здесь.

Импорт данных из внешнего источника может оказаться сложной задачей. В приведенном ниже коде показано, как я прошел через две папки, называемые Non-Priv и Priv, сохраненные на моем локальном компьютере, и добавил все изображения, собранные в список. Чтобы модель не обучалась через запоминание, я также случайным образом перемешал изображения, чтобы получилось хорошее сочетание двух категорий.

Затем мы разделим общий набор данных на два раздела: данные обучения и данные тестирования в соотношении 80:20. Позже мы разделим обучающие данные на два подразделения с одинаковым соотношением, причем последнее будет набором для проверки.

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

Короче говоря, мы хотим преобразовать наши категориальные данные в единичный вектор. В качестве примера, если бы было 5 классов и наше изображение отнесено к категории 3, то наш вектор горячего кодирования был бы [0 0 1 0 0].

Точно так же мы сделаем то же самое для нашей модели, где у нас всего 2 класса, где класс 0 = Non-Priv и 1 = Priv.

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

На приведенном ниже графике показаны результаты для нашего набора данных для обучения и проверки. Наблюдая за точностью обучения и потерей при обучении, мы можем заключить, что наша модель отлично справилась с работой после 20 эпох, что привело к точности обучения 91% и потере 19%.

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

Проблемы

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

Вторая проблема, которую вы, возможно, уже заметили из Рис. 3, заключается в том, что модель переоснащается! Как описано в моей предыдущей статье, вы можете определить, переоснащается ли модель, когда увеличивается разница между ошибкой обучения и ошибкой проверки. Как видно на графике на Рис. 3, после 7-й эпохи разница определенно растет! Мало того, точность валидации практически перестала расти после 5 эпох. С этими двумя наблюдениями мы можем сделать вывод, что наша модель, к сожалению, запоминает данные!

Исправление переобучения

После консультации и обсуждения с моим наставником доктором Франсиско Эстрада, доцентом Университета Торонто в Скарборо, обладающим опытом в области искусственного интеллекта, он дал мне следующий совет, который, возможно, поможет избавиться от проблемы переобучения.

Когда я впервые начал изучать нейронные сети, я также вспомнил, что добавление Dropout Layers также является еще одним решением этой проблемы! Я так и сделал!

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

Ниже представлена ​​архитектура после упомянутых исправлений:

Результаты и улучшения

После внесения этих изменений я снова запустил модель и получил удовлетворительные результаты.

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

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

Давайте посмотрим на несколько правильно идентифицированных изображений:

Вот несколько ошибочно классифицированных изображений из нашей модели:

В конце концов, ниже представлены наши метрики, основанные на точности каждого класса и его процентном отношении от того, насколько хорошо он работал с тестовыми данными.

использованная литература

  1. "Научно-исследовательская работа"
  2. Набор данных
  3. Улучшение переобучения
  4. Выпадающий слой
  5. Датакамп
  6. Keras API
  7. Модель Кераса
  8. Бегущий Jupyter