Рубрики
Без рубрики

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

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

Несколько месяцев назад я читаю бумагу с названием «Глубокие нейронные сети более точны, чем люди при обнаружении сексуальной ориентации от изображений лица» , что вызвало много противоречие . Хотя я не хочу комментировать методологию и качество бумаги (которая уже была сделана, например, в Статья Джереми Говарда ), я нашел это очень интересно и вдохновляющим. В двух словах исследователи собрали лицевые фотографии из веб-сайтов знакомств и построили модель машинного обучения для классификации сексуальной ориентации людей и достигли довольно впечатляющей точности с их подходом.

Этот гостевой пост суммирует результаты как:

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

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

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

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

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

Мой первый (и окончательный) подход был на (1.) Соберите лицевые изображения студентов или другие академики, (2.) Накладка их с небольшим, ограниченным набором классов, соответствующих их основным, и в конце концов (3.) Установите сверточную нервную сеть (CNN) как классификатор. Я думал о областях исследования, чьи студенты могут потенциально выглядеть немного стереотипно и придумали четыре класса:

  1. компьютерная наука (~ CS)
  2. Экономика (~ Econ)
  3. (Немецкая) Лингвистика (~ Немецкий)
  4. машиностроение (~ механическое)

Обратите внимание, что это не должно оскорбиться любыми средствами! (Я сам компьютерная наука Nerd 😉).

Самое первое предварительное условие – это обучение данных – как обычно, при проведении машинного обучения. И поскольку я стремился к обучению сверточной нейронной сети (CNN), предпочтительно, предпочтительно.

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

Я написал кучу Сценарии гусениц Использование Python и Селен Webdriver ползать 57 Различные сайты, в том числе веб-сайты различных ведомств следующих университетов:

  • Институт технологий Karlsruhe
  • Тунхна
  • Университет Мюнхен
  • Университет Вюрцбурга
  • Университет Зиген
  • Университет Байройт
  • Университет Фрайбурга
  • Университет Гейдельберга
  • Университет Эрлангена
  • Университет Бамберга
  • Университет Маннхейма

После небольшого количества ручной очистки данных (удаление изображений без лиц, вращающихся изображений, …), я оказался в общей сложности 1369 помечены изображения из четырех разных классов. Хотя это не очень много данных для обучения CNN, я решил в любом случае попробовать.

Примеры

Картинки

Выдержка из папки, содержащей все сырые изображения после ползания: (Если вы находитесь на одном из этих фотографий и хотите удалить, пожалуйста, свяжитесь со мной.)

Ярлыки

Отрывок из index.csv. содержащие этикетки и метаданные для каждого изображения:

id,category,image_url,name
c35464fd,mechanical,http://www.fast.kit.edu/lff/1011_1105.php,Prof. Dr. rer. nat. Frank Gauterin
a73d11a7,cs,http://h2t.anthropomatik.kit.edu/21_1784.php,Kevin Liang
97e230ff,econ,http://marketing.iism.kit.edu/21_371.php,Dr. Hanna Schumacher
cde71a5c,german,https://www.germanistik.uni-muenchen.de/personal/ndl/mitarbeiter/bach/index.html,Dr. Oliver Bach

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

  1. Обрезки Изображения для лица – как вы можете видеть, изображения взяты из разных углов, некоторые из них содержат много фона, некоторые не сосредоточены и т. Д. Чтобы получить лучшие учебные данные, фотографии должны быть обрезаны только на лицо и ничего другого.
  2. Масштабирование – Все фотографии входят в разные резолюции, но в конечном итоге должны быть точно такого же размера, чтобы его использоваться в качестве ввода в нейронную сеть.

Для достижения обоих этих предварительно обработанных шагов я использовал отличный, мало, открытый источник, на основе Python на основе Python на основе OpenCV Autocrop Со следующей командой:

AutoROP -I RAW -O Preprocessed -W 128 -H 128> Autocrop.log Отказ

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

Кроме того, я написал сценарий, который разбирается Autocrop.log Чтобы получить неудачные изображения и впоследствии разделить изображения в Поезд (70%), Тест (20%) и Проверка (10 %) и скопируйте их в структуру папки, которая совместима с форматом, требуемым Keras Imagedatagenerator читать учебные данные.

- raw
    - index.csv
    - c35464fd.jpg
    - a73d11a7.jpg
    - ...
- preprocessed 
    - train
        - cs
            - a73d11a7.jpg
            - ...
        - econ
            - 97e230ff.jpg
            - ...
        - german
            - cde71a5c.jpg
            - ...
        - mechanical
            - c35464fd.jpg
            - ...
    - test
        - cs
            - ...
        - ...
    - validation
        - cs
            - ...
        - ...

Подход 1: Простой, пользовательский CNN

Код

Я решил начать простым и посмотреть, может ли что-то можно узнать из данных вообще. Я определил следующую простую CNN архитектуру в Кере:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 62, 62, 32)        320       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 31, 31, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 29, 29, 32)        9248      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 12, 12, 32)        9248      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 6, 6, 32)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 1152)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                73792     
_________________________________________________________________
dropout_1 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 4)                 260       
=================================================================
Total params: 92,868
Trainable params: 92,868
Non-trainable params: 0

Я использовал Keras ‘ Imagedatagenerator (Отличный инструмент!) Для чтения изображений в Numpy массивы, переосмыслите их в форму (64, 63, 3) (64 x 64 пикселей, RGB) и выполняют некоторые данные, использующие трансформации, такие как вращения, масштабирование, горизонтальные листовки и т. Д. Для взорвании моих учебных данных и, надеюсь, построить более надежные, менее переопределенные модели.

Я позволил модели поезда для 100 эпохи , используя Оптимизатор ADAM С параметрами по умолчанию и Категориальные перекрестные потери , мини-пакетный размер 32 и 3 раза увеличения (Используйте преобразования, чтобы взорвать данные тренировки в течение трех раз).

Результаты (точность 57,1%)

Максимум Точность валидации 0,66 Был достигнут после 74 эпохи. Точность проверки оказался 0,571 Отказ Учитывая, что довольно простая модель была полностью обучена с нуля с менее чем 1000 экземпляров, я очень впечатлен этим результатом. Это означает, что в среднем модель предсказывает больше, чем правильно, чем основной студент каждого второго студента. вероятность априории правильной классификации 0,25 Таким образом, модель определенно узнала хотя бы что-то.

Подход 2: тонкая настройка VGGFace

Код

В качестве альтернативы простой, индивидуальной конкретной модели CNN, которая обучается с нуля, я хотел следовать общим подходу тонкой настройки веса существующей, предварительно обученной модели. Основная идея такого подхода – не «заново изобретать колесо», но воспользуйтесь тем, что уже было изучено до и лишь слегка адаптировать это «знание» (в форме весов) к определенной проблеме. Латентные функции в изображениях, которые алгоритм обучения уже извлекли из гигантского набора данных тренировочных данных, которые могут быть просто использованы. «Классификация изображений с использованием предварительно обученных моделей в KERAS» дает отличный обзор того, как Fine-Tuning работает и как это отличается от Передача обучения и пользовательские модели. Ожидания заключаются в том, что моя заданная задача классификации может быть решена более точно с меньшими данными.

Я решил взять VGG16 Модель архитектуры обучена на Vggface в качестве основы (используя реализацию Keras-VGGFace ) и следование Это руководство чтобы точно настроить это. VGGFace – это набор данных, опубликованный Университетом Оксфорда, который содержит более 3,3 миллиона изображений лица. Соответственно, я ожидал, что это добывает очень прочные особенности лица и вполне хорошо подходящим для классификации лица.

Шаг 1: Обучение передаче для инициализации весов

Моя реализация состоит из двух шагов, так как Рекомендуется тот

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

На этом первом этапе обучение трансферта используется для поиска правильных весов для набора нескольких недавно добавленных пользовательских, полностью подключенных слоев классификации. Они используются в качестве начальных весов на шаге 2 позже. Чтобы выполнить эту инициализацию, предварительно обученная модель VGGFace, с окончательной классификацией слоев отрезанным, используется для извлечения 128 Особенности узкого места для каждого изображения. Впоследствии другая крошечная модель, состоящая из полностью связанных слоев, обучается на этих функциях для выполнения возможной классификации. Вес сохраняются в файл и снова загружены на шаге 2.

Модель архитектуры выглядит так:

________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 128)               65664     
_________________________________________________________________
dropout_1 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 4)                 516       
=================================================================
Total params: 66,180
Trainable params: 66,180
Non-trainable params: 0

Шаг 2: Точная настройка

На этом втором шаге предварительно обученная модель VGGFace (с помощью первых слоев N – 3 замерзала) используется в сочетании с предварительно обученными верхними слоями от шага 1 до точной настройки веса для нашей конкретной задачи классификации. Требуется мини-партии (128, 128, 3) напряженные тензоры (128 х 128 пикселей, RGB) в качестве ввода и прогнозирования вероятностей для каждого из наших четырех целевых классов.

Архитектура комбинированной модели выглядит так:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
vggface_vgg16 (Model)        (None, 512)               14714688  
_________________________________________________________________
top (Sequential)             (None, 4)                 66180     
=================================================================
Total params: 14,780,868
Trainable params: 2,425,988
Non-trainable params: 12,354,880

верх Модель описана на шаге 1, vggface_vgg16 это модель VGG16 и выглядит так:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 128, 128, 3)       0         
_________________________________________________________________
conv1_1 (Conv2D)             (None, 128, 128, 64)      1792      
_________________________________________________________________
conv1_2 (Conv2D)             (None, 128, 128, 64)      36928     
_________________________________________________________________
pool1 (MaxPooling2D)         (None, 64, 64, 64)        0         
_________________________________________________________________
conv2_1 (Conv2D)             (None, 64, 64, 128)       73856     
_________________________________________________________________
conv2_2 (Conv2D)             (None, 64, 64, 128)       147584    
_________________________________________________________________
pool2 (MaxPooling2D)         (None, 32, 32, 128)       0         
_________________________________________________________________
conv3_1 (Conv2D)             (None, 32, 32, 256)       295168    
_________________________________________________________________
conv3_2 (Conv2D)             (None, 32, 32, 256)       590080    
_________________________________________________________________
conv3_3 (Conv2D)             (None, 32, 32, 256)       590080    
_________________________________________________________________
pool3 (MaxPooling2D)         (None, 16, 16, 256)       0         
_________________________________________________________________
conv4_1 (Conv2D)             (None, 16, 16, 512)       1180160   
_________________________________________________________________
conv4_2 (Conv2D)             (None, 16, 16, 512)       2359808   
_________________________________________________________________
conv4_3 (Conv2D)             (None, 16, 16, 512)       2359808   
_________________________________________________________________
pool4 (MaxPooling2D)         (None, 8, 8, 512)         0         
_________________________________________________________________
conv5_1 (Conv2D)             (None, 8, 8, 512)         2359808   
_________________________________________________________________
conv5_2 (Conv2D)             (None, 8, 8, 512)         2359808   
_________________________________________________________________
conv5_3 (Conv2D)             (None, 8, 8, 512)         2359808   
_________________________________________________________________
pool5 (MaxPooling2D)         (None, 4, 4, 512)         0         
_________________________________________________________________
global_max_pooling2d_3 (Glob (None, 512)               0         
=================================================================
Total params: 14,714,688
Trainable params: 2,359,808
Non-trainable params: 12,354,880

Я использовал Keras Imagedatagenerator Опять же для загрузки данных, дополняя (3x) и изменение размера. Как Рекомендуется , Стохастический градиентный спуск используется с небольшим уровнем обучения (10 ^ -4), чтобы осторожно адаптировать вес. Модель была обучена для 100 эпохи на Партии 32 изображений И, опять же, использовал категорический крест энтропии как функция потери.

Результаты (54,6% точности)

Максимум Точность валидации 0,64 Был достигнут после уже 38 эпох. Точность проверки оказался 0,546 , который является довольно разочаровывающим результатом, учитывая, что даже наша простая, пользовательская модель CNN достигла более высокой точности. Может быть, сложность модели слишком высока для небольшого количества данных тренировок?

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

Код

Распределение класса

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

0.2510 0.2808 0.2127 настоящий 0.2553
0.2595 0.2936 0.1361 предлагать 0.3106

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

Примеры ложных классификаций

Я хотел получить представление о том, что модель делает неправильно и что она делает правильно. Следовательно, я посмотрел на вершину (относительно доверия) пять (1) Ложные негативы , (2) ложные срабатывания и (3) Настоящие позитивы Отказ

Вот выдержка для класса ЭКОН :

Верхний ряд показывает примеры экономистов, которые модель не признала как таковой. Центральная строка изображает примеры того, как выглядит модель «думает», но они на самом деле являются студентами/исследователями с другим основным. Наконец, нижний ряд показывает примеры хороших совпадений, то есть люди, для которых модель имела очень высокую уверенность в их реальном классе.

Опять же, если вы находитесь на одном из этих фотографий и хотите удалить, пожалуйста, свяжитесь со мной.

Путаница матрицы

Чтобы увидеть, в какой профессии модель не уверена, я рассчитал матрицу путаницы.

array([[12.76595745,  5.95744681,  0.        ,  6.38297872],
       [ 3.40425532, 12.76595745,  3.82978723,  8.08510638],
       [ 3.82978723,  5.53191489,  8.5106383 ,  3.40425532],
       [ 5.95744681,  5.10638298,  1.27659574, 13.19148936]])

Легенда:

  • 0,,,
  • Яркие цвета ~ более высокое значение

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

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

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

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

  • Больше обучения данных из более широкого диапазона источников
  • Более тщательное предварительная обработка (например, отфильтровать изображения секретарей)
  • Различная модель архитектуры
  • Гиперпараметрическая настройка
  • Ручная функция инженерии

Пожалуйста, дайте мне знать, что вы думаете об этом проекте. Я хотел бы получить некоторые отзывы!

Первоначально опубликовано в Muetsch.io Отказ

Оригинал: “https://dev.to/n1try/detecting-academics-major-from-facial-images-280i”