Изучая курс fastai, я столкнулся с сегментацией изображений, поэтому я попытался объяснить код для сегментации изображений в этом блоге.

Начиная с….

Мы импортировали необходимые библиотеки, используя следующий код

Чтобы получить данные, мы использовали метод untar_data.

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

Тело функции данных untar_data выглядит следующим образом

Как правило, untar_data использует url для загрузки tgz файла.

untar_method вернул путь к наборам данных, которые мы сохранили в пути переменной

Затем мы создадим переменную, содержащую путь к меткам, и другую переменную, содержащую путь к изображениям.

Теперь мы получим путь к файлам изображений из path_img, используя следующий код:

Точно так же мы получим путь к файлам меток из path_lbl, используя код ниже:

get_image_files извлекает нам файлы изображений по указанному нами пути.

get_image_file выглядит так

В папке меток доступны сегментированные изображения для каждого изображения, присутствующего в папке изображений.

Итак, для файла изображения со следующим именем

PosixPath(‘/home/ubuntu/.fastai/data/camvid/images/0001TP_008160.png’)

Путь к соответствующему файлу сегментированного изображения будет

PosixPath(‘/home/ubuntu/.fastai/data/camvid/images/0001TP_008160_P.png’)

Итак, до сих пор у нас есть путь к файлам изображений, хранящимся в переменной с именем fname, и путь к файлу сегментированный файл изображения, хранящийся в переменной с именем lbl_names

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

Теперь мы увидим пример соответствующего сегментированного изображения.

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

Мы использовали лямбда-выражение для получения соответствующего имени файла сегментированного изображения.

x.stem: дает имя файла без расширения

x.suffix: дает расширение имени файла

Подробнее о x.stem и x.suffix можно прочитать здесь

Далее мы откроем соответствующее сегментированное изображение, используя следующий код

Как вы можете заметить, мы использовали open_mask для открытия изображения.

open_mask: Маска открытия используется для открытия сегментированного изображения так же, как открытое изображение используется для открытия изображения.

Подробнее об open_mask можно прочитать здесь

Теперь загрузим все «коды» разных объектов, по которым они были сегментированы.

Наши коды хранятся в файле с именем code.txt.

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

Наши изображения были сохранены в папке path_img, поэтому мы будем использовать from_folder

Мы разделим некоторые изображения набора данных изображений на набор данных проверки на основе имен файлов изображений, представленных в valid.txt.

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

Наконец, мы применим некоторые преобразования к изображениям.

Теперь мы увидим наш пакет данных

Теперь пронумеруем наши коды объектов

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

Наши пользовательские показатели следующие

Построение модели

Мы использовали unet Learner, подробнее о unet Learner можно узнать здесь

data: данные, по которым мы хотим подобрать модель

models.resnet34: мы использовали предварительно обученную модель resnet34.

Метрики: это метрики, которые оценивают модель, которую мы определили для наших пользовательских метрик выше.

wd: Это снижение веса, это предотвращает переоснащение

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

Мы ищем диапазон, когда на графике наблюдается резкое снижение, поскольку мы можем наблюдать, что график наиболее крутой между 1e-04 и 1e-03, поэтому мы выбрали 3e-03 в качестве максимальной скорости обучения.

Параметры

10: это количество эпох

slice(lr): это скорость обучения

pct_strt: показывает, сколько процентов от one_cycle мы хотим выделить для увеличения lr.

Чтобы узнать больше о fit_one_cycle, вы можете обратиться к этому

Из результатов видно, что мы достигли точности 90,1%

Посмотрим на результаты

Результаты показывают, что люди, ездящие на велосипеде, не были правильно сегментированы.

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

Теперь точность увеличилась до 92,1%

Давайте теперь снова посмотрим на результаты

Теперь результаты выглядят более чем удовлетворительно