diff --git a/docs/annotation/jingling2seg.md b/docs/annotation/jingling2seg.md index de36b5395bc599f83875c6732c1372bd86862c3c..2b9ce772e319bad1a6d8afb8638265a1ccb15b41 100644 --- a/docs/annotation/jingling2seg.md +++ b/docs/annotation/jingling2seg.md @@ -59,16 +59,16 @@ * 经过数据格式转换后的数据集目录结构如下: ``` - my_dataset # 根目录 + my_dataset # 根目录 |-- outputs # 标注工具导出目录 - | |-- annotations # 数据集真值 - | |-- xxx.png # 像素级别的真值信息 - | |... + | |-- annotations # 数据集真值 + | |-- xxx.png # 像素级别的真值信息 + | |... | |-- class_names.txt # 数据集的类别名称 | |-- xxx.json # 标注json文件 |-- xxx.jpg(png or other) # 数据集原图 |-- ... - + ```
@@ -76,16 +76,10 @@

图5 格式转换后的数据集目录的结构示意图

-* 运行转换脚本需要依赖labelme和pillow,如未安装,请先安装。Labelme的具体安装流程请参见[官方安装指南](https://github.com/wkentaro/labelme)。Pillow的安装: - -```shell -pip install pillow -``` - * 运行以下代码,将标注后的数据转换成满足以上格式的数据集: ``` -python pdseg/tools/jingling2seg.py +python pdseg/tools/jingling2seg.py ``` 其中,``为精灵标注产出的json文件所在文件夹的目录,一般为精灵工具使用(3)中`保存位置`下的`outputs`目录。 @@ -101,4 +95,4 @@ python pdseg/tools/jingling2seg.py docs/annotation/jingling_demo/outputs/

图6 格式转换后的数据集各目录的内容示意图

-
+ diff --git a/docs/annotation/labelme2seg.md b/docs/annotation/labelme2seg.md index 235e3c41b6a79ece0b7512955aba04fe06faabe3..885aab66992dfba49f10ddbd11365e75a623ae4e 100644 --- a/docs/annotation/labelme2seg.md +++ b/docs/annotation/labelme2seg.md @@ -53,11 +53,11 @@ LableMe产出的真值文件可参考我们给出的文件夹[docs/annotation/la

图5 LableMe产出的真值文件的示意图

- + **Note:** - + 对于中间有空洞的目标的标注方法:在标注完目标轮廓后,再沿空洞区域边缘画多边形,并将其指定为其他类别,如果是背景则指定为`_background_`。如下: - +

图6 带空洞目标的标注示意图

@@ -69,16 +69,16 @@ LableMe产出的真值文件可参考我们给出的文件夹[docs/annotation/la * 经过数据格式转换后的数据集目录结构如下: ``` - my_dataset # 根目录 - |-- annotations # 数据集真值 - | |-- xxx.png # 像素级别的真值信息 - | |... + my_dataset # 根目录 + |-- annotations # 数据集真值 + | |-- xxx.png # 像素级别的真值信息 + | |... |-- class_names.txt # 数据集的类别名称 |-- xxx.jpg(png or other) # 数据集原图 |-- ... |-- xxx.json # 标注json文件 |-- ... - + ```
@@ -86,16 +86,10 @@ LableMe产出的真值文件可参考我们给出的文件夹[docs/annotation/la

图7 格式转换后的数据集目录的结构示意图

-* 运行转换脚本需要依赖labelme和pillow,如未安装,请先安装。Labelme的具体安装流程请参见[官方安装指南](https://github.com/wkentaro/labelme)。Pillow的安装: - -```shell -pip install pillow -``` - * 运行以下代码,将标注后的数据转换成满足以上格式的数据集: ``` - python pdseg/tools/labelme2seg.py + python pdseg/tools/labelme2seg.py ``` 其中,``为图片以及LabelMe产出的json文件所在文件夹的目录,同时也是转换后的标注集所在文件夹的目录。 @@ -111,4 +105,4 @@ python pdseg/tools/labelme2seg.py docs/annotation/labelme_demo/

图8 格式转换后的数据集各目录的内容示意图

-
+
diff --git a/docs/annotation/labelme_demo/annotations/2011_000025.png b/docs/annotation/labelme_demo/annotations/2011_000025.png deleted file mode 100644 index 0b5a56dda153c92f4411ac7d71665aaf93111e10..0000000000000000000000000000000000000000 Binary files a/docs/annotation/labelme_demo/annotations/2011_000025.png and /dev/null differ diff --git a/pdseg/tools/jingling2seg.py b/pdseg/tools/jingling2seg.py index 3f1e245d19adae9790005ee748a9e76c99cb3009..23839cfb3ef59b3fee3c12103323e7a4cd3c1750 100644 --- a/pdseg/tools/jingling2seg.py +++ b/pdseg/tools/jingling2seg.py @@ -20,12 +20,11 @@ import glob import json import os import os.path as osp - import numpy as np import PIL.Image -import labelme from gray2pseudo_color import get_color_map_list +from labelme2seg import shape2label def parse_args(): @@ -102,10 +101,10 @@ def main(args): img_shape = (data_size['height'], data_size['width'], data_size['depth']) - lbl = labelme.utils.shapes_to_label( - img_shape=img_shape, + lbl = shape2label( + img_size=img_shape, shapes=data_shapes, - label_name_to_value=class_name_to_id, + class_name_mapping=class_name_to_id, ) if osp.splitext(out_png_file)[1] != '.png': diff --git a/pdseg/tools/labelme2seg.py b/pdseg/tools/labelme2seg.py index 9a3ec662f18eb0e49045f2449907ea867cccb816..43fe6286ccf7a024c36774125c2c6076fe4c6fee 100755 --- a/pdseg/tools/labelme2seg.py +++ b/pdseg/tools/labelme2seg.py @@ -17,13 +17,14 @@ from __future__ import print_function import argparse import glob +import math import json import os import os.path as osp - import numpy as np import PIL.Image -import labelme +import PIL.ImageDraw +import cv2 from gray2pseudo_color import get_color_map_list @@ -77,12 +78,12 @@ def main(args): data = json.load(f) img_file = osp.join(osp.dirname(label_file), data['imagePath']) - img = np.asarray(PIL.Image.open(img_file)) + img = np.asarray(cv2.imread(img_file)) - lbl = labelme.utils.shapes_to_label( - img_shape=img.shape, + lbl = shape2label( + img_size=img.shape, shapes=data['shapes'], - label_name_to_value=class_name_to_id, + class_name_mapping=class_name_to_id, ) if osp.splitext(out_png_file)[1] != '.png': @@ -98,6 +99,27 @@ def main(args): 'Please consider using the .npy format.' % out_png_file) +def shape2mask(img_size, points): + label_mask = PIL.Image.fromarray(np.zeros(img_size[:2], dtype=np.uint8)) + image_draw = PIL.ImageDraw.Draw(label_mask) + points_list = [tuple(point) for point in points] + assert len(points_list) > 2, 'Polygon must have points more than 2' + image_draw.polygon(xy=points_list, outline=1, fill=1) + return np.array(label_mask, dtype=bool) + + +def shape2label(img_size, shapes, class_name_mapping): + label = np.zeros(img_size[:2], dtype=np.int32) + for shape in shapes: + points = shape['points'] + class_name = shape['label'] + shape_type = shape.get('shape_type', None) + class_id = class_name_mapping[class_name] + label_mask = shape2mask(img_size[:2], points) + label[label_mask] = class_id + return label + + if __name__ == '__main__': args = parse_args() main(args)