图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)