Обзор:

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

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

Постановка проблемы:

В этом разделе мы рассмотрим фактическую постановку проблемы.

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

Исследование данных:

Данные для этого проекта предоставлены 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 за предоставленную мне возможность изучить и завершить этот проект.