zoukankan      html  css  js  c++  java
  • 绘制COCO数据集结果

    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()
  • 相关阅读:
    关于IIS的IUSER和IWAM帐户
    sql server 提取汉字/数字/字母的方法
    SQlserver创建函数实现只取某个字段的数字部分
    SQL中 EXCEPT、INTERSECT用法
    SQL中EXCEPT和Not in的区别?
    生成本月日历
    SQL打印全年日历
    SQL语句添加删除修改字段[sql server 2000/2005]
    SQL数据是否存在(是否有数据)判断,表,存储过程是否存在
    SQL时间相关
  • 原文地址:https://www.cnblogs.com/aimhabo/p/9949276.html
Copyright © 2011-2022 走看看