Обзор:
Классификация объектов реального мира часто проводится для того, чтобы лучше понять их как часть группы. Очень распространенная классификация, которую мы делаем в нашей повседневной жизни, — это когда мы смотрим на человека и сразу же классифицируем его либо на мужчину, либо на женщину. В этом приложении рассматривается проблема классификации, но речь идет о другой проблеме классификации собаки по ее возможной породе на основе изображения.
В этой статье мы рассмотрим шаги, которые я выполнил для достижения решения и результатов. Мы также рассмотрим точность предсказания модели и способы их дальнейшего улучшения.
Постановка проблемы:
В этом разделе мы рассмотрим фактическую постановку проблемы.
Проблема классификатора породы собаки является популярной в задачах классификации. Цель здесь состоит в том, чтобы получить правильную породу собаки из изображения, предоставленного в качестве входных данных для модели машинного обучения. Чтобы сделать приложение более сложным, модель должна возвращать похожую породу, если передано изображение человека. Например, посмотрите на изображение вверху. Модель также должна отклонять изображения, на которых нет собаки.
Исследование данных:
Данные для этого проекта предоставлены Udacity в рамках их Программы Data Scientist Nano Degree. Пожалуйста, используйте следующие ссылки, чтобы получить данные. Имейте в виду, данные в обеих ссылках вместе составляют ~ 2 ГБ!
- Набор данных изображений собак: используется для обучения модели. Содержание и структура поясняются ниже.
- Набор данных о человеческих лицах: используется для обнаружения/прогнозирования.
Набор данных изображений собак содержит в общей сложности 8351 изображение. Это сортируется по каталогам Обучение(6680 изображений), Тестирование(836 изображений), Проверка(835 изображений). Каждый из этих каталогов имеет 133 подкаталога, соответствующих 133 различным породам собак. Разные породы имеют разное количество изображений. У некоторых пород есть до 8 разных изображений, а у некоторых только 4. Таким образом, данные несбалансированы. Ниже приведен образец изображения.
Набор данных изображений человека содержит всего 13233 изображения, хранящихся в 5750 папках. Все изображения имеют размер (250 X 250). Как и в наборе данных о собаках, данные несбалансированы: у некоторых людей есть только одно изображение, а у некоторых - несколько изображений. Пример изображения человека,
В рамках предварительной обработки данных размеры всех изображений изменяются до 240 X 240.Затем ко всем наборам данных (обучающим, тестовым) применяется нормализация , Проверка).
Теперь самая важная часть предварительной обработки изображений, аугментация изображения, выполняется на обучающих данных. Изображения произвольно поворачиваются и применяется горизонтальное отражение. Увеличение изображения необходимо для предотвращения переобучения модели. Наконец, изображения преобразуются в тензоры и передаются в модель.
Показатели:
Все данные разбиты на обучающие, тестовые и проверочные наборы данных. Модель оценивается с помощью стандартного теста точности для тестового набора данных.
accuracy = correct_predictions/total_number_of_inputs
Для классификатора собак точность является достаточным показателем, так как все породы имеют почти одинаковое количество изображений.
Модель, созданная с нуля, должна иметь точность не менее 10%. После завершения обучения модели и построения графика потерь был получен следующий график.
Ожидалось, что модель, созданная с использованием трансфертного обучения, будет иметь точность не менее 60%. Полученная точность составила 72% с потерями при обучении и тестировании ниже.
Реализация:
В этом разделе кратко объясняется процесс реализации:
- Как и все проекты по науке о данных и машинному обучению, этот проект также начинается с предварительной обработки данных.
- Данные разделены на наборы данных Train, Test и Validate. Приведенный ниже код выполняет эту задачу.
train_data = datasets.ImageFolder(train_dir, transform=data_transforms['train']) valid_data = datasets.ImageFolder(valid_dir, transform=data_transforms['valid']) test_data = datasets.ImageFolder(test_dir, transform=data_transforms['test']) training_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, num_workers=num_workers, shuffle=True) validation_loader = torch.utils.data.DataLoader(valid_data, batch_size=batch_size, num_workers=num_workers, shuffle=False) testing_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, num_workers=num_workers, shuffle=False)
- Затем идет основной процесс — увеличение изображения. Это делается для получения вариаций изображений. Это помогает предсказать случаи, когда собаки на изображениях находятся под разными углами к кадру. Короче говоря, чтобы предотвратить переоснащение
Увеличение изображения выполняется в приведенном ниже фрагменте кода.
'train': transforms.Compose([transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]), 'valid': transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]), 'test': transforms.Compose([transforms.Resize(size=(224,224)), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])
- Обнаружение человеческих лиц с помощью реализации классификаторов OpenCV.
- Модель VGG16 используется для создания детектора собак.
Ниже приведен фрагмент кода для модели VGG16.
import torch import torchvision.models as models # define VGG16 model VGG16 = models.vgg16(pretrained=True)
- Модель CNN создается с нуля. Это включает в себя обучение, тестирование и проверку модели. Здесь есть 3 сверточных слоя, каждый из которых имеет размер ядра 3 угловых шага, равный 1.
- Ниже представлена архитектура модели, созданной с нуля.
---------------------------------------------------------------- Layer (type) Output Shape Param # ================================================================ Conv2d-1 [-1, 32, 112, 112] 896 MaxPool2d-2 [-1, 32, 56, 56] 0 Conv2d-3 [-1, 64, 28, 28] 18,496 MaxPool2d-4 [-1, 64, 14, 14] 0 Conv2d-5 [-1, 128, 14, 14] 73,856 MaxPool2d-6 [-1, 128, 7, 7] 0 Dropout-7 [-1, 6272] 0 Linear-8 [-1, 500] 3,136,500 Dropout-9 [-1, 500] 0 Linear-10 [-1, 133] 66,633 ================================================================ Total params: 3,296,381 Trainable params: 3,296,381 Non-trainable params: 0 ---------------------------------------------------------------- Input size (MB): 0.57 Forward/backward pass size (MB): 4.60 Params size (MB): 12.57 Estimated Total Size (MB): 17.75 ----------------------------------------------------------------
- Модель CNN с архитектурой Resnet101 используется для создания модели с использованием процесса передачи обучения.
Это модельная архитектура для модели трансферного обучения:
--------------------------------------------------------------- Layer (type) Output Shape Param # ================================================================ Conv2d-1 [-1, 64, 112, 112] 9,408 BatchNorm2d-2 [-1, 64, 112, 112] 128 ReLU-3 [-1, 64, 112, 112] 0 MaxPool2d-4 [-1, 64, 56, 56] 0 Conv2d-5 [-1, 64, 56, 56] 4,096 BatchNorm2d-6 [-1, 64, 56, 56] 128 ReLU-7 [-1, 64, 56, 56] 0 Conv2d-8 [-1, 64, 56, 56] 36,864 BatchNorm2d-9 [-1, 64, 56, 56] 128 ReLU-10 [-1, 64, 56, 56] 0 Conv2d-11 [-1, 256, 56, 56] 16,384 BatchNorm2d-12 [-1, 256, 56, 56] 512 Conv2d-13 [-1, 256, 56, 56] 16,384 BatchNorm2d-14 [-1, 256, 56, 56] 512 ReLU-15 [-1, 256, 56, 56] 0 Bottleneck-16 [-1, 256, 56, 56] 0 Conv2d-17 [-1, 64, 56, 56] 16,384 BatchNorm2d-18 [-1, 64, 56, 56] 128 ReLU-19 [-1, 64, 56, 56] 0 Conv2d-20 [-1, 64, 56, 56] 36,864 BatchNorm2d-21 [-1, 64, 56, 56] 128 ReLU-22 [-1, 64, 56, 56] 0 Conv2d-23 [-1, 256, 56, 56] 16,384 BatchNorm2d-24 [-1, 256, 56, 56] 512 ReLU-25 [-1, 256, 56, 56] 0 Bottleneck-26 [-1, 256, 56, 56] 0 Conv2d-27 [-1, 64, 56, 56] 16,384 BatchNorm2d-28 [-1, 64, 56, 56] 128 ReLU-29 [-1, 64, 56, 56] 0 Conv2d-30 [-1, 64, 56, 56] 36,864 BatchNorm2d-31 [-1, 64, 56, 56] 128 ReLU-32 [-1, 64, 56, 56] 0 Conv2d-33 [-1, 256, 56, 56] 16,384 BatchNorm2d-34 [-1, 256, 56, 56] 512 ReLU-35 [-1, 256, 56, 56] 0 Bottleneck-36 [-1, 256, 56, 56] 0 Conv2d-37 [-1, 128, 56, 56] 32,768 BatchNorm2d-38 [-1, 128, 56, 56] 256 ReLU-39 [-1, 128, 56, 56] 0 Conv2d-40 [-1, 128, 28, 28] 147,456 BatchNorm2d-41 [-1, 128, 28, 28] 256 ReLU-42 [-1, 128, 28, 28] 0 Conv2d-43 [-1, 512, 28, 28] 65,536 BatchNorm2d-44 [-1, 512, 28, 28] 1,024 Conv2d-45 [-1, 512, 28, 28] 131,072 BatchNorm2d-46 [-1, 512, 28, 28] 1,024 ReLU-47 [-1, 512, 28, 28] 0 Bottleneck-48 [-1, 512, 28, 28] 0 Conv2d-49 [-1, 128, 28, 28] 65,536 BatchNorm2d-50 [-1, 128, 28, 28] 256 ReLU-51 [-1, 128, 28, 28] 0 Conv2d-52 [-1, 128, 28, 28] 147,456 BatchNorm2d-53 [-1, 128, 28, 28] 256 ReLU-54 [-1, 128, 28, 28] 0 Conv2d-55 [-1, 512, 28, 28] 65,536 BatchNorm2d-56 [-1, 512, 28, 28] 1,024 ReLU-57 [-1, 512, 28, 28] 0 Bottleneck-58 [-1, 512, 28, 28] 0 Conv2d-59 [-1, 128, 28, 28] 65,536 BatchNorm2d-60 [-1, 128, 28, 28] 256 ReLU-61 [-1, 128, 28, 28] 0 Conv2d-62 [-1, 128, 28, 28] 147,456 BatchNorm2d-63 [-1, 128, 28, 28] 256 ReLU-64 [-1, 128, 28, 28] 0 Conv2d-65 [-1, 512, 28, 28] 65,536 BatchNorm2d-66 [-1, 512, 28, 28] 1,024 ReLU-67 [-1, 512, 28, 28] 0 Bottleneck-68 [-1, 512, 28, 28] 0 Conv2d-69 [-1, 128, 28, 28] 65,536 BatchNorm2d-70 [-1, 128, 28, 28] 256 ReLU-71 [-1, 128, 28, 28] 0 Conv2d-72 [-1, 128, 28, 28] 147,456 BatchNorm2d-73 [-1, 128, 28, 28] 256 ReLU-74 [-1, 128, 28, 28] 0 Conv2d-75 [-1, 512, 28, 28] 65,536 BatchNorm2d-76 [-1, 512, 28, 28] 1,024 ReLU-77 [-1, 512, 28, 28] 0 Bottleneck-78 [-1, 512, 28, 28] 0 Conv2d-79 [-1, 256, 28, 28] 131,072 BatchNorm2d-80 [-1, 256, 28, 28] 512 ReLU-81 [-1, 256, 28, 28] 0 Conv2d-82 [-1, 256, 14, 14] 589,824 BatchNorm2d-83 [-1, 256, 14, 14] 512 ReLU-84 [-1, 256, 14, 14] 0 Conv2d-85 [-1, 1024, 14, 14] 262,144 BatchNorm2d-86 [-1, 1024, 14, 14] 2,048 Conv2d-87 [-1, 1024, 14, 14] 524,288 BatchNorm2d-88 [-1, 1024, 14, 14] 2,048 ReLU-89 [-1, 1024, 14, 14] 0 Bottleneck-90 [-1, 1024, 14, 14] 0 Conv2d-91 [-1, 256, 14, 14] 262,144 BatchNorm2d-92 [-1, 256, 14, 14] 512 ReLU-93 [-1, 256, 14, 14] 0 Conv2d-94 [-1, 256, 14, 14] 589,824 BatchNorm2d-95 [-1, 256, 14, 14] 512 ReLU-96 [-1, 256, 14, 14] 0 Conv2d-97 [-1, 1024, 14, 14] 262,144 BatchNorm2d-98 [-1, 1024, 14, 14] 2,048 ReLU-99 [-1, 1024, 14, 14] 0 Bottleneck-100 [-1, 1024, 14, 14] 0 Conv2d-101 [-1, 256, 14, 14] 262,144 BatchNorm2d-102 [-1, 256, 14, 14] 512 ReLU-103 [-1, 256, 14, 14] 0 Conv2d-104 [-1, 256, 14, 14] 589,824 BatchNorm2d-105 [-1, 256, 14, 14] 512 ReLU-106 [-1, 256, 14, 14] 0 Conv2d-107 [-1, 1024, 14, 14] 262,144 BatchNorm2d-108 [-1, 1024, 14, 14] 2,048 ReLU-109 [-1, 1024, 14, 14] 0 Bottleneck-110 [-1, 1024, 14, 14] 0 Conv2d-111 [-1, 256, 14, 14] 262,144 BatchNorm2d-112 [-1, 256, 14, 14] 512 ReLU-113 [-1, 256, 14, 14] 0 Conv2d-114 [-1, 256, 14, 14] 589,824 BatchNorm2d-115 [-1, 256, 14, 14] 512 ReLU-116 [-1, 256, 14, 14] 0 Conv2d-117 [-1, 1024, 14, 14] 262,144 BatchNorm2d-118 [-1, 1024, 14, 14] 2,048 ReLU-119 [-1, 1024, 14, 14] 0 Bottleneck-120 [-1, 1024, 14, 14] 0 Conv2d-121 [-1, 256, 14, 14] 262,144 BatchNorm2d-122 [-1, 256, 14, 14] 512 ReLU-123 [-1, 256, 14, 14] 0 Conv2d-124 [-1, 256, 14, 14] 589,824 BatchNorm2d-125 [-1, 256, 14, 14] 512 ReLU-126 [-1, 256, 14, 14] 0 Conv2d-127 [-1, 1024, 14, 14] 262,144 BatchNorm2d-128 [-1, 1024, 14, 14] 2,048 ReLU-129 [-1, 1024, 14, 14] 0 Bottleneck-130 [-1, 1024, 14, 14] 0 Conv2d-131 [-1, 256, 14, 14] 262,144 BatchNorm2d-132 [-1, 256, 14, 14] 512 ReLU-133 [-1, 256, 14, 14] 0 Conv2d-134 [-1, 256, 14, 14] 589,824 BatchNorm2d-135 [-1, 256, 14, 14] 512 ReLU-136 [-1, 256, 14, 14] 0 Conv2d-137 [-1, 1024, 14, 14] 262,144 BatchNorm2d-138 [-1, 1024, 14, 14] 2,048 ReLU-139 [-1, 1024, 14, 14] 0 Bottleneck-140 [-1, 1024, 14, 14] 0 Conv2d-141 [-1, 512, 14, 14] 524,288 BatchNorm2d-142 [-1, 512, 14, 14] 1,024 ReLU-143 [-1, 512, 14, 14] 0 Conv2d-144 [-1, 512, 7, 7] 2,359,296 BatchNorm2d-145 [-1, 512, 7, 7] 1,024 ReLU-146 [-1, 512, 7, 7] 0 Conv2d-147 [-1, 2048, 7, 7] 1,048,576 BatchNorm2d-148 [-1, 2048, 7, 7] 4,096 Conv2d-149 [-1, 2048, 7, 7] 2,097,152 BatchNorm2d-150 [-1, 2048, 7, 7] 4,096 ReLU-151 [-1, 2048, 7, 7] 0 Bottleneck-152 [-1, 2048, 7, 7] 0 Conv2d-153 [-1, 512, 7, 7] 1,048,576 BatchNorm2d-154 [-1, 512, 7, 7] 1,024 ReLU-155 [-1, 512, 7, 7] 0 Conv2d-156 [-1, 512, 7, 7] 2,359,296 BatchNorm2d-157 [-1, 512, 7, 7] 1,024 ReLU-158 [-1, 512, 7, 7] 0 Conv2d-159 [-1, 2048, 7, 7] 1,048,576 BatchNorm2d-160 [-1, 2048, 7, 7] 4,096 ReLU-161 [-1, 2048, 7, 7] 0 Bottleneck-162 [-1, 2048, 7, 7] 0 Conv2d-163 [-1, 512, 7, 7] 1,048,576 BatchNorm2d-164 [-1, 512, 7, 7] 1,024 ReLU-165 [-1, 512, 7, 7] 0 Conv2d-166 [-1, 512, 7, 7] 2,359,296 BatchNorm2d-167 [-1, 512, 7, 7] 1,024 ReLU-168 [-1, 512, 7, 7] 0 Conv2d-169 [-1, 2048, 7, 7] 1,048,576 BatchNorm2d-170 [-1, 2048, 7, 7] 4,096 ReLU-171 [-1, 2048, 7, 7] 0 Bottleneck-172 [-1, 2048, 7, 7] 0 AvgPool2d-173 [-1, 2048, 1, 1] 0 Linear-174 [-1, 133] 272,517 ================================================================ Total params: 23,780,549 Trainable params: 272,517 Non-trainable params: 23,508,032 ---------------------------------------------------------------- Input size (MB): 0.57 Forward/backward pass size (MB): 286.55 Params size (MB): 90.72 Estimated Total Size (MB): 377.84 ----------------------------------------------------------------
- Наконец, написан основной код этого приложения. Здесь детектор собаки и детектор человека объединены, и обрабатываются следующие случаи.
- Если собака обнаружена, то выведите породу.
- Если человек обнаружен, выведите породу, на которую похож человек, вместе с сообщением об обнаружении человека.
- Если ни то, ни другое, то выведите соответствующее сообщение, указывающее на то же самое.
Оценка и проверка модели:
Для создания моделей используются Сверточные нейронные сети (CNN). Изначально модель создается с нуля. Цель этой модели — обеспечить точность не менее 10 %. Причина установки этой цели состоит в том, чтобы убедиться, что модель работает лучше, чем просто случайное предположение (точность 1%).
Теперь создается новая модель CNN с использованием переносного обучения с целью обеспечения точности более 60%. Модель обучена на 20 эпох. Модель в приложении превосходит ожидания с точностью72%. Он правильно предсказал 619 из 836 изображений.
Точность теста: 72% (610/836)
Вывод:
На изображении ниже показан вывод моего приложения.
Обзор:
Модель, созданная с использованием трансфертного обучения, значительно лучше (точность 74%) по сравнению с моделью, созданной с нуля (точность 10%). Таким образом, мы поступили лучше, выбрав трансферное обучение. Это открывает большие возможности для трансферного обучения для решения подобных задач.
Улучшение:
Следующие шаги могут привести к созданию лучшей модели с большим повышением точности.
- Мы можем использовать архитектуры, отличные от ResNet101, что может привести к повышению производительности.
- Увеличение изображения можно увеличить, чтобы предотвратить дальнейшее переобучение и повысить точность.
- Чем больше изображений каждой породы собак, тем точнее прогноз.
Ссылка на проект:
Если вы зашли так далеко, я рад поделиться кодом моего проекта. Ниже приведена ссылка на github для каталога моего проекта. Инструкции по использованию проекта приведены в файле Readme.md в корневом каталоге.
Ссылка: https://github.com/KIRANVASISHTA/Dog-Breed-Classifier
Ссылки:
В дополнение к вышеупомянутым ссылкам, следующие ссылки очень помогли мне в завершении этого проекта.
1. Классификатор породы собак Udacity https://github.com/udacity/deep-learning-v2-pytorch/tree/master/project-dog-classification
2. Resnet101 от Kaggle: https://www.kaggle.com/pytorch/resnet101
3. Учебники Pytorch: https://pytorch.org/
4. При необходимости в файле проекта jupyter приводятся дополнительные ссылки.
В дополнение к этому я хотел бы поблагодарить Udacity за предоставленную мне возможность изучить и завершить этот проект.