Detectron: coco ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ํ™•์žฅํ•˜๊ธฐ์œ„ํ•œ "๋ถ„ํ• "์˜ RLE ๋˜๋Š” ๋‹ค๊ฐํ˜• ํ˜•์‹

์— ๋งŒ๋“  2018๋…„ 02์›” 02์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebookresearch/Detectron

์•ˆ๋…• ๋””ํ… ํŠธ๋ก ,

์ตœ๊ทผ์— Detectron์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • coco ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
(1) ์•„๋ž˜์™€ ๊ฐ™์€ coco ๋ฐ์ดํ„ฐ์˜ "๋ถ„ํ• ",

{ "์„ธ๊ทธ๋จผํŠธ": [[ 499.71, 397.28, ...... 342.71, 172.31 ]] , "area": โ€‹โ€‹43466.12825, "iscrowd": 0, "image_id": 182155, "bbox": [338.89, 51.69, 205.82, 367.61], "category_id": 1, "id": 1248258},

{ "segmentation": { "counts": [66916, 6, 587, ..... 1, 114303], "size": [594, 640] }, "area": โ€‹โ€‹6197, "iscrowd": 1, "image_id": 284445, "bbox": [112, 322, 335, 94], "category_id": 1, "id": 9.001002844e + 11},
'์„ธ๊ทธ๋จผํŠธ'์˜ ์ฒซ ๋ฒˆ์งธ ํ˜•์‹์€ ๋‹ค๊ฐํ˜•์ด๊ณ  ๋‘ ๋ฒˆ์งธ ํ˜•์‹์€ RLE ํ˜•์‹์„ ์ธ์ฝ”๋”ฉ / ๋””์ฝ”๋”ฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ํ˜•์‹์€ Detectron์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(2) ์ƒˆ๋กœ์šด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  coco api encode () / decode () ๋งˆ์Šคํฌ๋ฅผ ํ†ตํ•ด "๋ถ„ํ• "ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด RLE ํ˜•์‹์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

"๋ถ„ํ• ": [{ "์นด์šดํŠธ" "= MNG 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3?", "ํฌ๊ธฐ": 600,1000]}]

๊ตต๊ฒŒ ํ‘œ์‹œ๋œ ๋ฌธ์ž๋Š” ์›๋ž˜ coco "์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜"json ํ˜•์‹๊ณผ ๋‹ค๋ฅด์ง€๋งŒ, MatterPort์˜ Mask-RCNN ๊ตฌํ˜„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‚ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ Detectron์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋ฏ€๋กœ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ํ•ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ.

community help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ฟก๋ฟก
๋งˆ์Šคํฌ๋ฅผ ํด๋ฆฌ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

labels_info = []
for mask in mask_list:
    # opencv 3.2
    mask_new, contours, hierarchy = cv2.findContours((mask).astype(np.uint8), cv2.RETR_TREE,
                                                        cv2.CHAIN_APPROX_SIMPLE)
    # before opencv 3.2
    # contours, hierarchy = cv2.findContours((mask).astype(np.uint8), cv2.RETR_TREE,
    #                                                    cv2.CHAIN_APPROX_SIMPLE)
    segmentation = []

    for contour in contours:
        contour = contour.flatten().tolist()
        # segmentation.append(contour)
        if len(contour) > 4:
            segmentation.append(contour)
    if len(segmentation) == 0:
        continue
    # get area, bbox, category_id and so on
    labels_info.append(
        {
            "segmentation": segmentation,  # poly
            "area": area,  # segmentation area
            "iscrowd": 0,
            "image_id": index,
            "bbox": [x1, y1, bbox_w, bbox_h],
            "category_id": category_id,
            "id": label_id
        },
    )

๋ชจ๋“  38 ๋Œ“๊ธ€

๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. lib / utils / segms.py์˜ ์ผ๋ถ€ ํ•จ์ˆ˜๋Š” ์„ธ๊ทธ๋จผํŠธ๊ฐ€ "ํด๋ฆฌ"ํ˜•์‹์œผ๋กœ๋˜์–ด ์žˆ๊ณ  RLE์—์„œ ์ œ๊ณต ๋  ๋•Œ ์ค‘๋‹จ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋ถˆํŽธํ•˜์ง€๋งŒ ํ˜ผ์žกํ•˜์ง€ ์•Š์€ ์ง€์—ญ (iscrowd = 0) ์‚ฌ์–‘์— ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ธ๋ถ„ํ™” ํ˜•์‹์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹จ์ผ ๊ฐœ์ฒด (ํด๋ฆฌ๊ณค์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ iscrowd = 0) ๋˜๋Š” ๊ฐœ์ฒด ์ปฌ๋ ‰์…˜ (RLE์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ iscrowd = 1)์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

[1] http://cocodataset.org/#download , ์„น์…˜ "4.1. ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์ฃผ์„"

๋‚˜๋ฅผ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ณธ์งˆ์ ์œผ๋กœ (x, y) ๊ผญ์ง“์  ๋ชฉ๋ก ์ธ "poly"ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

-๋ ˆ์ƒค.

2018 ๋…„ 2 ์›” 2 ์ผ 06:41์— Hu Xingui [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…• ๋””ํ… ํŠธ๋ก ,

์ตœ๊ทผ์— Detectron์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • coco ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
(1) ์•„๋ž˜์™€ ๊ฐ™์€ coco ๋ฐ์ดํ„ฐ์˜ "๋ถ„ํ• ",

{ "์„ธ๊ทธ๋จผํŠธ": [[499.71, 397.28, ...... 342.71, 172.31]], "area": โ€‹โ€‹43466.12825, "iscrowd": 0, "image_id": 182155, "bbox": [338.89, 51.69, 205.82, 367.61], "category_id": 1, "id": 1248258},

{ "segmentation": { "counts": [66916, 6, 587, ..... 1, 114303], "size": [594, 640]}, "area": โ€‹โ€‹6197, "iscrowd": 1, "image_id": 284445, "bbox": [112, 322, 335, 94], "category_id": 1, "id": 9.001002844e + 11},
'์„ธ๊ทธ๋จผํŠธ'์˜ ์ฒซ ๋ฒˆ์งธ ํ˜•์‹์€ ๋‹ค๊ฐํ˜•์ด๊ณ  ๋‘ ๋ฒˆ์งธ ํ˜•์‹์€ RLE ํ˜•์‹์„ ์ธ์ฝ”๋”ฉ / ๋””์ฝ”๋”ฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ํ˜•์‹์€ Detectron์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(2) ์ƒˆ๋กœ์šด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  coco api encode () / decode () ๋งˆ์Šคํฌ๋ฅผ ํ†ตํ•ด "๋ถ„ํ• "ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด RLE ํ˜•์‹์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

"๋ถ„ํ• ": [{ "์นด์šดํŠธ" "= MNG 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3?", "ํฌ๊ธฐ": 600,1000]}]

๊ตต๊ฒŒ ํ‘œ์‹œ๋œ ๋ฌธ์ž๋Š” ์›๋ž˜ coco "์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜"json ํ˜•์‹๊ณผ ๋‹ค๋ฅด์ง€๋งŒ, MatterPort์˜ Mask-RCNN ๊ตฌํ˜„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‚ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ Detectron์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋ฏ€๋กœ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ํ•ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ.

โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

@amokeev , "RLE"๋ฅผ "poly"ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ

@amokeev , ์„ธ๋ถ„ํ™”์˜ ์ˆซ์ž๊ฐ€ (x, y) ๊ผญ์ง€์ ์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด "66916", ๋งŽ์€ ์ˆ˜! RLE ํ˜•์‹์— ๋Œ€ํ•ด "iscrowd"๋ฅผ "1"๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ Detectron์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ €๋Š” poly๋ฅผ [[x1, y1, x2, y2โ€ฆ xN, yN],โ€ฆ [x1, y1, x2, y2โ€ฆ xN, yN]]๊ณผ ๊ฐ™์ด ๊ผญ์ง“์ ์œผ๋กœ ์ •์˜ ๋œ ๋‹ค๊ฐํ˜• ๋ชฉ๋ก์œผ๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ขŒํ‘œ๋Š” ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ธ์ฝ”๋”ฉ ๋œ ๋งˆ์Šคํฌ๋Š” CocoAPI [1]์— ์˜ํ•ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ "๊ณต์‹์ ์ธ"๋‹ต๋ณ€์„ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[1] https://github.com/cocodataset/cocoapi https://github.com/cocodataset/cocoapi

2018 ๋…„ 2 ์›” 2 ์ผ 09:18์— Hu Xingui [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@amokeev https://github.com/amokeev , ์„ธ๋ถ„ํ™”์˜ ์ˆซ์ž๊ฐ€ (x, y) ๊ผญ์ง“์ ์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด "66916", ๋งŽ์€ ์ˆ˜! RLE ํ˜•์‹์— ๋Œ€ํ•ด "iscrowd"๋ฅผ "1"๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ Detectron์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/facebookresearch/Detectron/issues/100#issuecomment-362516928 ์—์„œ ๋ณด๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/AFlh63ObnXg- ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก
๋งˆ์Šคํฌ๋ฅผ ํด๋ฆฌ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

labels_info = []
for mask in mask_list:
    # opencv 3.2
    mask_new, contours, hierarchy = cv2.findContours((mask).astype(np.uint8), cv2.RETR_TREE,
                                                        cv2.CHAIN_APPROX_SIMPLE)
    # before opencv 3.2
    # contours, hierarchy = cv2.findContours((mask).astype(np.uint8), cv2.RETR_TREE,
    #                                                    cv2.CHAIN_APPROX_SIMPLE)
    segmentation = []

    for contour in contours:
        contour = contour.flatten().tolist()
        # segmentation.append(contour)
        if len(contour) > 4:
            segmentation.append(contour)
    if len(segmentation) == 0:
        continue
    # get area, bbox, category_id and so on
    labels_info.append(
        {
            "segmentation": segmentation,  # poly
            "area": area,  # segmentation area
            "iscrowd": 0,
            "image_id": index,
            "bbox": [x1, y1, bbox_w, bbox_h],
            "category_id": category_id,
            "id": label_id
        },
    )

@amokeev ,
๋ฟก๋ฟก

์ œ์•ˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์‹œ๋„ ํ•  ๊ฒƒ์ด๋‹ค.

@Sundrops , ๋ณ€ํ™˜ ๋ฐฉ๋ฒ•์œผ๋กœ "poly"๋ชฉ๋ก์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฐ๋ฐ๋„ COCO json ํŒŒ์ผ์˜ ์ขŒํ‘œ๊ฐ€ "66916"๋˜๋Š” "1"๊ณผ ๊ฐ™์ด ํฌ๊ณ  ์ž‘์€ ์ˆซ์ž ์ธ ์ด์œ ๋ฅผ ์•„์ง ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@topcomma COCO ์ฃผ์„์—๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์„ธ๋ถ„ํ™” ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹ค๊ฐํ˜• (๊ฐ์ฒด ์ธ์Šคํ„ด์Šค) [[499.71, 397.28, ...... 342.71, 172.31]] ๊ผญ์ง€์ 
  2. ์••์ถ•๋˜์ง€ ์•Š์€ RLE (๊ตฐ์ค‘). "segmentation": { "counts": [66916, 6, 587, ..... 1, 114303], "size": [594, 640]}, 66916์€ ๋ ˆ์ด๋ธ” 0์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋‹ค๊ฐํ˜• ๋ฐ ์••์ถ•๋˜์ง€ ์•Š์€ RLE๋Š” MaskApi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ• RLE ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
์ปดํŒฉํŠธ RLE ํ˜•์‹ :
๋ถ„ํ•  ": [{"์นด์šดํŠธ ""= MNG 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3 ","ํฌ๊ธฐ ": [600,1000]}]

@Sundrops ,
ํฐ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ Detectron์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • Coco์™€ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@topcomma ,
๋‚˜๋Š” u์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Sundrops์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งˆ์Šคํฌ๋ฅผ ํด๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ํŒŒ์ผ์ธ์ง€ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@ lg12170226 ๏ผŒ
coco stuff (https://github.com/nightrome/cocostuff) ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋“œ๋ฒ ์ด์Šค์—๋Š” ๊ด€๋ จ ์ฃผ์„์˜ ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.

@topcomma : ์›๋ณธ ์ด๋ฏธ์ง€์™€ N ๋ ˆ์ด๋ธ” ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ ˆ์ด๋ธ”์€ ๋‹จ์ผ ํŒŒ์ผ์— ์ €์žฅ๋˜๋ฏ€๋กœ ๋ ˆ์ด๋ธ”์— ๋Œ€ํ•œ N ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ Mask RCNN์„ ํ›ˆ๋ จ์‹œํ‚ค๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € COCO ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ COCO ์Šคํƒ€์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ

์••์ถ• ๋œ RLE๋ฅผ ํด๋ฆฌ / ์••์ถ•๋˜์ง€ ์•Š์€ RLE๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?

pycocotools.mask.decode๋กœ RLE๋ฅผ ๋””์ฝ”๋”ฉ ํ•œ ํ›„ @realwecan์—์„œ opencv๋กœ ๋‹ค๊ฐํ˜•์„ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌํ˜„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

coco-json-converter

@hazirbas : ์ฝ”๋“œ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๋ถ„ํ• ์ด ํฌํ•จ ๋œ Davis 2017์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด maskrcnn ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Davis 2017์„ coco ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@ John1231983 ๋ถ„ํ•  ํŒŒ์ผ๊ณผ db_info.yml ํŒŒ์ผ์„ ์ฝ๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์ ˆํžˆ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์—ฐ๊ตฌ๋ฅผ ์œ„ํ•ด DAVIS 2016์— ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๊ฐํ˜•์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• skimage ๋Œ€์‹  opencv .

import json
import numpy as np
from pycocotools import mask
from skimage import measure

ground_truth_binary_mask = np.array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  1,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0]], dtype=np.uint8)

fortran_ground_truth_binary_mask = np.asfortranarray(ground_truth_binary_mask)
encoded_ground_truth = mask.encode(fortran_ground_truth_binary_mask)
ground_truth_area = mask.area(encoded_ground_truth)
ground_truth_bounding_box = mask.toBbox(encoded_ground_truth)
contours = measure.find_contours(ground_truth_binary_mask, 0.5)

annotation = {
        "segmentation": [],
        "area": ground_truth_area.tolist(),
        "iscrowd": 0,
        "image_id": 123,
        "bbox": ground_truth_bounding_box.tolist(),
        "category_id": 1,
        "id": 1
    }

for contour in contours:
    contour = np.flip(contour, axis=1)
    segmentation = contour.ravel().tolist()
    annotation["segmentation"].append(segmentation)

print(json.dumps(annotation, indent=4))

๋ฐ”์ด๋„ˆ๋ฆฌ ๋งˆ์Šคํฌ ๋˜๋Š” ์ธ์ฝ”๋”ฉ ๋œ RLE๋ฅผ "iscrowd : 1" "counts"ํ•„๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์••์ถ•๋˜์ง€ ์•Š์€ RLE๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

skimage๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋กœ @waspinator ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ์€ @Sundrops ์˜ ์ฝ”๋“œ์™€
์ด ๋‘ ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ ์ •ํ™•ํ•˜๊ณ  Detectron์—์„œ์ด ๋‘ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ๊ฒŒ ์กฐ์–ธ์„ ํ•ด์ฃผ์„ธ์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

skimage์™€ ํ•จ๊ป˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ :

{ "๋ถ„ํ• "[0.0, 252.00196078431372, 1.0 252.00196078431372, 2.0 252.00196078431372, 3.0 252.00196078431372, 4.0 252.00196078431372, 5.0 252.00196078431372, 6.0 252.00196078431372, 7.0 252.00196078431372, 8.0 252.00196078431372, 9.0 252.00196078431372, 10.0 252.00196078431372 , 11.0, 252.00196078431372, 12.0, 252.00196078431372, 13.0, 252.00196078431372, 14.0, 252.00196078431372, 15.0, 252.00196078431372, 16.0, 252.00196078431372, 17.0, 252.00196078431372, 18.0, 252.00372, 252.00372. , 252.00196078431372, 24.0, 252.00196078431372, 25.0, 252.00196078431372, 26.0, 252.00196078431372, 27.0, 252.00196078431372, 28.0, 252.00196078431372, 29.0, 252.00196078431372, 30.0, 252.001960372, 30.0, 2960,372, 396031784,372,960,31.0, 3,960,372,3,2,960,31.0, 3,960,372,2,960,3 , 36.0, 252.00196078431372, 37.0, 252.00196078431372, 38. 0, 252.00196078431372, 39.0, 252.00196078431372, 40.0, 252.00196078431372, 41.0, 252.00196078431372, 42.0, 252.00196078431372, 43.0, 252.00196078431372, 44.0, 252.00196078431372, 45.0, 252.001960784,960, 2.00,372,496031372,52.00,960,372, 4,253,784,2,960,0,372, 4,253,2,960784,3 252.00196078431372, 51.0, 252.00196078431372, 52.0, 252.00196078431372, 53.0, 252.00196078431372, 54.0, 252.00196078431372, 55.0, 252.00196078431372, 56.0, 252.00196078431372, 57.0, 252.00196078431372, 52.00372784,96078431372, 52.00372, 69.01960372. 63.0, 252.00196078431372, 64.0, 252.00196078431372, 65.0, 252.00196078431372, 66.0, 252.00196078431372, 67.0, 252.00196078431372, 68.0, 252.00196078431372, 69.0, 252.00196078431372, 70.0, 252.001960372,2.00,784,960372, 7,0,372,0,0,784,3,2960,372,3,2,0,0,784,31,372,252.001,960, 72.00,78431,372, 2 252.00196078431372, 76.0, 252.00196 078431372, 77.0, 252.00196078431372, 78.0, 252.00196078431372, 79.0, 252.00196078431372, 80.0, 252.00196078431372, 81.0, 252.00196078431372, 82.0, 252.00196078431372, 83.0, 252.00196078431372, 82.00372. 89.0, 252.00196078431372, 90.0, 252.00196078431372, 91.0, 252.00196078431372, 92.0, 252.00196078431372, 93.0, 252.00196078431372, 93.00196078431372, 252.0, 94.0, 251.00196078431372, 95.0, 251.00196078431372, 96.0 ...

cv2 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”

[94, 252, 93, 253, 0, 253, 0, 286, 188, 286, 188, 269, 187, 268, 187, 252]

๋‚ด๊ฐ€ CV2 ๊ตฌํ˜„ @Sundrops์„ ํ…Œ์ŠคํŠธํ•˜์ง€๋งŒ,ํ•˜์ง€ ์•Š์€ @Kongsea ๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋Š” ๋™์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ชจ์–‘์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์  ์„ธํŠธ๊ฐ€ ๋ฌดํ•œํžˆ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‘˜ ๋‹ค ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. cv2๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@Kongsea @waspinator ๋‚ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€์žˆ๋‹ค.

@Sundrops @waspinator ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์‹œ๋„ ํ•  ๊ฒƒ์ด๋‹ค.

@waspinator ๋ถ„ํ•  ํด๋ฆฌ ๋ฒ„ํ…์Šค๋ฅผ RLE๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ชฉํ‘œ๋Š” iscrowd = 1์ž…๋‹ˆ๋‹ค.

@Sundrops ์ฝ”๋“œ์—์„œ์ด ๋ถ€๋ถ„์„ ์ฃผ์„์œผ๋กœ

# if len(contour) > 4:
    #     segmentation.append(contour)
# if len(segmentation) == 0:
#     continue

์šฐ๋ฆฌ๋Š” ์ •๋ง๋กœ ๊ทธ๋Ÿฌํ•œ ์‚ฌ๊ฑด์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@ Yuliang-Zou Detectron์— ์œค๊ณฝ์„ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด ๋ถ€๋ถ„์˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Detectron์€ len (contour) == 4 ์ผ ๋•Œ ์‚ฌ๊ฐํ˜•์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

@ Sundrops ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ len(contour)==2 ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@ Yuliang-Zou ์˜ˆ,ํ•˜์ง€๋งŒ if len(contour) > 4: ์ฝ”๋“œ์—๋Š” len(contour)==2 ๋ฐ len(contour)==4 ํ•ธ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@Sundrops , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ €๋Š” COCO ์Šคํƒ€์ผ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

https://patrickwasp.com/create-your-own-coco-style-dataset/

@Sundrops & @topcomma ๋‚ด ์ฃผ์„์ด ๋งˆ์Šคํฌ์—†์ด ์„ธ๋ถ„ํ™”๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๋ฐ์ดํ„ฐ๋ฅผ pycocotols์—๋กœ๋“œํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. pycocotools์—์„œ ๋งˆ์Šคํฌ์—†์ด ์ฃผ์„์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฟก๋ฟก
ann : {
"๋ถ„ํ• ": [
[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, 217.19, 321.29, 217.19, 321.29 , 358.55, 159.36, 377.83, 116.95, 421.53, 167.07, 499.92, 232.61, 560.32, 300.72, 571.89]
],
"๋ฉด์ ": 54652.9556,
"iscrowd": 0,
"image_id": 480023,
"bbox": [116.95, 305.86, 285.3, 266.03],
"category_id": 58,
"id": 86
}
coco-api์—์„œ mask.py๋กœ ๋ฉด์ ์„ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ง€๋งŒ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์„ธ๋ถ„ํ™” = ann [ '์„ธ๋ถ„ํ™”']
bimask = np.array (segmentation, dtype = np.uint8, order = 'F')
print ( "bimask :", bimask)
rleObjs = mask.encode (bimask)
print ( "rleObjs :", rleObjs)
์˜์—ญ = mask.area (rleObjs)
print ( "area :", ๋ฉด์ )

๋ฟก๋ฟก
cv2๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์˜ณ์€์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Python ๋ฐ OpenCV๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€์—์„œ ์œค๊ณฝ์„  ์ œ๊ฑฐ ์˜ ์˜ˆ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

def is_contour_bad(c):
    # approximate the contour
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    # return True if it is not a rectangle
    return not len(approx) == 4
image = cv2.imread('xx.jpg')
contours = ann['segmentation']
mask = np.ones(image.shape[:2], dtype="uint8") * 255
# loop over the contours
for c in contours:
    # if the contour is not a rectangle, draw it on the mask
    if is_contour_bad(c):
        cv2.drawContours(mask, [c], -1, 0, -1)
area = (mask==0).sum()

@Sundrops @waspinator ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ๊ฐœ์ฒด ๋งˆ์Šคํฌ์— ํฐ ๊ตฌ๋ฉ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค๊ฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ๋‹ค์‹œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ€ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? coco API์˜ ๋””์ฝ”๋”ฉ ๋ฐ ๋ณ‘ํ•ฉ ๊ธฐ๋Šฅ์€ ๊ตฌ๋ฉ์„ ๊ฐ์ฒด์˜ ์ผ๋ถ€๋กœ ์ทจ๊ธ‰ํ•˜๋ฏ€๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•˜๋ฉด ๊ตฌ๋ฉ์ด ๋งˆ์Šคํฌ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@ wangg12 ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ COCO์—๋Š” ๊ตฌ๋ฉ์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

for contour in contours:
        contour = contour.flatten().tolist()
        segmentation.append(contour)
        if len(contour) > 4:
            segmentation.append(contour)

์•ˆ๋…•ํ•˜์„ธ์š” @Sundrops , ๊ท€ํ•˜์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €๋Š” Detectron์˜ ์ดˆ๋ณด์ž์ž…๋‹ˆ๋‹ค. ์ปจํˆฌ์–ด์˜ ๊ธธ์ด (๋ชฉ๋ก)๊ฐ€ 4๋ณด๋‹ค ์ปค์•ผํ•˜๋Š” ์ด์œ , ์ฆ‰ ๊ธธ์ด๊ฐ€ 4๋ณด๋‹ค ์ž‘์„ ๋•Œ ๋ชจ๋ธ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๋ณ€ ์ค‘ ํ•˜๋‚˜๊ฐ€ Detectron์ด ์ง์‚ฌ๊ฐํ˜•. ์ œ ์ƒ๊ฐ์—๋Š” ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ ๋ฌผ์ฒด๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•œ ๋ฒˆ์— ๋‘ ๋ฒˆ ์œค๊ณฝ์„ ์„ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

for contour in contours:
        contour = contour.flatten().tolist()
        if len(contour) > 4:
            segmentation.append(contour)

์ €์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ํ•ด์ฃผ์‹œ๋ฉด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!

@BobZhangHT ์˜ˆ, ํ•œ ๋ฒˆ์— ํ•œ ๋ฒˆ ์œค๊ณฝ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์—์„œ len (ann [ 'segmentation'] [0]) == 4์ด๋ฉด cocoapi๋Š” ๋ชจ๋‘ ์ง์‚ฌ๊ฐํ˜•์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

# cocoapi/PythonAPI/pycocotools/coco.py
def annToRLE(self, ann):
    t = self.imgs[ann['image_id']]
    h, w = t['height'], t['width']
    segm = ann['segmentation']
    if type(segm) == list:
        rles = maskUtils.frPyObjects(segm, h, w) 
        rle = maskUtils.merge(rles)
   ......
# cocoapi/PythonAPI/pycocotools/_mask.pyx
def frPyObjects(pyobj, h, w):
    # encode rle from a list of python objects
    if type(pyobj) == np.ndarray:
        objs = frBbox(pyobj, h, w)
    elif type(pyobj) == list and len(pyobj[0]) == 4:
        objs = frBbox(pyobj, h, w)
    elif type(pyobj) == list and len(pyobj[0]) > 4:
        objs = frPoly(pyobj, h, w)
   ......

@Sundrops ๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ €๋Š” poly๋ฅผ [[x1, y1, x2, y2โ€ฆ xN, yN],โ€ฆ [x1, y1, x2, y2โ€ฆ xN, yN]]๊ณผ ๊ฐ™์ด ๊ผญ์ง“์ ์œผ๋กœ ์ •์˜ ๋œ ๋‹ค๊ฐํ˜• ๋ชฉ๋ก์œผ๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ขŒํ‘œ๋Š” ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ธ์ฝ”๋”ฉ ๋œ ๋งˆ์Šคํฌ๋Š” CocoAPI [1]์— ์˜ํ•ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜์ง€๋งŒ "๊ณต์‹์ ์ธ"๋‹ต๋ณ€์„ ์–ป๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. [1] https://github.com/cocodataset/cocoapi https://github.com/cocodataset/cocoapi
โ€ฆ
2018 ๋…„ 2 ์›” 2 ์ผ 09:18์— Hu Xingui @ . * > ์ผ์Šต๋‹ˆ๋‹ค : @amokeev https://github.com/amokeev , ์„ธ๋ถ„ํ™”์˜ ์ˆซ์ž๊ฐ€ (x, y) ๊ผญ์ง€์ ์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด "66916", ๋งŽ์€ ์ˆ˜! RLE ํ˜•์‹์— ๋Œ€ํ•ด "iscrowd"๋ฅผ "1"๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ Detectron์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. โ€” ๊ท€ํ•˜๊ฐ€ ๋ฉ˜์…˜ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ํšŒ์‹ ํ•˜๊ฑฐ๋‚˜ GitHub < # 100 (comment) >์—์„œ ๋ณด๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/AFlh63ObnXg-DcaDKwIi3pB4Ppig464Hks5tQsTkgaJpZM4R2tN3 ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐ

matterport / MaskRCNN์ด ๋‹ค๊ฐํ˜•์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "iscrowd"๊ฐ€ "1"์ผ ๋•Œ RLE๋ฅผ ๋‹ค๊ฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? @amokeev. pycococreator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  coco ๋ฐ์ดํ„ฐ ์„ธํŠธ์™€ ํ•จ๊ป˜ maskRCNN์˜ matterport ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰