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

Хорошо, нажмите на " задний сад фермера кода " выше и выберите общедоступный аккаунт " звездочка

  Избранные статьи, доставка немедленно

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

Общие этапы производства:

 

1. Используйте labelme, чтобы аннотировать данные изображения и создать файл x.json, соответствующий изображению.

2. Выполните встроенную функцию labelme_json_to_dataset в разделе labelme и вручную сгенерируйте файл x_json, соответствующий изображению, по очереди (или используйте код для его обработки и генерации за один раз).

3. Обработайте файлы в папке, созданной на втором этапе, для создания семантического изображения label.png.

4. Преобразуйте семантическое изображение в категорию изображений в градациях серого - финальный обучающий файл метки.

1. Структура файлового каталога:

2. Официально начать производство

Первый шаг: установка программного обеспечения для маркировки

1. Создайте среду в Anaconda Prompt.

conda create --name = labelImg python = 3.6

2. Активируйте и войдите в только что созданную новую среду,

conda активировать labelImg

3. Интерфейс установки поддерживает пакет pyqt5.

pip install pyqt5 -i https://pypi.douban.com/simple/

4. Скачайте и установите labelme

pip install labelme -i https://pypi.douban.com/simple/

5. Введите команду labelme, чтобы запустить программу маркировки данных.

Шаг 2. Добавьте аннотацию

A. Аннотации одной категории, то есть на каждом изображении есть только одна цель.

[1] Введите команду labelme в командной строке, откройте интерфейс маркировки, а затем откройте папку, где находится изображение, которое нужно пометить, для маркировки.

Opendir «» Test_Image «» -> Создать полигоны -> Сохранить-> Следующее изображение

[2] После того, как все изображения отмечены, отмеченный файл сохраняется как файл x.json и помещается в предыдущую папку каталога после завершения производства.

Используйте VS2017 для просмотра содержимого файла Json, включая информацию для каждого пикселя в отмеченной области.

[3] Используйте собственную функцию labelme labelme_json_to_dataset, чтобы вручную преобразовать каждый формат файла json в семантические данные изображения.

1. cd туда, где находится json файл: cmd D: Test_Image

2. Просмотрите ярлык среды, в которой установлен текущий ярлык, и активируйте его.

3. Используйте labelme_json_to_dataset, чтобы вручную обработать файл аннотации x.json формата каждого изображения по очереди и сгенерировать файл x_json, который представляет собой соответствующее семантическое изображение каждой метки категории частичного изображения (этот процесс требует ручной корректировки x. обработка файлов .json, более хлопотная, вы можете написать код для преобразования напрямую)

Команда: labelme_json_to_data [x.json] -> имя файла json, созданное labelme

Метка частичной категории, соответствующая файлу x.json каждого изображения, сохраняется в каждом файле x_json, как показано ниже:

Содержимое тега локальной категории каждого файла изображения x_json:

аннотация:

img.png: соответствующий частичный исходный файл jpg, который следует использовать во время обучения.

label.png: аннотировать семантические изображения, используемые во время обучения

label_names.txt: название целевой категории на этом изображении

label_viz.png: визуализация метки, используется для подтверждения правильности метки

Одноразовое преобразование кода: json_to_dataset.py

Сгенерирует то же содержимое файла, что и следующий файл x_json выше

import argparseimport jsonimport osimport os.path as ospimport warnings
import PIL.Imageimport yaml
from labelme import utilsimport base64
def main():    count = os.listdir("./before/") for i in range(0, len(count)):        path = os.path.join("./before", count[i])
# 找到before文件中以json为结尾的文件并且打开if os.path.isfile(path) and path.endswith('json'):            data = json.load(open(path))
if data['imageData']:                imageData = data['imageData']else:                imagePath = os.path.join(os.path.dirname(path), data['imagePath'])with open(imagePath, 'rb') as f:                    imageData = f.read()                    imageData = base64.b64encode(imageData).decode('utf-8')            img = utils.img_b64_to_arr(imageData)            label_name_to_value = {'_background_': 0}for shape in data['shapes']:                label_name = shape['label']if label_name in label_name_to_value:                    label_value = label_name_to_value[label_name]else:                    label_value = len(label_name_to_value)                    label_name_to_value[label_name] = label_value
# label_values must be dense            label_values, label_names = [], []for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):                label_values.append(lv)                label_names.append(ln)assert label_values == list(range(len(label_values)))
            lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
            captions = ['{}: {}'.format(lv, ln)for ln, lv in label_name_to_value.items()]            lbl_viz = utils.draw_label(lbl, img, captions)            out_dir = osp.basename(count[i]).replace('.', '_')            out_dir = osp.join(osp.dirname(count[i]), out_dir)            out_dir = osp.join("output",out_dir)
if not osp.exists(out_dir):                os.mkdir(out_dir)
            PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
            utils.lblsave(osp.join(out_dir, 'label.png'), lbl)            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))
with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:for lbl_name in label_names:                    f.write(lbl_name + '\n')
            warnings.warn('info.yaml is being replaced by label_names.txt')            info = dict(label_names=label_names)with open(osp.join(out_dir, 'info.yaml'), 'w') as f:                yaml.safe_dump(info, f, default_flow_style=False)
            print('Saved to: %s' % out_dir)
if __name__ == '__main__':    main()

После того, как мы получим метку локальной семантической категории, соответствующую каждому изображению (для каждого изображения, после преобразования категории оттенков серого, оно принадлежит цели маркировки, такой как кошка, значение пикселя в области равно 1, что не является изображением цели маркировки Значение пикселя области (фона) равно 0).

Если к набору данных добавляется новое изображение, на этом изображении будет только одна целевая собака. Чтобы добавить целевую категорию собаки в тренировочный набор, метка локальной категории собаки должна быть преобразована в метку глобальной категории, то есть во время обучения фон Значение пикселя равно 0, значение пикселя кота равно 1, значение пикселя собаки равно 2 и т. Д.)

[4] Метка локальной категории—> Метка глобальной категории (преобразование серой шкалы категории).

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

Выполните операцию get_jpg_and_png.py, чтобы получить глобальный файл метки категории и преобразование оттенков серого категории для каждого изображения, то есть значение пикселя фона в изображении равно 0, если целью является кошка, значение пикселя равно 1. Если целью является собака, значение ее пикселя равно 2.

Последняя глобальная обучающая метка здесь представляет собой изображение в градациях серого, которое является одноканальным. Диапазон значений пикселей составляет от 0 до 255. Здесь он полностью черный, потому что значение пикселей равно 1 и 2. В изображении в оттенках серого значение относительно невелико. , Разница относительно небольшая, поэтому весь дисплей черный.

Категория изображения в оттенках серого:

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

1.  Здесь нам нужно сначала создать новый class_name.txt, содержащий имя глобального класса.

2. С помощью файла class_name.txt преобразуйте файл метки локальной категории изображения в файл метки глобальной категории, код преобразования: get_jpg_and_png.py

import os
from PIL import Image
import numpy as np
def main():
    # 读取原文件夹
    count = os.listdir("./before/") 
    for i in range(0, len(count)):
        # 如果里的文件以jpg结尾
        # 则寻找它对应的png
        if count[i].endswith("jpg"):
            path = os.path.join("./before", count[i])
            img = Image.open(path)
            img.save(os.path.join("./jpg", count[i]))


            # 找到对应的png
            path = "./output/" + count[i].split(".")[0] + "_json/label.png"
            img = Image.open(path)


            # 找到全局的类
            class_txt = open("./before/class_name.txt","r")
            class_name = class_txt.read().splitlines()
            # ["bk","cat","dog"] 全局的类
            # 打开x_json文件里面存在的类,称其为局部类
            with open("./output/" + count[i].split(".")[0] + "_json/label_names.txt","r") as f:
                names = f.read().splitlines()
                # ["bk","dog"] 局部的类
                # 新建一张空白图片
                new = Image.new("RGB",[np.shape(img)[1],np.shape(img)[0]])


                # 找到局部的类在全局中的类的序号
                for name in names:
                    # index_json是x_json文件里存在的类label_names.txt,局部类
                    index_json = names.index(name)
                    # index_all是全局的类,
                    index_all = class_name.index(name)


                    # 将局部类转换成为全局类
                    # 将原图img中像素点的值为index_json的像素点乘以其在全局中的像素点的所对应的类的序号 得到 其实际在数据集中像素点的值
                    # 比如dog,在局部类(output/x_json/label_names)中它的序号为1,dog在原图中的像素点的值也为1.
                    # 但是在全局的类(before/classes.txt)中其对应的序号为2,所以在新的图片中要将局部类的像素点的值*全局类的序号,从而得到标签文件
                    new = new + np.expand_dims(index_all*(np.array(img) == index_json),-1)


            new = Image.fromarray(np.uint8(new))
            # 将转变后的得到的新的最终的标签图片保存到make_dataset/png文件夹下
            new.save(os.path.join("./png", count[i].replace("jpg","png")))
            # 找到新的标签文件中像素点值的最大值和最小值,最大值为像素点对应的类在class_name.txt中的序号,最小值为背景,即0
            print(np.max(new),np.min(new))




if __name__ == '__main__':
    main()

3. Наконец, мы используем get_train_txt.py содержания вышеуказанных документов , полученных в JPG и PNG файлов в однозначное соответствие между наборами данных и оригинальной этикеткой, в train_data.txt

[5] Стиль окончательного набора данных обучающей модели: папка jpg (исходное изображение) + папка png (метка глобальной категории в градациях серого) + train_data.txt (соответствие между исходным изображением и меткой), поместите его в модель для обучения Теперь в следующем выпуске будет объяснена модель семантической сегментации SegNet на основе MobileNet.

Б. Многокатегорийная аннотация, то есть на картинке есть несколько целей.

Процесс маркировки аналогичен описанному выше: несколько целей на картинке помечаются последовательно, а содержимое сгенерированного файла x_json такое же, как и маркировка одиночной цели.

Создайте новый class_name.txt, содержащий имя глобального класса , а затем преобразуйте градацию серого категории, используйте get_jpg_and_png.py для преобразования, мы видим, что значение пикселя области, соответствующей кошке, равно 1, что соответствует категории 1, и то же самое верно для пикселей соответствующей области собаки Значение точки равно 2, что соответствует категории 2, а значение пикселя в области фона равно 0.

После преобразования серого класса модель можно обучать.

Стиль окончательного набора данных обучающей модели: папка jpg (исходное изображение) + папка png (метка глобальной категории в оттенках серого) + train_data.txt (соответствие между исходным изображением и меткой), поместите его в модель для обучения, следующий выпуск Объясните модель семантической сегментации SegNet на основе MobileNet.

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

Замечательная рекомендация:

Новая серия учебных пособий по сегментации изображений

Сегментация изображений <-> семантическая сегментация

Больше премиального контента? Жду вас посмотреть

рекомендация

отblog.csdn.net/weixin_45192980/article/details/109685569