Pārlūkot izejas kodu

Fix utils.labelme_shapes_to_label

- Make 'background' label name have '0' label value
Kentaro Wada 7 gadi atpakaļ
vecāks
revīzija
1e53764922

+ 2 - 1
examples/tutorial/apc2016_obj3_json/info.yaml

@@ -1,5 +1,6 @@
 label_names:
-- background
+- _background_
+- shelf
 - highland_6539_self_stick_notes
 - mead_index_cards
 - kong_air_dog_squeakair_tennis_ball

BIN
examples/tutorial/apc2016_obj3_json/label.png


+ 2 - 1
examples/tutorial/apc2016_obj3_json/label_names.txt

@@ -1,4 +1,5 @@
-background
+_background_
+shelf
 highland_6539_self_stick_notes
 mead_index_cards
 kong_air_dog_squeakair_tennis_ball

BIN
examples/tutorial/apc2016_obj3_json/label_viz.png


+ 16 - 4
labelme/cli/draw_json.py

@@ -16,10 +16,22 @@ def main():
 
     data = json.load(open(json_file))
 
-    img = utils.img_b64_to_array(data['imageData'])
-    lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
-
-    captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
+    img = utils.img_b64_to_arr(data['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
+
+    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)
 
     plt.subplot(121)

+ 24 - 6
labelme/cli/json_to_dataset.py

@@ -32,10 +32,28 @@ def main():
 
     data = json.load(open(json_file))
 
-    img = utils.img_b64_to_array(data['imageData'])
-    lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
-
-    captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
+    img = utils.img_b64_to_arr(data['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)
 
     PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
@@ -43,11 +61,11 @@ def main():
     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 lbl_names:
+        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=lbl_names)
+    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)
 

+ 2 - 2
labelme/utils.py

@@ -136,7 +136,7 @@ def shapes_to_label(img_shape, shapes, label_name_to_value, type='class'):
     cls = np.zeros(img_shape[:2], dtype=np.int32)
     if type == 'instance':
         ins = np.zeros(img_shape[:2], dtype=np.int32)
-        instance_names = ['__background__']
+        instance_names = ['_background_']
     for shape in shapes:
         polygons = shape['points']
         label = shape['label']
@@ -162,7 +162,7 @@ def labelme_shapes_to_label(img_shape, shapes):
     warnings.warn('labelme_shapes_to_label is deprecated, so please use '
                   'shapes_to_label.')
 
-    label_name_to_value = {}
+    label_name_to_value = {'_background_': 0}
     for shape in shapes:
         label_name = shape['label']
         if label_name in label_name_to_value: