В этом уроке мы углубимся в классификацию изображений, поскольку специалисты по глубокому обучению могут не знать, как именно работает модель. иногда вам нужно, чтобы ваша модель работала надежно и корректировала ее детали, что требует от вас заглянуть внутрь вашей нейронной сети.
Почему глубокое погружение?
ПРОБЛЕМА С МОДЕЛЕЙ –> СМОТРИТ ВНУТРИ СЕТИ –> ВЫЯСНИТЕ –> УСТРАНИТЕ ЭТО
НАЗНАЧЕНИЕ ЭТИХ РУКОВОДСТВ:
Мы собираемся глубоко погрузиться в
- механика глубокого обучения
- Архитектура модели компьютерного зрения
- МОДЕЛЬ НЛП
- Создайте архитектуру sutom, соответствующую вашим потребностям
- Найдите способ получить результаты
- Сделать вычисления FSTER
- Адаптивность в соответствии с набором данных
Этот учебник
этот учебник делает следующее
- Снова создайте приложение классификации изображений
- Сделайте это продвинутым
- Включить больше данных
- Слои в архитектуре
- Методы маркировки
- Регуляризация
- Оптимизация
Вышеуказанные понятия будут раскрыты шаг за шагом.
Давайте начнем
мы не собираемся обсуждать классификатор DOG-CAT, вместо этого более уместна классификация пород PET. В реальной жизни у нас есть следующий рабочий процесс
Развитие понимания набора данных – › Извлечение данных – › Визуализация
Мы увидим промежуточные шаги в этом рабочем процессе и то, как выполнять моделирование и тестирование.
Откройте свой ноутбук, введите следующее
from fastai.vision.all import * path = untar_data(URLs.PETS)
Набор данных имеет разные форматы, которые можно описать на рисунке ниже.
Давайте посмотрим на код
Приведенная выше ячейка кода в основном распаковывает файл из ссылки на домашнее животное и сохраняет путь к каталогам в переменный путь.
Если вы перечислите пути, выполнив это
path.ls()
Вывод:
(#3: означает количество каталогов) [Путь («аннотации»), Путь («изображения»), Путь («модели»)]: таким образом, три каталога аннотаций изображений и моделей содержат описание изображений, фактическое изображение в формате jpeg. формат и модели соответственно.
Локализация против классификации
Основное различие между локализацией и классификацией состоит в том, что при классификации мы узнаем, что является объектом, а не куда направлена локализация.
В нашем руководстве мы игнорируем аннотации, потому что не решаем проблему локализации.
(path/"images").ls()
Точно так же мы увидим, что находится внутри следующего вывода
, который показывает изображения в формате jpg, всего 7394 изображения.
Вывод:
(#7394) [Путь('images/great_pyrenees_173.jpg'),Путь('images/wheaten_terrier_46.jpg'),Путь('images/Ragdoll_262.jpg') ,Path('images/german_shorthaired_3.jpg'),Path('images/american_bulldog_196.jpg'),Path('images/boxer_188.jpg'),Path('images/staffordshire_bull_terrier_173.jpg'),Path('images/ basset_hound_71.jpg'),Path('images/стаффордширский_буль_терьер_37.jpg'),Path('images/yorkshire_terrier_18.jpg')...]
Возвращаемый тип в FASTai
Вернутый выше файл не имеет тип списка, а является объектом коллекции класса L, который является расширенной версией Python List. с добавленными общими операциями.
Ниже приведены функции:
- Возвращает количество объектов
- Показывает некоторые файлы не все
- Формат файлов хороший.
Давайте сделаем маркировку
Теперь мы собираемся пометить наши данные, так как мы видим, что информация о породе находится внутри имени файла, и каждое имя файла имеет определенный формат, поэтому мы можем извлечь имена.
Давайте посмотрим - ( great_pyrenees_173.jpg ). Этот формат содержит имя питомца «_» с номером. Но некоторые файлы содержат несколько символов подчеркивания, поэтому на данном этапе нам не нужно было делать какие-то предположения.
Метод извлечения меток: РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ
Регулярное выражение является проверкой строки. Вы устанавливаете определенные критерии и передаете строку, чтобы увидеть, соответствует ли она этому или нет. Критерии могут быть любыми, например, мне нужен первый и последний элемент строки, подстроки и т. д. Это очень полезно для аналитиков данных.
Напишите следующий код.
fname = (path/"images").ls() re.findall(r'(.+)_\d+.jpg$', fname.name)
Результаты:
['великие_пиренеи']
Давайте разделим это r’(.+)_\d+.jpg$’
- (.+)это означает просмотр разных символов, а знак плюс означает, что их может быть больше 1, например, «яблоко» содержит 5 символов, поэтому эти критерии.
- _\d+ означает, что за цифрой будет следовать символ подчеркивания, и этих цифр может быть более одной, которые обозначают знак плюс.
- .jpg$означает, что знак доллара содержит конец строки, перед которым будет расширение .jpg.
После тестирования маркировки: применить ко всему набору данных
Общий способ запоминания
DataBlock(blocks =(DataTypeBlock,LabelTypeBlock), get_items = how_to_get_inputs, splitter = RandomSplitter(seed =number), get_y= how_to_get_labels item_tfms = TranformationName, batch_tfms = batch_transform_type)
Наше дело
pets = DataBlock(blocks = (ImageBlock, CategoryBlock ), get_items = get_image_files, get_y = using_attr(RegexLabeller(r'(.+)_\d+.jpg$'), "name"), splitter = RandomSplitter(seed=42), item_tfms = Resize(460), batch_tfms = aug_transforms(size=224,min_scale=0.75) ) pets.dataloaders(path/"images")
Небольшая разница между преобразованием элемента и пакетным преобразованием приведена ниже
item_tfms
: одно или несколько преобразований, примененных к элементам перед их пакетной обработкой.batch_tfms
: одно или несколько преобразований, применяемых к пакетам после их формирования.aug_transforms
: означает преобразование увеличенияsize
: Размер вывода, дублируется, если указано одно значениеmin_scale
: Минимальный масштаб обрезки по отношению к области изображения.
Таким образом, увеличение данных используется для изменения размера данных перед выполнением моделирования. Это называется Presizing.
Что такое пресайзинг?
Чтобы привести все изображения к одному размеру, изменение размера выполняется перед созданием классификатора, называемого предварительным размером.
цели
Ниже приведены преимущества и цели изменения размера изображений перед моделированием.
- Все изображения должны иметь одинаковый размер, чтобы GPU был совместим с блоком данных.
- уменьшить количество отдельных вычислений увеличения
- уменьшить количество вычислений и операций
- производительность на GPU
проблемы
Изменение размера до размера увеличения вместе с увеличением данных может вызвать
- ложные пустые зоны
- снизить качество данных
например, углы изображений могут быть пустыми, если они повернуты на 45 градусов, а операции поворота и масштабирования могут потребовать дополнительных пикселей для заполнения данных.
Решения
Следующие методы обычно применяются для решения вышеупомянутых проблем
- Изменение размера выполненных изображений › целевое измерение тренировки
- Скомпоновать все распространенные операции аугментации (операция может быть масштабирование, изменение размера, поворот в одну) — выполняемые операции в GPU
- Избегайте выполнения операций по отдельности несколько раз.
Предложение предварительной обработки
Рабочий процесс метода предварительной обработки в методе классификации изображений описан ниже.
-> Изменить размер —> Создать большое изображение —> Преобразование
Первое изменение размера перед применением преобразователей увеличения выполняется для создания больших изображений, потому что, когда мы будем применять изменение размера, чтобы оно обрезало изображение таким образом, мы не потеряли интересующую область.
Следующим шагом является преобразование, при котором изображения обрезаются путем случайного выбора области и изменения ее размера до квадрата. Rest GPU обрабатывает все операции по увеличению данных. Рисунок -2 описан ниже
Ниже приведены шаги
1. В item_tfms — не выполняемых в графическом процессоре — применяемых к обучающей выборке — выбираются случайным образом. но в наборе проверки всегда выбран центр
2. В batch_tfms — применяется сразу ко всем пакетам в GPU. В проверочном наборе — только изменен размер до окончательного размера, а в обучающем наборе —случайно обрезается и применяется увеличение.
Примечание. вы можете использовать pad
или squish
вместо crop
(по умолчанию) для начального Resize
.
Предварительно обработанная операция над изображением
dblock1 = DataBlock(blocks=(ImageBlock(), CategoryBlock()), get_y=parent_label, item_tfms=Resize(460)) # Place an image in the 'images/grizzly.jpg' subfolder where this notebook is located before running this dls1 = dblock1.dataloaders([(Path.cwd()/'images'/'grizzly.jpg')]*100, bs=8) dls1.train.get_idxs = lambda: Inf.ones x,y = dls1.valid.one_batch() _,axs = subplots(1, 2) x1 = TensorImage(x.clone()) x1 = x1.affine_coord(sz=224) x1 = x1.rotate(draw=30, p=1.) x1 = x1.zoom(draw=1.2, p=1.) x1 = x1.warp(draw_x=-0.2, draw_y=0.2, p=1.) tfms = setup_aug_tfms([Rotate(draw=30, p=1, size=224), Zoom(draw=1.2, p=1., size=224), Warp(draw_x=-0.2, draw_y=0.2, p=1., size=224)]) x = Pipeline(tfms)(x) #x.affine_coord(coord_tfm=coord_tfm, sz=size, mode=mode, pad_mode=pad_mode) TensorImage(x[0]).show(ctx=axs[0]) TensorImage(x1[0]).show(ctx=axs[1]);
Рис. 3 ниже показывает два рисунка: слева fastaiподход к увеличению данных справа с использованием традиционных библиотек. Показанное изображение — увеличено и повернуто как одна операция, а затем интерполировано.
Правое и левое изображение
++------------------------------------------+ | | Right | ++------------------------------------------+ | | Low quality. | | | bottom left corner contains artifacts | | | no grass at top left corner | | | | +-+------------------------------------------+
Примечание. изменение размера повышает точность и сокращает время вычислений.
Проверка и отладка DataBlock
Есть несколько вещей, о которых нужно позаботиться, когда вы пишете DataBlock. Сообщение об ошибке будет показано, если вы получите синтаксическую ошибку. Первый шаг — проверка данных.
1. Как проверить данные
Ниже приведен код, на который стоит взглянуть. Часто специалисты по данным, работающие над проблемой, не знакомы с мозгом, проверяйте метки. Всегда пытайтесь поискать данные в Google. Например, я всегда стараюсь ознакомиться с породами собак, используя Интернет и сопоставляя собак.
dls.show_batch(nrow=1 , ncol =3)
2. Что делать, если вы допустили ошибку в DataBlock
Для отладки данных можно использовать следующие методы кода. Сводный метод используется для получения информации о блоке данных, который использует источник данных в качестве входных данных. Он создает пакет из исходного кода, отображает подробности и точки сбоя (если они возникают).
2.1. В итоге у нас получились картинки разного размера
Мы показали здесь одну распространенную ошибку. Мы не применяли изменение размера, поэтому пакетная обработка невозможна. В итоге мы получили изображения разных размеров. Напишите следующий код и давайте посмотрим на результат
pets1 = DataBlock(blocks= (ImageBlock,CategoryBlock), get_items=get_image_files, get_y= using_attr(RegixLabeller(r'(.+)_\d.jpg$'),'name'), splitter = RandomSplitter(seed=42) ) pets1.summay(path/"images")
Вывод:
Setting-up type transforms pipelines
Collecting items from /home/sgugger/.fastai/data/oxford-iiit-pet/images
Found 7390 items
2 datasets of sizes 5912,1478
Setting up Pipeline: PILBase.create
Setting up Pipeline: partial -> Categorize
Building one sample
Pipeline: PILBase.create
starting from
/home/sgugger/.fastai/data/oxford-iiit-pet/images/american_bulldog_83.jpg
applying PILBase.create gives
PILImage mode=RGB size=375x500
Pipeline: partial -> Categorize
starting from
/home/sgugger/.fastai/data/oxford-iiit-pet/images/american_bulldog_83.jpg
applying partial gives
american_bulldog
applying Categorize gives
TensorCategory(12)
Final sample: (PILImage mode=RGB size=375x500, TensorCategory(12))
Setting up after_item: Pipeline: ToTensor
Setting up before_batch: Pipeline:
Setting up after_batch: Pipeline: IntToFloatTensor
Building one batch
Applying item_tfms to the first sample:
Pipeline: ToTensor
starting from
(PILImage mode=RGB size=375x500, TensorCategory(12))
applying ToTensor gives
(TensorImage of size 3x500x375, TensorCategory(12))
Adding the next 3 samples
No before_batch transform to apply
Collating items in a batch
Error! It's not possible to collate your items in a batch
Could not collate the 0-th members of your tuples because got the following
shapes:
torch.Size([3, 500, 375]),torch.Size([3, 375, 500]),torch.Size([3, 333, 500]),
torch.Size([3, 375, 500])
Как мы видим в последних нескольких строках, данные не могут быть сгруппированы из-за разных форм. что обычно делает код:
Передать данные в блок → Создание кортежа (изображение, категория) → применить преобразование → Анализ ошибок.
3. Возможно, проблема в ваших данных
Так что надо смотреть где проблема. Распространенная проблема, почему ваша модель плохо обучается, возможно, связана с данными. Итак, если:
Данные в порядке → Обучить модель
Следующий код используется для выполнения начального теста
learn = cnn_learner(dls,resnet34, metrics=error_rate) learn.fine_tune(2)
Вывод
epoch train_loss valid_loss error_rate time 0 1.551305 0.322132 0.106225 00:19
Поскольку жизненный цикл машинного обучения требует Данные+Модель+гиперпараметры→Выполнить обучение → Проверка ошибок → Повторить итерацию.
На каждой итерации полный набор данных передается модели для обучения. состояние эпохи номер итерации. тогда как функция потерь в нашем случае — это Cross_entropy loss, потому что у нас есть категория в качестве выходных данных и входных данных изображения. Он автоматически выбирается библиотекой fastai, но мы можем его изменить. метрикауказывает метод оценки ошибки, это может быть точность, прецизионность, полнота или все вместе.
Хотите узнать больше ??
Переходите ко второй части здесь https://medium.com/@l154359/deep-learning-fast-ai-2022-series-image-classification-2-5f6cdfc21705