Хорошо, нажмите на " задний сад фермера кода " выше и выберите общедоступный аккаунт " звездочка "
Избранные статьи, доставка немедленно
В последнем выпуске объясняется базовая структура модели семантической сегментации и часто используемые наборы данных. В этом выпуске объясняется производство наборов данных семантической сегментации.
Общие этапы производства:
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.
Хорошо, часть маркировки данных здесь, все коды файлов обработки, ключевое слово ответа: проект фактического боя , вы можете его получить.
Замечательная рекомендация:
Новая серия учебных пособий по сегментации изображений
Сегментация изображений <-> семантическая сегментация
Больше премиального контента? Жду вас посмотреть