Это первая часть серии: Общие сведения о сверточных нейронных сетях (CNN). В этом посте я расскажу об одном из самых простых способов использования CNN в вашем проекте машинного обучения.

Цель

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

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

Шаг 0: выбор набора данных
Как и в случае с любой проблемой машинного обучения, для эксперимента решающее значение имеет сложный огромный набор данных. Я выбрал для своего проекта набор данных Food-101. Вы можете скачать проект с их сайта по адресу: ссылка.

Шаг 1. Установка Caffe и настройка среды.

Следующие библиотеки должны быть установлены в python.

Numpy
Scilearn

Установите Caffe из ссылки. Следуйте инструкциям по приведенной выше ссылке, чтобы настроить среду Caffe. После завершения всех команд make для Caffe также установите требования для python. Здесь мы используем модель CNN GoogleNet, которая предварительно обучена на наборе данных ImageNet. Обученная модель GoogleNet уже научилась захватывать высокоуровневые функции из изображения.

Использование модели GoogleNet поможет нам избежать обучения собственной CNN. Хотя обучение нашей собственной CNN для определенного набора данных всегда будет давать лучшие результаты (мы увидим это в следующем посте). Скачайте обученную модель googlenet по этой ссылке. Поместите модель в папку models / googlenet.

Шаг 2: Предварительная обработка
Я использовал rename.py для переименования всех изображений с помощью foodname + счетчик номера изображения для наглядности. Используйте указанную ниже команду, чтобы получить все имена изображений с их относительными путями в одном текстовом файле.

find pwd/{“images diectory} -type f -exec echo {} ; > images.txt

Этот файл позже будет использоваться в качестве входных данных для caffe_feature_extractor.py.

Шаг 3: Извлечение функций
Теперь извлеките высокоуровневые функции изображения из модели Googlenet с помощью caffe_feature_extractor.py. Этот файл python принимает input.txt (адреса изображений, полученные из предыдущего step) и output.txt (пустой текстовый файл, в котором будут храниться извлеченные векторы изображений) в качестве аргументов. Измените все пути относительно ваших установок кафе.

Шаг 4: Разделение обучающих и тестовых данных
Установите в свою систему библиотеку Scikit learn python. Векторы функций изображения загружаются и разделяют их на обучающий и тестовый набор данных, в начальной части - food_image_recognition.py. Важным шагом здесь является рандомизация данных, чтобы у нас было почти равное распределение всех классов в тестовом и обучающем наборе данных. Для своего эксперимента я разделил тренировочные и тестовые данные в соотношении 90:10. Но вы можете поэкспериментировать с другими соотношениями.

Шаг 5: Оценка
Следующим шагом является настройка констант SVM. Это важный шаг для получения хорошей точности. Наконец, я оценил предсказание, сравнив его с наземными метками. Точность и F-Score можно оценить с помощью функций библиотеки Scikit. Я получил точность ~ 0,55 с константами SVM, указанными в коде. В качестве следующего логического шага я планирую обучить набор данных с помощью сверточной нейронной сети и получить результаты классификации.

Полный проект можно найти в моем репозитории на Github: Загрузить код.