From 7bcd8b1d40a1da666d479d23e63a6168e8dfcab1 Mon Sep 17 00:00:00 2001 From: LutaoChu <30695251+LutaoChu@users.noreply.github.com> Date: Tue, 26 May 2020 10:20:29 +0800 Subject: [PATCH] fix label tool bugs (#266) * modify label tool --- docs/annotation/jingling2seg.md | 20 ++++------- docs/annotation/labelme2seg.md | 26 ++++++-------- .../labelme_demo/annotations/2011_000025.png | Bin 2713 -> 0 bytes pdseg/tools/jingling2seg.py | 9 +++-- pdseg/tools/labelme2seg.py | 34 ++++++++++++++---- 5 files changed, 49 insertions(+), 40 deletions(-) delete mode 100644 docs/annotation/labelme_demo/annotations/2011_000025.png diff --git a/docs/annotation/jingling2seg.md b/docs/annotation/jingling2seg.md index de36b539..2b9ce772 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 235e3c41..885aab66 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 GIT binary patch literal 0 HcmV?d00001 literal 2713 zcmai!3sh9c8OO&%)c8QODhd=Fqt?_HQGtzwg;95x;0q%tXR*lmVxv|~o5hvY!1zQ( zK}|IgWu0Z~qv9J=1wW0C<4uQ)0DZN!)|DUqq~k>p=i8 z01yF;00amF1QEhSl32K7VoQX@uE-DpgaAVTF~Ar=h%iJDBTR@zl3OEEfk*}7OD=&s zS0suoB&0$oL_*;byEeqil_KIIC?W`m1cU+t3892w05|}c z08Rh~gad*J;e&f0+<2L07ir(f*IkAK!7MfkRVDB1dIX( z38REzfH**yAWjelj01)Vx^i{#H-rAfI@Kwr z=q(?5KKtFw@+;|sqjtXj)xR4dd)doUS8r|~GxBkA^H4dfrsMLyt;6=^sm|5TO*46? zZ3%dB?i)MMW)pSUDHb|CIjB7-E`I^knROY4xyMLo*d2z4M%S&Zz>x9~KUDQvP$pI#+ zy3@_)0OBb)%}& z=R6r~%nMPr54Fxtwwl7a`sZ~kzN?qx)pB1~zs6^+^ev3*X8!K3{aasqZ%g{98e(Y< zGoEUYJ4S0%MOy=!HOBlrxh+!@S+vR0G~M|3C2~s-t)XarKvS&o>}2_IrZ&BZSQ`Ie zEa)cJm+NX*c@^IT#*4L5Mj47*?O9v{jn~GQ4=-|FJX2i%ZBg~{(NjwE0!reKWtW~g z-}pGMI!U`{w<&yee*B2Zl~3l`0#5~%o$l9=y|J$1R{t*|N^Ob1?C>ieP`_JlYQKKd zcE2#t*${E|p}l@tX8ZN%QR7Z-m+$@XC_FDUH#aWz{Nt~k{=RK{y*>@i4Y%4Ne%aK} zR6T#TChg~e>J!x-w=^%5;B6n= zZs`(N?5Xl8ZV4YzG-ZrAcU5-DokusfNilnMB`fADx2H;p-A#}FA^XkNl^EwLIYrqe zeHyRjJMUylC&Kd9dfF0GX7zohEqQWu*s>*adYJC%clB4>SGa=N&vI+8C9I6qszL&H z6*V6|5|WYn<0rdLNr7QUT1WozdBN>nhU!DdK|(GEWZAMvE0{uV6MC`SebOmK5mJ; z>sJN7g@!Kb>p{kf-684eueXEDRO_ysq=NZ=;v9}q6}?orJ?&< zhU*5bt_j=_oObuT(k~Dz1%|e4>58RgiEh8S%8)BAjiEL#b;DTQ{*tV diff --git a/pdseg/tools/jingling2seg.py b/pdseg/tools/jingling2seg.py index 3f1e245d..23839cfb 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 9a3ec662..43fe6286 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) -- GitLab