import os import time import datetime import mmcv import cv2 as cv import json import numpy as np import pycocotools.mask as maskutil import pycocotools.coco as COCO from itertools import groupby from skimage import measure,draw,data from PIL import Image def close_contour(contour): if not np.array_equal(contour[0], contour[-1]): contour = np.vstack((contour, contour[0])) return contour def binary_mask_to_polygon(binary_mask, tolerance=0): """Converts a binary mask to COCO polygon representation Args: binary_mask: a 2D binary numpy array where '1's represent the object tolerance: Maximum distance from original points of polygon to approximated polygonal chain. If tolerance is 0, the original coordinate array is returned. """ polygons = [] # pad mask to close contours of shapes which start and end at an edge padded_binary_mask = np.pad(binary_mask, pad_width=1, mode='constant', constant_values=0) contours = measure.find_contours(padded_binary_mask, 0.5) contours = np.subtract(contours, 1) for contour in contours: contour = close_contour(contour) contour = measure.approximate_polygon(contour, tolerance) if len(contour) < 3: continue contour = np.flip(contour, axis=1) segmentation = contour.ravel().tolist() # after padding and subtracting 1 we may get -0.5 points in our segmentation segmentation = [0 if i < 0 else i for i in segmentation] polygons.append(segmentation) return polygons def binary_mask_to_rle(binary_mask): rle = {'counts': [], 'size': list(binary_mask.shape)} counts = rle.get('counts') for i, (value, elements) in enumerate(groupby(binary_mask.ravel(order='F'))): if i == 0 and value == 1: counts.append(0) counts.append(len(list(elements))) return rle def main2(): seg=np.array([312.29, 562.89, 402.25, 511.49, 400.96, 425.38, 398.39, 372.69, 388.11, 332.85, 318.71, 325.14, 295.58, 305.86, 269.88, 314.86, 258.31, 337.99, 217.19, 321.29, 182.49, 343.13, 141.37, 348.27, 132.37, 358.55, 159.36, 377.83, 116.95, 421.53, 167.07, 499.92, 232.61, 560.32, 300.72, 571.89]) compactedRLE = maskutil.frPyObjects([seg], 768, 768) print(compactedRLE) #compactedRLE=[ # {"size":[768, 768], # "counts": "`eQ66ig02O1O000000000000000000000000001O00000000000000000000000000000000000000000000000000000000O2O0NbZj:" # }] mask = maskutil.decode(compactedRLE) mask=np.reshape(mask,(768,768)) mask[:,:]=mask[:,:]*255 print(mask) #mmcv.imshow(mask) ''' mask=np.array( [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 1, 0], [0, 0, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 0], [0, 0, 1, 0, 0, 0, 1, 0], [0, 0, 1, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0] ] ) print(mask) ''' poly=binary_mask_to_polygon(mask) print(poly) rle=binary_mask_to_rle(mask) print(rle) #mmcv.imshow(area) return 0 def class2color(classes=1,class_id=0): sum = classes*12357 return [sum%(class_id+0),sum%(class_id+1),sum%(class_id+2)] def mainContour(): imgfile = "/home/wit/Pictures/7dd98d1001e9390100d9e95171ec54e737d19681.jpg" img = cv.imread(imgfile) h, w, _ = img.shape gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # Find Contour _, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) print(contours) def main(): testimagepath = "/media/wit/WeiJX/AirbusShip/coco-labels/instances_ships_test2018.json" compressedRLECOCOlabelpath = "/media/wit/WeiJX/workspace/out/maskrcnn.reorg.pkl.json" imageprefix = "/media/wit/WeiJX/AirbusShip/test-images/" startTime = time.time() trthset = json.load(open(testimagepath, 'r')) assert type(trthset) == dict, 'annotation file format {} not supported'.format(type(trthset)) prdcset = json.load(open(compressedRLECOCOlabelpath, 'r')) assert type(prdcset) == dict, 'annotation file format {} not supported'.format(type(prdcset)) print('Done (t={:0.2f}s)'.format(time.time() - startTime)) ann_Y0 = trthset['annotations'] ann_Y1 = prdcset['annotations'] for image in trthset['images']: imagepath = imageprefix+image['file_name'] img = cv.imread(imagepath) src = np.zeros((768,768,3), np.uint8) src[:,:,:]=img[:,:,:] dst = np.zeros((768,768,3), np.uint8) dst[:,:,:]=img[:,:,:] masks = np.zeros((768, 768, 1), np.uint8) masks.fill(0) id0 = image['id'] counts = 0 contours = [] for target in ann_Y0: if target['image_id']==id0: counts += 1 j=0 X=[] Y=[] for seg in target['segmentation'][0]: if j == 0: x = float(seg) X.append(x) else: y = float(seg) Y.append(y) j = 1-j rr, cc = draw.polygon(Y, X) draw.set_color(src, [rr, cc], [0, 0, 255], 0.4) Point = np.zeros((len(Y), 2), dtype='int32') Point [:, 0] = X[:] Point [:, 1] = Y[:] #print(Point) cv.fillPoly(masks, np.array([Point],'int32'), 1) src[:, :, 0] = img[:, :, 0] #* 0.9 + masks[:, :, 0] * 0.1 * 255.0 / counts src[:, :, 1] = img[:, :, 1] #* 0.9 + masks[:, :, 0] * 0.1 * 255.0 / counts src[:, :, 2] = img[:, :, 2] * 0.2 + masks[:, :, 0] * 0.8 * 255.0 / counts mmcv.imshow(src,"Y",1) masks.fill(0) counts = 0 for target in ann_Y1: if target['image_id']==id0: counts += 1 CRLE = target['segmentation'] #print(CRLE) mask = maskutil.decode(CRLE) mask = np.reshape(mask, (img.shape[1], img.shape[0], 1)) masks[:, :] = masks[:, :] + mask[:, :] dst[:, :, 0] = img[:, :, 0] * 0.2 + masks[:, :, 0] * 0.8 * 255.0/counts dst[:, :, 1] = img[:, :, 1] #* 0.5 + masks[:, :, 0] * 0.5 * 255.0/counts dst[:, :, 2] = src[:, :, 2] * 0.9 + masks[:, :, 0] * 0.1 * 255.0/counts mmcv.imshow(dst,"Y'") return 0 if __name__ == '__main__': main()