Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Компьютерное зрение. Практикум

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
данный момент одной из стабильных версий является YOLOv8 установим её.
!pipinstallultralytics==8.0.196
Библиотека ultralytics содержит в себе несколько обученных моделей c
архитектурой YOLO. Каждая модель отличается количеством параметров. Чем
больше параметров, тем качество детекции может быть лучше, но модель требует
больше вычислительных ресурсов и из-за этого медленно обрабатывают
изображение. В то же время модели поменьше обрабатывают изображение быстрее,
но и менее качественно. На рисунке 3.5 представлены различные версии модели
Рисунок 3.5 –версии модели YOLO
Каждая из представленных выше моделей уже обучена на датасете COCO,
данный датасет состоит из 80 классов. Полный список классов можно посмотреть на
https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/coco.yaml.Мож
ем отметить что модель обучена распознавать легковые автомобили, грузовики,
автобусы и людей
Пример работы модели. Для работы с моделью можно воспользоваться
двумя способами. Через конспольную команду (рисунок 3.6 ) или c помощью кода
на Python (рисунок 3.7):
61
#можете указать ссылку на изображение из интернета или указать путь к
файлу на вашем компьютере
#можете указать путь к папке, где хранятся изображения, тогда нейросеть
обработает все изображения в папке
!yolo predict model=yolov8m.pt
source='https://media.kasperskycontenthub.com/wp­content/uploads/sites/67/2023/04/21114019/11321348_original.jpg'
Отобразим результат с помощью кода:
− importmatplotlib.pyplotasplt
− img = plt.imread('/content/runs/detect/predict/11321348_original.jpg')
− plt.imshow(img)
Рисунок 3.6 – Результат работы выполненной задачи детекции с
помощью консольной команды
62
Выполнить те же действия можно с помощью кода на Python. from ultralytics import YOLO model = YOLO('yolov8x.pt') #выбралисамую"тяжелую" модель results = model('/content/runs/detect/predict/11321348_original.jpg')
#возвращает массив который состоит из словарей. Каждый словарь это
результат для одного из изображений
print(type(results)) print(type(results[0])) img = results[0].plot()[:,:,::-1] #plot() возвращает изображение в формате BGR
для перевода RGB мы меняем порядок следования в каналах
plt.imshow(img)
Рисунок 3.7 –Результат работы выполненной задачи детекции с помощью
кода на Python
Объект results содержит в себе много полезных элементов для работы. Так
63
вызвав results.boxes вы можете получить координаты всех ограничивающих рамок
на изображении (эти рамки называют bouding box). Подробное описание
дополнительных параметров представлено на
https://docs.ultralytics.com/ru/modes/predict/#inference-arguments
Обучение модели на собственных данных.
На сайте https://universe.roboflow.com/browse представлено огромное
количество наборов данных для задачи детекции. Также на данном сайте вы можете
создать свой собственный набор данных, а затем загружать его для обучения модели
В качестве примера возьмем датасет в котором решается задача детекции
пустых полок в магазинах. https://universe.roboflow.com/fyp-ormnr/supermarket-
empty-shelf-detector
Для того чтобы удобным образом скачивать датасет вы должны
зарегистрироваться на сайте https://app.roboflow.com/и получить api-ключ. Когда вы зарегистрируетесь перейдите в Settings->Api keys и скопируйте ключ который лежит в private api key
!pip install roboflow -q from roboflow import Roboflow rf = Roboflow(api_key="******") #сюдавместознаков *** вставитьвашAPIключ project = rf.workspace("fyp-ormnr").project("supermarket-empty-shelf-detector") version = project.version(4) dataset = version.download("yolov8")
Обучим модель на предложенном наборе данных !yolo task=detect mode=train model=yolov8s.yaml
data={dataset.location}/data.yaml epochs=100 imgsz=800
Запустим модель на произвольном изображении. Вы можете загрузить своё
64
fromgoogle.colabimportfiles uploaded = files.upload() image_name = list(uploaded.keys())[0]
model = YOLO('/content/runs/detect/train/weights/best.pt')
#выбралимоделькотораядаетнаилучшийрезультат
results = model(f'/content/{image_name}')
img = results[0].plot()[:,:,::-1] #plot() возвращает изображение в формате BGR
для перевода RGB мы меняем порядок следования в каналах
plt.imshow(img)
Рисунок 3.8 – Результат работы модели, на фотографии которой не было в
обучающей выборке
Тот же запуск модели только с помощью консоли
65
!yolo task=detect mode=predict model=/content/runs/detect/train/weights/best.pt
source='https://i.cbc.ca/1.6326969.1643135404!/fileImage/httpImage/image.jpg_gen/deriv atives/16x9_780/empty-grocery-shelves-vancouver.jpg' save=True
import matplotlib.pyplot as plt img = plt.imread('/content/runs/detect/predict/empty-grocery-shelves-
vancouver.jpg')
plt.imshow(img)
Рисунок 3.9 – Результат работы модели, на фотографии которой не было в
обучающей выборке
Задание.
Выберете один из датасетов представленных на сайте
https://universe.roboflow.com/browse и выполните обучение модели, представьте
отчет о качестве работы модели.
66
4 Сегментация объектов на изображении
Сегментация изображения – это разбиение изображения на множество
покрывающих его областей. Сегментация применяется во многих областях,
например, в производстве для индикации дефектов при сборке деталей, в медицине
для первичной обработки снимков, также для составления карт местности по снимкам со спутников.
Рассмотрим несколько классических методов из библиотеки компьютерного
зрения OpenCV.
1 Алгоритм сегментации по водоразделам (WaterShed).
Алгоритм работает с изображением как с функцией от двух
переменных f=I(x,y), где x,y – координаты пикселя.
2 Алгоритм сегментации MeanShift.
MeanShift группирует объекты с близкими признаками. Пиксели со схожими
признаками объединяются в один сегмент, на выходе получаем изображение с
однородными областями. Например, в качестве координат в пространстве признаков можно выбрать координаты пикселя (x, y) и компоненты RGB пикселя.
Изобразив пиксели в пространстве признаков, можно заметить сгущения в
определенных местах.
3 Алгоритм сегментации FloodFill. С помощью FloodFill (заливка или метод «наводнения») можно выделить
однородные по цвету регионы. Для этого нужно выбрать начальный пиксель и
задать интервал изменения цвета соседних пикселей относительно исходного.
Интервал может быть и несимметричным. Алгоритм будет объединять пиксели в
один сегмент (заливая их одним цветом), если они попадают в указанный диапазон.
На выходе будет сегмент, залитый определенным цветом, и его площадь в пикселях.
Такой алгоритм может быть полезен для заливки области со слабыми перепадами
цвета однородным фоном. Одним из вариантов использования FloodFill может быть
выявление поврежденных краев объекта. Например, если, заливая однородные
области определенным цветом, алгоритм заполнит и соседние регионы, то значит
67
нарушена целостность границы между этими областями.
4 Алгоритм сегментации GrabCut
Это интерактивный алгоритм выделения объекта, разрабатывался как более
удобная альтернатива магнитному лассо (чтобы выделить объект, пользователю
требовалось обвести его контур с помощью мыши). Для работы алгоритма
достаточно заключить объект вместе с частью фона в прямоугольник (grab).
Сегментирование объекта произойдет автоматически (cut).
Семантическая сегментация – это задача, в которой по входному изображению
нам нужно обучить модель, способную предсказать категорию каждого пикселя
в изображении. В современных методах модель обычно представляет собой сверточные нейронные сети, которые обучаются с использованием аннотаций на
уровне пикселей. Однако модель сегментации, обученная на одном наборе данных,
может плохо обобщаться на изображения из другого набора, из-за несовпадения
домена (предметной области) между наборами. Таким образом, модель необходимо
адаптировать к изображениям из целевого домена, в котором она будет работать. Но
поскольку разметка целевых изображений может оказаться дорогостоящей или
вовсе невозможной, нужно найти способ адаптировать обученную модель
к целевому домену с минимальными затратами на разметку или даже без них.
Методы адаптации домена без учителя (unsupervised domain adaptation, UDA)
для семантической сегментации были разработаны для решения проблемы
несовпадения доменов без затрат на аннотирование целевых изображений. Методы,
описанные в литературе, направлены на адаптацию модели, обученной в исходном домене с попиксельными эталонными метками, например, из симулятора, который требует наименьших усилий по разметке, к целевому домену, который не имеет какой-либо разметки. Эти описанные в литературе методы UDA для семантической сегментации разрабатываются в основном с использованием двух механизмов: самообучения c псевдоразметкой (pseudo-label self-training) и выравнивания распределения между исходным и целевым доменами. Для первого механизма попиксельная псевдоразметка генерируется с помощью таких стратегий, как степень уверенности (confidence score) или обучение в режиме самоуправления (self-paced
68
learning), но подобная псевдоразметка специфична для целевого домена и не учитывает сопоставление между доменами. В случае второго механизма можно
рассматривать различные пространства для работы процедуры сопоставления, такие
как пиксель, признак, выход и патч. Однако сопоставление, выполняемое этими
методами, не зависит от категории, что может быть проблематично, поскольку
разрыв между доменами может варьироваться в зависимости от категории.
Проблема отсутствия разметки в целевом домене может быть решена путем
введения концепции использования слабой разметки (weak labels) в целевом наборе
данных для адаптации. Такую слабую разметку можно использовать для
сопоставления по категориям между исходным и целевым доменами, а также для
обеспечения соблюдения ограничений на категории, присутствующие
в изображении. Может быть несколько форм слабой разметки – метки на уровне изображения, точечные метки, которые мы исследуем в этом тексте, а также другие
формы слабой разметки, такие как плотность пикселей определенных категорий,
количество объектов и т. д., которые довольно легко приобрести у аннотатора. Важно отметить, что наша слабая разметка может быть получена на основе предсказания модели в условиях UDA или предоставлена человеком-оракулом в парадигме адаптации домена со слабым обучением (weakly-supervised domain adaptation, WDA), как показано на рисунке 4.1.
69
Рисунок 4.1 – Использование слабой разметки на уровне изображения для
адаптации домена двумя различными способами: адаптация домена без учителя
(UDA), либо доменная адаптация со слабым обучением (WDA).
Стоимость целевой разметки в UDA равна нулю, а в случае WDA очень мала,
как мы увидим далее. Литература по адаптации домена для моделей семантической
сегментации посвящена только методам обучения без учителя (UDA), и ее можно
разделить на три категории: адаптация на уровне пикселей, которая направлена на
сопоставление пространства входного изображения; обучение псевдометкам,
которое направлено на маркировку немеченых целевых данных, использование
исходной модели иее использование для адаптации, а также адаптация признаков
или выходного пространства, целью которой является согласование выходного
пространства между исходным и целевым доменами. Эффективность этих методов довольно низка по сравнению с методами с сильным обучением.
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]