Spaces:
Running
on
Zero
Running
on
Zero
import glob | |
import json | |
import os | |
import cv2 | |
import numpy as np | |
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) | |