Detectron: Das RLE- oder Polygon-Format der "Segmentierung" zur Erweiterung auf Coco-Dataset

Erstellt am 2. Feb. 2018  ·  38Kommentare  ·  Quelle: facebookresearch/Detectron

Hallo Detectron,

Kürzlich habe ich versucht, meine benutzerdefinierten Coco-Daten hinzuzufügen, um Detectron auszuführen, und bin auf die folgenden Probleme gestoßen.
(1) "Segmentierung" in Kokosdaten wie unten ,

{"Segmentierung": [[ 499,71, 397,28, ...... 342,71, 172,31 ]] , "Bereich": 43466,12825, "iscrowd": 0, "image_id": 182155, "bbox": [338,89, 51,69, 205,82, 367,61], "category_id": 1, "id": 1248258},

{"Segmentierung": {" Anzahl }, "Fläche": 6197, "Iscrowd": 1, "image_id": 284445, "bbox": [112, 322, 335, 94], "category_id": 1, "id": 9.001002844e + 11},
Das erste Format der "Segmentierung" ist Polygon und das zweite muss für das RLE-Format codiert / decodiert werden.

Die oben genannten Formate können auf Detectron ausgeführt werden.

(2) Ich habe eine neue Kategorie hinzugefügt und ein neues RLE-Format für das Feld "Segmentierung" über die Maske coco api encode () / decode () generiert.
Ich habe solche Daten generiert.

"Segmentierung": [{ "zählt ": "MNG = 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3?"," Größe": [600,1000]}]

Ich habe festgestellt, dass sich die fettgedruckten Zeichen vom ursprünglichen Cson-Segmentierungssegment "Segmentierung" unterscheiden, obwohl es bei der Implementierung von MatterPort in Mask-RCNN ausgeführt werden kann.

Außerdem habe ich versucht, den Code von Detectron an meine Anforderungen anzupassen, was für mich jedoch sehr schwierig ist, da sich viel Code ändern muss.

Können Sie mir einige Vorschläge zum Ausführen meiner benutzerdefinierten Daten geben?

Vielen Dank.

community help wanted

Hilfreichster Kommentar

@ Topcomma
Vielleicht können Sie versuchen, die Maske in Polys umzuwandeln.

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

Alle 38 Kommentare

Ich hatte ein ähnliches Problem: Einige der Funktionen in lib / utils / segms.py erwarten, dass Segmentierungen im "Poly" -Format vorliegen und unterbrochen werden, wenn diese in RLE bereitgestellt werden.
Es ist unpraktisch, scheint aber mit der Spezifikation für nicht überfüllte Regionen übereinzustimmen (iscrowd = 0):

Das Segmentierungsformat hängt davon ab, ob die Instanz ein einzelnes Objekt (iscrowd = 0, in welchem ​​Fall Polygone verwendet werden) oder eine Sammlung von Objekten (iscrowd = 1, in welchem ​​Fall RLE verwendet wird) darstellt.

[1] http://cocodataset.org/#download , Abschnitt "4.1. Anmerkungen zu Objektinstanzen"

Die Problemumgehung bestand für mich darin, in das „Poly“ -Format zu transformieren, bei dem es sich im Wesentlichen um eine Liste von (x, y) Scheitelpunkten handelt.

-Lesha.

Am 2. Februar 2018, um 06:41 Uhr, schrieb Hu Xingui [email protected] :

Hallo Detectron,

Kürzlich habe ich versucht, meine benutzerdefinierten Coco-Daten hinzuzufügen, um Detectron auszuführen, und bin auf die folgenden Probleme gestoßen.
(1) "Segmentierung" in Kokosdaten wie unten ,

{"Segmentierung": [[499,71, 397,28, ...... 342,71, 172,31]], "Bereich": 43466,12825, "iscrowd": 0, "image_id": 182155, "bbox": [338,89, 51,69, 205,82, 367,61], "category_id": 1, "id": 1248258},

{"Segmentierung": {"Anzahl": [66916, 6, 587, ..... 1, 114303], "Größe": [594, 640]}, "Fläche": 6197, "Iscrowd": 1, "image_id": 284445, "bbox": [112, 322, 335, 94], "category_id": 1, "id": 9.001002844e + 11},
Das erste Format der "Segmentierung" ist Polygon und das zweite muss für das RLE-Format codiert / decodiert werden.

Die oben genannten Formate können auf Detectron ausgeführt werden.

(2) Ich habe eine neue Kategorie hinzugefügt und ein neues RLE-Format für das Feld "Segmentierung" über die Maske coco api encode () / decode () generiert.
Ich habe solche Daten generiert.

"Segmentierung": [{ "zählt": "MNG = 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3?", "Größe": [600,1000]}]

Ich habe festgestellt, dass sich die fettgedruckten Zeichen vom ursprünglichen Cson-Segmentierungssegment "Segmentierung" unterscheiden, obwohl es bei der Implementierung von MatterPort in Mask-RCNN ausgeführt werden kann.

Außerdem habe ich versucht, den Code von Detectron an meine Anforderungen anzupassen, was für mich jedoch sehr schwierig ist, da sich viel Code ändern muss.

Können Sie mir einige Vorschläge zum Ausführen meiner benutzerdefinierten Daten geben?

Vielen Dank.

- -
Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

@amokeev , Wie konvertiere

@amokeev , Sind Sie sicher, dass die Zahl in der Segmentierung (x, y) Scheitelpunkte ist? Zum Beispiel "66916", eine große Anzahl! Eine andere, obwohl ich "iscrowd" als "1" für das RLE-Format festgelegt habe, konnte jedoch nicht auf Detectron ausgeführt werden.

Ich interpretiere Poly als eine Liste von Polygonen, die durch die Scheitelpunkte definiert sind, wie [[x1, y1, x2, y2… xN, yN],… [x1, y1, x2, y2… xN, yN]], wobei die Koordinaten von sind der gleiche Maßstab wie das Bild.
Die auf diese Weise codierten Masken werden von CocoAPI [1] korrekt angezeigt.

Möglicherweise möchten Sie jedoch eine „offizielle“ Antwort erhalten.

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

Am 2. Februar 2018, um 09:18 Uhr, schrieb Hu Xingui [email protected] :

@amokeev https://github.com/amokeev , Sind Sie sicher, dass die Zahl in der Segmentierung (x, y) Scheitelpunkte ist? Zum Beispiel "66916", eine große Anzahl! Eine andere, obwohl ich "iscrowd" als "1" für das RLE-Format festgelegt habe, konnte jedoch nicht auf Detectron ausgeführt werden.

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/facebookresearch/Detectron/issues/100#issuecomment-362516928 an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/AFlh63ObnXg- stumm

@ Topcomma
Vielleicht können Sie versuchen, die Maske in Polys umzuwandeln.

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

Vielen Dank für Ihre Vorschläge.
Werde versuchen.

@Sundrops , Als Ihre Methode zum Konvertieren, kann das Ergebnis der "Poly" -Liste erhalten. Vielen Dank! Aber ich weiß immer noch nicht, warum die Koordinate in der COCO-JSON-Datei eine große / kleine Zahl wie "66916" oder "1" ist?

@topcomma COCO-Annotationen haben zwei Arten von Segmentierungsanmerkungen

  1. Polygon (Objektinstanz) [[499.71, 397.28, ...... 342.71, 172.31]] Scheitelpunkte
  2. unkomprimierte RLE (Menge). "Segmentierung": {"Anzahl": [66916, 6, 587, ..... 1, 114303], "Größe": [594, 640]}, 66916 repräsentiert die Nummer des Etiketts 0.

Das Polygon und das unkomprimierte RLE werden mit dem MaskApi in das kompakte RLE-Format konvertiert.
Das kompakte RLE-Format:
Segmentierung ": [{" zählt ": "MNG = 1fb02O1O1O001N2O001O1O0O2O1O1O001N2O001O1O0O2O1O001O1O1O010000O01000O010000O01000O01000O01000O01N2N2M2O2N2N1O2N2O001O10O B000O10O1O001 ^ OQ ^ O9Pb0EQ ^ O; Wb0OO01O1O1O001O1N2N`jT3"," Größe ": [600,1000]}]

@ Sundrops ,
Vielen Dank für Ihre Hilfe.
Meine benutzerdefinierten kokosähnlichen Daten können jetzt auf Detectron trainiert werden.

@topcomma ,
Ich habe das gleiche Problem wie du.
Als Sundrops-Methode kann ich die Datei zum Konvertieren der Maske in Polys nicht finden.
Können Sie mir sagen, welche Datei? Vielen Dank!

@ lg12170226
Sie können auf Coco Stuff (https://github.com/nightrome/cocostuff) Python-Code verweisen, um ihn selbst zu implementieren.
In der Codebasis befindet sich keine Datei mit der zugehörigen Anmerkung.

@topcomma : Ich habe ein Rohbild und N Etikettenbilder. Jedes Etikett wird in einer einzigen Datei gespeichert, so dass ich N für Etikettenbild. Ich möchte Mask RCNN in meinem eigenen Datensatz trainieren, daher muss ich zuerst in das COCO-Format konvertieren. Können Sie den Code für die Konvertierung in den COCO-Stil freigeben? Vielen Dank

Sie fragen sich nur, ob es eine Möglichkeit gibt, komprimierte RLEs in polys / unkomprimierte RLEs umzuwandeln?

@realwecan Nachdem Sie RLE mit pycocotools.mask.decode dekodiert haben, können Sie meine Implementierung überprüfen, um Polygone mit opencv zu generieren:

Coco-Json-Konverter

@hazirbas : danke für deinen code. Warum nicht Davis 2017 verwenden, das Instanzsegmenyation enthält? Könnten wir Ihren Code verwenden, um Davis 2017 in das Coco-Format zu konvertieren und diese maskrcnn-Implementierung zu verwenden?

@ John1231983 Sie müssen das Skript entsprechend ändern, um geteilte Dateien sowie die Datei db_info.yml lesen zu können. Für meine eigene Forschung brauchte ich es für DAVIS 2016.

Eine andere Lösung zum Generieren von Polygonen, jedoch unter Verwendung von skimage anstelle von 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))

Wie würden Sie eine binäre Maske oder codierte RLE in unkomprimierte RLE konvertieren, um sie im Feld "iscrowd: 1" "count" zu verwenden?

@waspinator Segmentierungen mit Ihrem Code unter Verwendung von Skimage unterscheiden sich vom Code von @Sundrops unter Verwendung von cv2.
Sind diese beiden Ergebnisse korrekt und können diese beiden Ergebnisse von Detectron verwendet werden? Bitte geben Sie mir einen Rat, danke. @waspinator @Sundrops

Ergebnisse mit Ihrem Code mit Skimage:

{"Segmentierung": [[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 , 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,00196078431372, 20.0, 252,00196078431372, 21,0, 252,00196078431372, 22,0, 252,00196078431372, 23,0 , 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,00196078431372, 32,0, 252,00196078431372, 33,0, 252,00196078431372, 34,0, 252,00196078431372, 35,0, 252,00196078431372 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,00196078431372, 47,0, 252,00196078431372, 48,0, 252,00196078431372, 49,0, 252,00196078431372, 50,0, 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, 59,0, 252,00196078431372, 60,0, 252,00196078431372, 61,0, 252,00196078431372, 62,0, 252,00196078431372, 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,00196078431372, 71,0, 252,00196078431372, 72,0, 252,00196078431372, 73,0, 252,00196078431372, 74,0, 252,00196078431372, 75,0, 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, 252,00196078431372, 86,0, 252,00196078431372, 87,0, 252,00196078431372, 88,0, 252,00196078431372, 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,0019607813

Ergebnisse mit @ Sundrops- Code unter Verwendung von cv2:

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

@Kongsea Ich habe die @ Sundrops cv2-Implementierung noch nicht getestet, aber die Grundidee sollte dieselbe sein. Sie führen zu unterschiedlichen Ergebnissen, da es unendlich viele Punktmengen gibt, mit denen Sie eine Form beschreiben können. Aber sonst sollten beide funktionieren. Ich hatte cv2 einfach nicht installiert, also habe ich etwas geschrieben, das es nicht erfordert.

@Kongsea @waspinator Ich habe meinen Code getestet. Es klappt.

Vielen Dank, dass Sie @Sundrops @waspinator .
Ich werde es versuchen.

@waspinator Gibt es eine Möglichkeit, den Poly-Vertex der Segmentierung in RLE zu konvertieren? Mein Ziel ist iscrowd = 1

@Sundrops Warum hast du diesen Teil in deinem Code kommentiert?

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

Wir müssen in der Tat einen solchen Fall behandeln, oder?

@ Yuliang-Zou Sie sollten diesen Teil auskommentieren, wenn Konturen für Detectron verwendet werden. Beacase the Detectron behandelt es als Rechteck, wenn len (Kontur) == 4 ist. Ich habe meinen vorherigen Code aktualisiert.

@ Sundrops Danke. Aber wir müssen immer noch mit len(contour)==2 umgehen, oder?

@ Yuliang-Zou Ja, aber der Code if len(contour) > 4: hat len(contour)==2 und len(contour)==4 .

@ Sundrops Ich

Ich habe eine Bibliothek und einen Artikel geschrieben, um beim Erstellen von Datasets im COCO-Stil zu helfen.

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

@Sundrops & @topcomma Ich habe Probleme beim Laden der mit Anmerkungen versehenen Daten in Pycocotole, da meine Anmerkung eine Segmentierung ohne Maske enthält. Haben Sie eine Idee, wie Sie die Annotation ohne Maske in Pycocotools visualisieren können?

@ Sundrops
ann: {
"Segmentierung": [
[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 358,55, 159,36, 377,83, 116,95, 421,53, 167,07, 499,92, 232,61, 560,32, 300,72, 571,89]
],
"area": ​​54652.9556,
"iscrowd": 0,
"image_id": 480023,
"bbox": [116,95, 305,86, 285,3, 266,03],
"category_id": 58,
"id": 86
}}
Wie kann ich die Fläche mit mask.py in coco-api berechnen? Vielen Dank.
Mein Code ist wie folgt, aber Fehler:

Segmentierung = ann ['Segmentierung']
bimask = np.array (Segmentierung, dtype = np.uint8, order = 'F')
print ("bimask:", bimask)
rleObjs = mask.encode (Bimask)
print ("rleObjs:", rleObjs)
area = mask.area (rleObjs)
Drucken ("Bereich:", Bereich)

@manketon
Vielleicht kannst du cv2 ausprobieren, aber ich bin mir nicht sicher, ob es richtig ist. Dies ist nur ein Beispiel für das Entfernen von Konturen aus einem Bild mit Python und 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 Ich habe eine Frage. Wenn meine ursprüngliche Objektmaske große Löcher aufweist und in Polygone konvertiert wird, wie soll ich sie dann korrekt zurückkonvertieren? Die Dekodierungs- und Zusammenführungsfunktionen in der Coco-API behandeln das Loch als Teile des Objekts, sodass die Löcher beim Zurückkonvertieren zu Masken werden. Wie soll ich in diesem Fall vorgehen?

@ wangg12 Soweit ich weiß, hat COCO keine native Methode zum Codieren von Löchern.

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

Hallo @ Sundrops , herzlichen Dank für Ihre Codes. Ich bin ein Anfänger bei Detectron. Ich bin verwirrt, warum die Länge der Kontur (die eine Liste ist) größer als 4 sein sollte, mit anderen Worten, was für das Modell passieren wird, wenn die Länge kleiner als 4 ist. Eine Ihrer Antworten besagte, dass Detectron es als eine behandeln wird Rechteck. Aus meiner Sicht gibt es möglicherweise einige Objekte mit der Form eines Rechtecks, daher denke ich, dass dies in Ordnung ist. Ich frage mich auch, ob Sie die Kontur zweimal in einer Iteration anhängen. Ich denke, der richtige Code sollte sein.

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

Es wird sehr geschätzt, wenn Sie mir einige Vorschläge geben können. Ich danke dir sehr!

@BobZhangHT Ja, die Kontur sollte einmal in einer Iteration
Bei Ihrer ersten Frage, wenn len (ann ['segmentation'] [0]) == 4 ist, geht cocoapi davon aus, dass alle Rechtecke sind.

# 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 Danke für deine Antwort!

Ich interpretiere Poly als eine Liste von Polygonen, die durch die Scheitelpunkte definiert sind, wie [[x1, y1, x2, y2… xN, yN],… [x1, y1, x2, y2… xN, yN]], wobei die Koordinaten von sind der gleiche Maßstab wie das Bild. Die auf diese Weise codierten Masken werden von CocoAPI [1] korrekt angezeigt. Möglicherweise möchten Sie jedoch eine „offizielle“ Antwort erhalten. [1] https://github.com/cocodataset/cocoapi https://github.com/cocodataset/cocoapi

Am 2. Februar 2018, um 09:18 Uhr, Hu Xingui @ . * > schrieb: @amokeev https://github.com/amokeev , Sind Sie sicher, dass die Zahl in der Segmentierung (x, y) Scheitelpunkte ist? Zum Beispiel "66916", eine große Anzahl! Eine andere, obwohl ich "iscrowd" als "1" für das RLE-Format festgelegt habe, konnte jedoch nicht auf Detectron ausgeführt werden. - Sie erhalten dies, weil Sie erwähnt wurden. Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub < # 100 (Kommentar) > an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/AFlh63ObnXg-DcaDKwIi3pB4Ppig464Hks5tQsTkgaJpZM4R2tN3 stumm.

Wie kann ich RLE in Polygone umwandeln, wenn "iscrowd" "1" ist, da der Materieport / MaskRCNN nur mit Polygonen funktioniert? @amokeev. Ich möchte die Materieport-Implementierung von maskRCNN mit einem mit pycococreator erstellten Coco-Dataset verwenden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen