[Entrenamiento modelo] labelme etiquetado y procesamiento método de datos de segmentación

  ¡Acostúmbrate a escribir juntos! Este es el séptimo día de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

欢迎关注我的公众号 [极智视界],获取我的更多笔记分享

  Hola a todos, mi nombre es Jizhi Vision. Este documento presenta en detalle cómo labelme etiqueta y procesa datos segmentados.

  La segmentación de imágenes es una tarea común en las tareas de visión por computadora, incluida la segmentación de instancias, la segmentación semántica, la segmentación panorámica, etc. Antes de enviarla a la tarea de segmentación, los datos deben etiquetarse. Como todos sabemos, la calidad de los datos en el aprendizaje profundo tiene un gran impacto en el efecto de detección final, por lo que la importancia del etiquetado de datos es evidente.

  Comience a continuación.

1. Instalar labelme

  Ya sea que sea Windows o Linux, puede instalarlo así:

# 首先安装anaconda,这个这里不多说
# 安装pyqt5
pip install -i https://pypi.douban.com/simple pyqt5

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

# 打开labelme
./labelme
复制代码

  Luego se generará un archivo json correspondiente a la imagen, el cual contendrá la etiqueta y la información de la máscara de segmentación etiquetada, que es casi así:

2. json incorporado a datset

2.1 Json de una sola imagen a conjunto de datos

  Ejecutar directamente:

labelme_json_dataset xxx.json
复制代码

  entonces generará:

  • img.png: imagen original;

  • etiqueta.png: imagen de máscara;

  • label_viz.png: imagen de máscara con fondo;

  • info.yaml, label_names.txt: información de la etiqueta;

2.2 Lote json a conjunto de datos

  Busque el directorio cli/json_to_dataset.py, luego:

cd cli
touch json_to_datasetP.py
vim json_to_datasetP.py
复制代码

  Agregue lo siguiente:

import argparse
import json
import os
import os.path as osp
import warnings
 
import PIL.Image
import yaml
 
from labelme import utils
import base64
 
def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()
 
    json_file = args.json_file
    if args.out is None:
        out_dir = osp.basename(json_file).replace('.', '_')
        out_dir = osp.join(osp.dirname(json_file), out_dir)
    else:
        out_dir = args.out
    if not osp.exists(out_dir):
        os.mkdir(out_dir)
 
    count = os.listdir(json_file) 
    for i in range(0, len(count)):
        path = os.path.join(json_file, count[i])
        if os.path.isfile(path):
            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)
            if not osp.exists(out_dir):
                os.mkdir(out_dir)
 
            PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
            #PIL.Image.fromarray(lbl).save(osp.join(out_dir, 'label.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()
复制代码

  Luego haz la conversión por lotes:

python path/cli/json_to_datasetP.py path/JPEGImages
复制代码

  Si se informa un error:

lbl_viz = utils.draw_label(lbl, img, captions)
AttributeError: module 'labelme.utils' has no attribute 'draw_label'
复制代码

  Solución: debe cambiar la versión de labelme, debe reducir la versión de labelme a 3.16.2, el método ingresa al entorno de labelme y pip install labelme==3.16.2puede y puede tener éxito.

3. Otra producción de etiqueta dividida

  Si desea generar etiquetas como esta:

  Imagen original:

  Etiqueta correspondiente (0 para fondo, 1 para círculo):

  Esta etiqueta es una imagen de un solo canal de 8 bits y el método admite hasta 256 tipos.

  El conjunto de datos puede ser producido por el siguiente script:

import cv2
import numpy as np
import json
import os

#    0     1    2    3   
#  backg  Dog  Cat  Fish     
category_types = ["Background", "Dog", "Cat", "Fish"]

#  获取原始图像尺寸
img = cv2.imread("image.bmp")
h, w = img.shape[:2]

for root,dirs,files in os.walk("data/Annotations"): 
    for file in files: 
        mask = np.zeros([h, w, 1], np.uint8)    # 创建一个大小和原图相同的空白图像

        print(file[:-5])

        jsonPath = "data/Annotations/"
        with open(jsonPath + file, "r") as f:
            label = json.load(f)

        shapes = label["shapes"]
        for shape in shapes:
            category = shape["label"]
            points = shape["points"]
            # 填充
            points_array = np.array(points, dtype=np.int32)
            mask = cv2.fillPoly(mask, [points_array], category_types.index(category))

        imgPath = "data/masks/"
        cv2.imwrite(imgPath + file[:-5] + ".png", mask)
复制代码

  Lo anterior es el caso de 4 categorías.

  Has terminado aquí. Lo anterior ha compartido el método de etiquetado de labelme y el procesamiento de datos de segmentación. Espero que compartir pueda ser de ayuda para su aprendizaje.


 【Transmisión de número público】

"[Entrenamiento modelo] labelme etiquetado y procesamiento de datos de segmentación método"


logo_show.gif

Supongo que te gusta

Origin juejin.im/post/7083771288203821063
Recomendado
Clasificación