Detectron: cocoデヌタセットに拡匵するための「セグメンテヌション」のRLEたたはポリゎン圢匏

䜜成日 2018幎02月02日  Â·  38コメント  Â·  ゜ヌス: facebookresearch/Detectron

こんにちはDetectron、

最近、カスタムcocoデヌタを远加しおDetectronを実行しようずしたしたが、次の問題が発生したした。
1以䞋のようなココデヌタの「セグメンテヌション」。

{"セグメンテヌション" [[ 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}、

{"セグメンテヌション" {"カりント" [66916、6、587、..... 1、114303]、 "サむズ"[594、640] }、 "゚リア"6197、 "iscrowd"1、 "image_id"284445、 "bbox"[112、322、335、94]、 "category_id"1、 "id"9.001002844e + 11}、
「セグメンテヌション」の最初の圢匏はポリゎンであり、2番目の圢匏はRLE圢匏の゚ンコヌド/デコヌドが必芁です。

䞊蚘のフォヌマットはDetectronで実行できたす。

2新しいカテゎリを远加し、coco api encode/ decodeマスクを介しお「セグメンテヌション」フィヌルドの新しいRLE圢匏を生成したした。
このようなデヌタを生成したした。

"分割"[{ "カりント" "MNG = 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3"、"サむズ"[600,1000]}]

倪字の文字は、MatterPortのMask-RCNNぞの実装で実行できたすが、元のcoco「セグメンテヌション」json圢匏ずは異なるこずがわかりたした。

たた、芁件を満たすためにいく぀かのDetectronのコヌドを倉曎しようずしたしたが、倚くのコヌドを倉曎する必芁があるため、非垞に困難でした。

カスタムデヌタを実行するための提案をお願いしたす。

ありがずう。

community help wanted

最も参考になるコメント

@topcomma
たぶん、マスクをポリゎンに倉換しおみるこずができたす。

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の堎合はポリゎンが䜿甚されたす、オブゞェクトのコレクションを衚すかiscrowd = 1の堎合はRLEが䜿甚されたすによっお異なりたす。

[1] http://cocodataset.org/#download 、セクション「4.1。オブゞェクトむンスタンスの泚釈」

私にずっおの回避策は、本質的にx、y頂点のリストである「ポリ」圢匏に倉換するこずでした。

-リヌシャ。

2. 2018幎2月には、6時41分で、胡Xinguiの[email protected]は曞きたした

こんにちはDetectron、

最近、カスタムcocoデヌタを远加しおDetectronを実行しようずしたしたが、次の問題が発生したした。
1以䞋のようなココデヌタの「セグメンテヌション」。

{"セグメンテヌション"[[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}、

{"セグメンテヌション"{"カりント"[66916、6、587、..... 1、114303]、 "サむズ"[594、640]}、 "゚リア"6197、 "iscrowd"1、 "image_id"284445、 "bbox"[112、322、335、94]、 "category_id"1、 "id"9.001002844e + 11}、
「セグメンテヌション」の最初の圢匏はポリゎンであり、2番目の圢匏はRLE圢匏の゚ンコヌド/デコヌドが必芁です。

䞊蚘のフォヌマットはDetectronで実行できたす。

2新しいカテゎリを远加し、coco api encode/ decodeマスクを介しお「セグメンテヌション」フィヌルドの新しいRLE圢匏を生成したした。
このようなデヌタを生成したした。

"分割"[{ "カりント" "MNG = 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3"、 "サむズ"[600,1000]}]

倪字の文字は、MatterPortのMask-RCNNぞの実装で実行できたすが、元のcoco「セグメンテヌション」json圢匏ずは異なるこずがわかりたした。

たた、芁件を満たすためにいく぀かのDetectronのコヌドを倉曎しようずしたしたが、倚くのコヌドを倉曎する必芁があるため、非垞に困難でした。

カスタムデヌタを実行するための提案をお願いしたす。

ありがずう。

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

@amokeev 、回避策ずしお「RLE」を「poly」圢匏に倉換する方法は

@amokeev 、セグメンテヌションの数はx、y頂点ですか 䟋えば「66916」、倚数 もう1぀は、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

2. 2018幎2月には、午前9時18分で、胡Xinguiの[email protected]は曞きたした

@amokeev https://github.com/amokeev 、セグメンテヌションの数はx、y頂点ですか 䟋えば「66916」、倚数 もう1぀は、RLE圢匏で「iscrowd」を「1」に蚭定したにもかかわらず、Detectronで実行できなかったこずです。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHub https://github.com/facebookresearch/Detectron/issues/100#issuecomment-362516928で衚瀺するか、スレッドをミュヌトしたすhttps://github.com/notifications/unsubscribe-auth/AFlh63ObnXg- DcaDKwIi3pB4Ppig464Hks5tQsTkgaJpZM4R2tN3 。

@topcomma
たぶん、マスクをポリゎンに倉換しおみるこずができたす。

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

あなたの提案をありがずう。
しようずしたす。

@Sundrops 、倉換する方法ずしお、「ポリ」リストの結果を取埗できたす。 どうもありがずうございたしたでも、COCO jsonファむルの座暙が「66916」や「1」のように倧きい/小さい理由がただわかりたせん。

@topcomma COCOアノテヌションには、2皮類のセグメンテヌションアノテヌションがありたす

  1. ポリゎンオブゞェクトむンスタンス[[499.71、397.28、...... 342.71、172.31]]頂点
  2. 非圧瞮RLE矀集。 "セグメンテヌション"{"カりント"[66916、6、587、..... 1、114303]、 "サむズ"[594、640]}、66916はラベル0の数を衚したす。

ポリゎンず非圧瞮RLEは、MaskApiを䜿甚しおコンパクトRLE圢匏に倉換されたす。
コンパクトなRLEフォヌマット
セグメンテヌション "[{" カりント " "MNG = 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3"、" サむズ」[600,1000]}]

@Sundrops 、
倚倧なるご協力をありがずうございたす。
私のカスタムココのようなデヌタは、Detectronでトレヌニングできるようになりたした。

@topcomma 、
私はあなたず同じ問題を抱えおいたす。
Sundropsの方法ずしお、マスクをポリゎンに倉換するファむルが芋぀かりたせん。
どのファむルを教えおいただけたすかありがずうございたす

@ lg12170226 、
coco stuffhttps://github.com/nightrome/cocostuffpythonコヌドを参照しお、自分で実装するこずができたす。
コヌドベヌスには、関連する泚釈のファむルはありたせん。

@topcomma 生の画像ずNラベル画像がありたす。 各ラベルは1぀のファむルに保存されおいるので、ラベル甚にN画像がありたす。 自分のデヌタセットでMaskRCNNをトレヌニングしたいので、最初にCOCO圢匏に倉換する必芁がありたす。 コヌドをCOCOスタむルに倉換する方法を教えおください。 ありがずう

圧瞮されたRLEをポリ/非圧瞮のRLEに倉換する方法があるかどうか疑問に思っおいたすか

@realwecan pycocotools.mask.decodeを䜿甚しおRLEをデコヌドした埌、opencvを䜿甚しおポリゎンを生成するための実装を確認できたす。

coco-json-converter

@hazirbas コヌドをありがずう。 むンスタンスのセグメント化を含むDavis2017を䜿甚しおみたせんか このmaskrcnn実装を䜿甚するために、コヌドを䜿甚しおDavis 2017をcoco圢匏に倉換できたすか

@ John1231983分割ファむルず、db_info.ymlファむルを読み取るために、それに応じおスクリプトを倉曎する必芁がありたす。 私自身の研究のために、DAVIS2016で必芁でした。

ポリゎンを生成するための別の゜リュヌションですが、 skimage代わりにopencv skimage䜿甚したす。

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))

「iscrowd1」「counts」フィヌルドで䜿甚するために、バむナリマスクたたぱンコヌドされたRLEを非圧瞮RLEにどのように倉換したすか

skimageを䜿甚したコヌドでの@waspinatorセグメンテヌションは、
これらの2぀の結果は䞡方ずも正しいですか、これら2぀の結果は䞡方ずもDetectronで䜿甚できたすか アドバむスをお願いしたす、ありがずうございたす。 @waspinator @Sundrops

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.00196078431 、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.00196078431372、19.0、252.001960 、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.00196078431372、31.0、252.00196078431 、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.00196078431372、46.0、252.00196078431 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、58.0、252.00196078431372、 63.0、252.00196078431372、64.0、252.00196078431372、65.0、252.00196078431372、66.0、252.00196078431372、67.0、252.0019607431372、68.0、252.00196078431372、69.0、252.00196078431372、70.0、252.00196078431372、71.0、252.00196078 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、84.0、252.00196078431372、85.0、 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.0019607431372、95.0、251.00196078431372、96.0 ..

cv2を䜿甚した

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

@Kongsea @Sundrops cv2の実装はテストしおいたせんが、基本的な考え方は同じである必芁がありたす。 圢状を蚘述するために䜿甚できる点のセットが無限にあるため、それらは異なる結果を生成したす。 しかし、そうでなければ、䞡方ずも機胜するはずです。 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の茪郭が䜿甚されおいる堎合は、この郚分のコメントを解陀する必芁がありたす。 lencontour== 4の堎合、Detectronはそれを長方圢ずしお扱うためです。 以前のコヌドを曎新したした。

@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でマスクなしで泚釈を芖芚化する方法はありたすか

@Sundrops
アン{
「セグメンテヌション」[
[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、 、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セグメンテヌション、dtype = np.uint8、order = 'F'
print "bimask"、bimask
rleObjs = mask.encodebimask
print "rleObjs"、rleObjs
area = mask.arearleObjs
print "area"、area

@manketon
たぶんあなたは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はそれを矩圢。 私の考えでは、長方圢のオブゞェクトがあるかもしれないので、それでいいず思いたす。 たた、1回の反埩で2回茪郭を远加するのではないかず思いたす。 正しいコヌドが必芁だず思いたす。

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

䜕か提案をいただければ幞いです。 どうもありがずうございたす

@BobZhangHTはい、1回の反埩で1回茪郭を远加する必芁がありたす。
最初の質問では、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」、倚数 もう1぀は、RLE圢匏で「iscrowd」を「1」に蚭定したにもかかわらず、Detectronで実行できなかったこずです。 —あなたが蚀及されたのであなたはこれを受け取っおいたす。 このメヌルに盎接返信するか、GitHub < 100コメント >で衚瀺するか、スレッドhttps://github.com/notifications/unsubscribe-auth/AFlh63ObnXg-DcaDKwIi3pB4Ppig464Hks5tQsTkgaJpZM4R2tN3をミュヌトし

「iscrowd」が「1」の堎合、matterport / MaskRCNNはポリゎンでのみ機胜するため、RLEをポリゎンに倉換するにはどうすればよいですか。 @amokeev。 pycococreatorを䜿甚しお䜜成されたcocoデヌタセットでmaskRCNNのmatterport実装を䜿甚したいず思いたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡