В этом пошаговом руководстве, состоящем из двух частей, мы исследуем набор данных изображений COCO (общие объекты в контексте) и манипулируем им для семантической сегментации изображений в Python с помощью библиотек, включая PyCoco и Tensorflow Keras.

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

Представляем вам серию из двух частей, состоящую из полного руководства, которое поможет вам в изучении, использовании и освоении набора данных COCO Image для сегментации изображений. Я постараюсь сделать это как можно проще, объяснять каждый шаг и использовать только бесплатные и простые библиотеки. Моя задача здесь - познакомить вас с этой темой и довести ее до уровня, на котором вы сможете занять центральное место и управлять ею в соответствии со своими потребностями!

В части 1 мы сначала исследуем набор данных COCO для сегментации изображений и будем работать с ним с помощью библиотеки Python под названием pycoco. Эта библиотека упрощает обработку набора данных COCO, который в противном случае было бы очень сложно кодировать самостоятельно.

В Части 2 мы будем использовать библиотеку T Ensorflow Keras, чтобы упростить обучение моделей на этом наборе данных, а также добавить дополнения к изображениям.

Вы можете найти весь код этого руководства в моем репозитории GitHub. Однако продолжайте читать этот пост для более подробного объяснения.

1. Набор данных COCO

«COCO - это крупномасштабный набор данных для обнаружения, сегментации и субтитров».

Общие объекты в контексте (COCO) буквально подразумевают, что изображения в наборе данных являются повседневными объектами, снятыми из повседневных сцен. Это добавляет некоторый контекст к объектам, захваченным в сценах. Изучите этот набор данных здесь.

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

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

2. Загрузки и установки

COCO

Вам нужно будет загрузить набор данных COCO на свое устройство (что вполне очевидно). Вы можете скачать файлы наборов данных за 2017 год по ссылкам ниже. Файлы довольно большие, так что наберитесь терпения, это может занять некоторое время. Вам понадобятся следующие файлы:

(а) Изображения поездов 2017 г.

(б) 2017 val изображения

(c) Аннотации Stuff Train / Val 2017

Распакуйте заархивированные файлы. Из (c) необходимы только файлы instance для train и val, то есть instance_train2017.json и instance_val2017.json.

Расположите эти файлы в соответствии с приведенной ниже файловой структурой. Требуется простое переупорядочение и переименование папок и файлов. Я сделал это только для простоты использования и визуализации. Если вы не хотите этого делать, все, что вам нужно сделать, это изменить код (в основном, пути к файлам) соответственно.

Project Folder
└───the code notebook (.py / .ipynb)
│
└───COCOdataset2017   
    └───images
    │   └───train
    │   │    │   000000000009.jpg
    │   │    │   000000000025.jpg
    │   │    │   ...
    │   └───val   
    │        │   000000000139.jpg
    │        │   000000000285.jpg
    │        │   ...
    └───annotations
        │   instances_train.json
        │   instances_val.json

# Обратите внимание, что есть способ получить доступ к изображениям с их URL-адресами (из файла аннотаций), который потребует от вас только загрузки (c). Однако во время длительного тренировочного процесса лучше, если вы не зависите от Интернета, поэтому я также рекомендую загрузить (а) и (б).

PyCoco

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

В Conda, если вы выполните описанную ниже процедуру, вы сможете без проблем установить, импортировать и использовать эту библиотеку.

Другие

Давайте импортируем все библиотеки, которые мы будем использовать в этом руководстве. Установка других библиотек довольно проста, поэтому я не буду здесь упоминать подробности. Установите все библиотеки в свою среду Python.

3. Исследование наборов данных с помощью PyCoco

Во-первых, давайте запустим библиотеку PyCoco. Эта библиотека принимает файл аннотаций COCO (.json) (те, которые мы загрузили на шаге 2) в качестве входных данных. Аннотации экземпляров train или val должны работать, но в этом руководстве я использую instance_val.json, поскольку он загружается быстрее (причина: набор данных val меньше, чем набор данных train).

Вывод, то есть категории, печатаются как:

[{'supercategory': 'person', 'id': 1, 'name': 'person'},
 {'supercategory': 'vehicle', 'id': 2, 'name': 'bicycle'},
 {'supercategory': 'vehicle', 'id': 3, 'name': 'car'},
 {'supercategory': 'vehicle', 'id': 4, 'name': 'motorcycle'},
 {'supercategory': 'vehicle', 'id': 5, 'name': 'airplane'},
 {'supercategory': 'vehicle', 'id': 6, 'name': 'bus'},
 {'supercategory': 'vehicle', 'id': 7, 'name': 'train'},
 {'supercategory': 'vehicle', 'id': 8, 'name': 'truck'},
 {'supercategory': 'vehicle', 'id': 9, 'name': 'boat'},
 {'supercategory': 'outdoor', 'id': 10, 'name': 'traffic light'},
 {'supercategory': 'outdoor', 'id': 11, 'name': 'fire hydrant'},
 {'supercategory': 'outdoor', 'id': 13, 'name': 'stop sign'},
 {'supercategory': 'outdoor', 'id': 14, 'name': 'parking meter'},
 {'supercategory': 'outdoor', 'id': 15, 'name': 'bench'},
 {'supercategory': 'animal', 'id': 16, 'name': 'bird'},
 {'supercategory': 'animal', 'id': 17, 'name': 'cat'},
 {'supercategory': 'animal', 'id': 18, 'name': 'dog'},
 {'supercategory': 'animal', 'id': 19, 'name': 'horse'},
 {'supercategory': 'animal', 'id': 20, 'name': 'sheep'},
 {'supercategory': 'animal', 'id': 21, 'name': 'cow'},
 {'supercategory': 'animal', 'id': 22, 'name': 'elephant'},
 {'supercategory': 'animal', 'id': 23, 'name': 'bear'},
 {'supercategory': 'animal', 'id': 24, 'name': 'zebra'},
 {'supercategory': 'animal', 'id': 25, 'name': 'giraffe'},
 {'supercategory': 'accessory', 'id': 27, 'name': 'backpack'},
 {'supercategory': 'accessory', 'id': 28, 'name': 'umbrella'},
 {'supercategory': 'accessory', 'id': 31, 'name': 'handbag'},
 {'supercategory': 'accessory', 'id': 32, 'name': 'tie'},
 {'supercategory': 'accessory', 'id': 33, 'name': 'suitcase'},
 {'supercategory': 'sports', 'id': 34, 'name': 'frisbee'},
 {'supercategory': 'sports', 'id': 35, 'name': 'skis'},
 {'supercategory': 'sports', 'id': 36, 'name': 'snowboard'},
 {'supercategory': 'sports', 'id': 37, 'name': 'sports ball'},
 {'supercategory': 'sports', 'id': 38, 'name': 'kite'},
 {'supercategory': 'sports', 'id': 39, 'name': 'baseball bat'},
 {'supercategory': 'sports', 'id': 40, 'name': 'baseball glove'},
 {'supercategory': 'sports', 'id': 41, 'name': 'skateboard'},
 {'supercategory': 'sports', 'id': 42, 'name': 'surfboard'},
 {'supercategory': 'sports', 'id': 43, 'name': 'tennis racket'},
 {'supercategory': 'kitchen', 'id': 44, 'name': 'bottle'},
 {'supercategory': 'kitchen', 'id': 46, 'name': 'wine glass'},
 {'supercategory': 'kitchen', 'id': 47, 'name': 'cup'},
 {'supercategory': 'kitchen', 'id': 48, 'name': 'fork'},
 {'supercategory': 'kitchen', 'id': 49, 'name': 'knife'},
 {'supercategory': 'kitchen', 'id': 50, 'name': 'spoon'},
 {'supercategory': 'kitchen', 'id': 51, 'name': 'bowl'},
 {'supercategory': 'food', 'id': 52, 'name': 'banana'},
 {'supercategory': 'food', 'id': 53, 'name': 'apple'},
 {'supercategory': 'food', 'id': 54, 'name': 'sandwich'},
 {'supercategory': 'food', 'id': 55, 'name': 'orange'},
 {'supercategory': 'food', 'id': 56, 'name': 'broccoli'},
 {'supercategory': 'food', 'id': 57, 'name': 'carrot'},
 {'supercategory': 'food', 'id': 58, 'name': 'hot dog'},
 {'supercategory': 'food', 'id': 59, 'name': 'pizza'},
 {'supercategory': 'food', 'id': 60, 'name': 'donut'},
 {'supercategory': 'food', 'id': 61, 'name': 'cake'},
 {'supercategory': 'furniture', 'id': 62, 'name': 'chair'},
 {'supercategory': 'furniture', 'id': 63, 'name': 'couch'},
 {'supercategory': 'furniture', 'id': 64, 'name': 'potted plant'},
 {'supercategory': 'furniture', 'id': 65, 'name': 'bed'},
 {'supercategory': 'furniture', 'id': 67, 'name': 'dining table'},
 {'supercategory': 'furniture', 'id': 70, 'name': 'toilet'},
 {'supercategory': 'electronic', 'id': 72, 'name': 'tv'},
 {'supercategory': 'electronic', 'id': 73, 'name': 'laptop'},
 {'supercategory': 'electronic', 'id': 74, 'name': 'mouse'},
 {'supercategory': 'electronic', 'id': 75, 'name': 'remote'},
 {'supercategory': 'electronic', 'id': 76, 'name': 'keyboard'},
 {'supercategory': 'electronic', 'id': 77, 'name': 'cell phone'},
 {'supercategory': 'appliance', 'id': 78, 'name': 'microwave'},
 {'supercategory': 'appliance', 'id': 79, 'name': 'oven'},
 {'supercategory': 'appliance', 'id': 80, 'name': 'toaster'},
 {'supercategory': 'appliance', 'id': 81, 'name': 'sink'},
 {'supercategory': 'appliance', 'id': 82, 'name': 'refrigerator'},
 {'supercategory': 'indoor', 'id': 84, 'name': 'book'},
 {'supercategory': 'indoor', 'id': 85, 'name': 'clock'},
 {'supercategory': 'indoor', 'id': 86, 'name': 'vase'},
 {'supercategory': 'indoor', 'id': 87, 'name': 'scissors'},
 {'supercategory': 'indoor', 'id': 88, 'name': 'teddy bear'},
 {'supercategory': 'indoor', 'id': 89, 'name': 'hair drier'},
 {'supercategory': 'indoor', 'id': 90, 'name': 'toothbrush'}]

В наборе данных COCO есть 81 категория объектов (обратите внимание, что ‘id’: 0 - это фон), как мы распечатали выше (также перечисленные здесь). Однако, как вы можете заметить, идентификаторы меток для этих 81 класса варьируются от 0 до 90 (некоторые пустые номера идентификаторов между ними). Вот удобная функция, которая может получить имя класса для заданного идентификатора.

Это даст результат:

The class name is cell phone

Фильтрация классов

Допустим, мне нужны изображения, содержащие только классы «ноутбук», «телевизор» и «сотовый телефон», и мне не нужны другие классы объектов. Чтобы получить это подмножество набора данных, выполните следующие действия:

Теперь переменная imgIDs содержит все изображения, которые содержат все filterClasses. Вывод оператора печати:

Number of images containing all the classes: 11

Это означает, что из всего набора данных проверки есть 11 изображений, которые содержат ВСЕ 3 класса, которые я хотел. И отображаемый образец изображения:

Чтобы отобразить аннотации, мы будем следовать приведенному ниже коду. Обратите внимание, что мы используем функции pycoco loadAnns для загрузки аннотаций, касающихся объекта в формате COCO, и showAnns для их зарисовки на изображении. Эти функции в значительной степени упрощают рисование масок аннотаций. Вы можете взглянуть на определения связанных функций, чтобы увидеть, как они работают внутри.

Все возможные комбинации

Когда мы фильтруем набор данных с помощью классов, инструмент pycoco возвращает изображения, которые состоят только из ВСЕХ требуемых классов, а не из одной, двух или любых других комбинаций. Таким образом, этот фрагмент кода гарантирует, что все возможные комбинации для заданных списков filterClass будут получены в результирующем наборе данных.

Вывод оператора печати:

Number of images containing the filter classes: 503

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

4. Создание маски сегментации изображения.

Для любой обучающей задачи семантической сегментации вам потребуется папка, полная изображений (train и val) и соответствующих исходных масок истинности. Этот раздел поможет создать соответствующие маски изображения.

Тип маски 1: маска нормальной семантической сегментации

Каждый пиксель имеет метку в соответствии с классом, к которому он относится. Я не использую официальные идентификаторы COCO, а вместо этого назначаю значения пикселей в соответствии с порядком имени класса в массиве 'filterClasses', то есть:
0: background
1 : ноутбук
2: телевизор
3: мобильный телефон

На выходе получается двухканальная маска семантической сегментации с размерами, равными исходному изображению, как показано ниже:

Тип маски 2: маска двоичной семантической сегментации

Как правило, маска вывода будет иметь N возможных значений пикселей для N классов вывода. Однако двоичное маскирование подразумевает, что маска вывода будет иметь только 2 значения пикселя, т. Е. 1 (объект: может быть любым из N классов) и 0 (фон).

На выходе получается двухканальная маска семантической сегментации двоичного кода с размерами, равными исходному изображению, как показано ниже:

Примечание: формат желаемых масок может отличаться от указанных выше. Например, вы можете захотеть сохранить идентификационные номера меток такими же, как в исходном наборе данных COCO (0–90). Или вам может понадобиться выходной формат для варианта использования сегментации экземпляра. Другой пример: вы можете захотеть, чтобы ваши маски были однократно закодированы, то есть количество каналов = количеству классов выходных объектов, и каждый канал имеет только нули (фон) и единицы (этот объект).

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

Теперь перейдем к Части 2.



Опять же, код этого руководства в моем репозитории GitHub.

И, друзья мои, на этом все! Если вы зашли так далеко, я надеюсь, что вы приобрели некоторую уверенность в наборе данных COCO. Но не останавливайтесь на этом - выходите, черт возьми, экспериментируйте и потрясите мир сегментации изображений своими новыми идеями!

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



Создайте набор данных синтетических изображений -« Что , Почему и Как
Не хватает изображений для обучения модели? Вот как в несколько раз увеличить размер набора данных с помощью синтетических изображений… todatascience.com »



Или хотите разбогатеть в одночасье, используя машинное обучение для акций? Эта статья (НЕ) для вас!



Может ли модель машинного обучения буквально читать графики цен на акции?