File size: 2,979 Bytes
09f4ec0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
import numpy as np
import json
import cv2
import glob

def get_mask_from_json(json_path, img):
    try:
        with open(json_path, 'r') as r:
            anno = json.loads(r.read())     
    except:
        with open(json_path, 'r', encoding="cp1252") as r:
            anno = json.loads(r.read())     

    inform = anno['shapes']
    comments = anno['text']
    is_sentence = anno['is_sentence']

    height, width = img.shape[:2]    

    ### sort polies by area
    area_list = []
    valid_poly_list = []
    for i in inform:
        label_id = i['label']
        points = i['points']
        if 'flag' == label_id.lower():  ## meaningless deprecated annotations
            continue     
                        
        tmp_mask = np.zeros((height, width), dtype=np.uint8)
        cv2.polylines(tmp_mask, np.array([points], dtype=np.int32), True, 1, 1)
        cv2.fillPoly(tmp_mask, np.array([points], dtype=np.int32), 1)
        tmp_area = tmp_mask.sum()

        area_list.append(tmp_area)
        valid_poly_list.append(i)

    ### ground-truth mask
    sort_index = np.argsort(area_list)[::-1].astype(np.int32)
    sort_index = list(sort_index)
    sort_inform = []
    for s_idx in sort_index:
        sort_inform.append(valid_poly_list[s_idx])

    mask = np.zeros((height, width), dtype=np.uint8)
    for i in sort_inform:
        label_id = i['label']
        points = i['points']
        
        if 'ignore' in label_id.lower():  
            label_value = 255       # ignored during evaluation
        else:   
            label_value = 1         # target
                        
        cv2.polylines(mask, np.array([points], dtype=np.int32), True, label_value, 1)
        cv2.fillPoly(mask, np.array([points], dtype=np.int32), label_value)

    return mask, comments, is_sentence


if __name__ == '__main__':
    data_dir = './train'
    vis_dir = './vis'

    if not os.path.exists(vis_dir):
        os.makedirs(vis_dir)

    json_path_list = sorted(glob.glob(data_dir + '/*.json'))
    for json_path in json_path_list:
        img_path = json_path.replace('.json', '.jpg')
        img = cv2.imread(img_path)[:,:,::-1]

        # In generated mask, value 1 denotes valid target region, and value 255 stands for region ignored during evaluaiton.   
        mask, comments, is_sentence = get_mask_from_json(json_path, img)   

        ## visualization. Green for target, and red for ignore.
        valid_mask = (mask == 1).astype(np.float32)[:,:,None]
        ignore_mask = (mask == 255).astype(np.float32)[:,:,None]
        vis_img = img * (1 - valid_mask) * (1 - ignore_mask) + ((np.array([0,255,0]) * 0.6 + img * 0.4) * valid_mask + (np.array([255,0,0]) * 0.6 + img * 0.4) * ignore_mask) 
        vis_img = np.concatenate([img, vis_img], 1)
        vis_path = os.path.join(vis_dir, json_path.split('/')[-1].replace('.json', '.jpg'))
        cv2.imwrite(vis_path, vis_img[:,:,::-1])
        print('Visualization has been saved to: ', vis_path)