Нужно ли маркировать каждый экземпляр объекта при аннотировании его для Yolo или распознавания изображений в целом? - PullRequest
0 голосов
/ 12 апреля 2020

Мне нужно подготовить набор данных для сложенных книг. Скажем, на картинке 5 книг, но я создаю ограничивающие рамки только для 4 из них. Повлияет ли это на производительность моей модели каким-либо образом?

Трудно создать ограничивающие рамки для сложенных книг, когда они расположены под странным углом, и я, возможно, пропустил некоторые книги при рисовании прямоугольников, потому что Я отвлекся на количество строк. Кроме того, тот факт, что ограничивающие рамки являются совершенно плоскими по осям, а когда книги наклонены, ограничивающий прямоугольник для одной книги может занять до нескольких книг. Это плохая практика? это нормально, если я только что оставил некоторые книги без коробки?

Наконец, если вы тренируете свою модель только на книге по отдельности (не в стопке), смогут ли они быть обнаружены, когда они будут сложены и наполовину больше книги покрыты другими книгами?

1 Ответ

0 голосов
/ 13 апреля 2020

Несмотря на то, что ограничивающие рамки могут перекрываться, если это только те книги, которые вы хотите обнаружить, вы должны аннотировать и отображать все книги, поскольку это может помочь повысить надежность вашего набора данных, особенно , если вы используете небольшой количество изображений. Тем не менее, вы всегда можете попробовать и раскрасить sh соответствующие пиксели на вашем изображении, что делается в маске RCNN репо .

enter image description here

Ниже приведена функция, которую маска Mask RCNN использует в файле визуализации.


def display_instances(image, boxes, masks, class_ids, class_names,
                      scores=None, title="",
                      figsize=(16, 16), ax=None,
                      show_mask=True, show_bbox=True,
                      colors=None, captions=None):
    """
    boxes: [num_instance, (y1, x1, y2, x2, class_id)] in image coordinates.
    masks: [height, width, num_instances]
    class_ids: [num_instances]
    class_names: list of class names of the dataset
    scores: (optional) confidence scores for each box
    title: (optional) Figure title
    show_mask, show_bbox: To show masks and bounding boxes or not
    figsize: (optional) the size of the image
    colors: (optional) An array or colors to use with each object
    captions: (optional) A list of strings to use as captions for each object
    """
    # Number of instances
    N = boxes.shape[0]
    if not N:
        print("\n*** No instances to display *** \n")
    else:
        assert boxes.shape[0] == masks.shape[-1] == class_ids.shape[0]

    # If no axis is passed, create one and automatically call show()
    auto_show = False
    if not ax:
        _, ax = plt.subplots(1, figsize=figsize)
        auto_show = True

    # Generate random colors
    colors = colors or random_colors(N)

    # Show area outside image boundaries.
    height, width = image.shape[:2]
    ax.set_ylim(height + 10, -10)
    ax.set_xlim(-10, width + 10)
    ax.axis('off')
    ax.set_title(title)

    masked_image = image.astype(np.uint32).copy()
    for i in range(N):
        color = colors[i]

        # Bounding box
        if not np.any(boxes[i]):
            # Skip this instance. Has no bbox. Likely lost in image cropping.
            continue
        y1, x1, y2, x2 = boxes[i]
        if show_bbox:
            p = patches.Rectangle((x1, y1), x2 - x1, y2 - y1, linewidth=2,
                                alpha=0.7, linestyle="dashed",
                                edgecolor=color, facecolor='none')
            ax.add_patch(p)

        # Label
        if not captions:
            class_id = class_ids[i]
            score = scores[i] if scores is not None else None
            label = class_names[class_id]
            caption = "{} {:.3f}".format(label, score) if score else label
        else:
            caption = captions[i]
        ax.text(x1, y1 + 8, caption,
                color='w', size=11, backgroundcolor="none")

        # Mask
        mask = masks[:, :, i]
        if show_mask:
            masked_image = apply_mask(masked_image, mask, color)

        # Mask Polygon
        # Pad to ensure proper polygons for masks that touch image edges.
        padded_mask = np.zeros(
            (mask.shape[0] + 2, mask.shape[1] + 2), dtype=np.uint8)
        padded_mask[1:-1, 1:-1] = mask
        contours = find_contours(padded_mask, 0.5)
        for verts in contours:
            # Subtract the padding and flip (y, x) to (x, y)
            verts = np.fliplr(verts) - 1
            p = Polygon(verts, facecolor="none", edgecolor=color)
            ax.add_patch(p)
    ax.imshow(masked_image.astype(np.uint8))
    if auto_show:
        plt.show()

Я не знаю, какую сеть вы используете, что может помочь определить, насколько хорошо вы можете обнаружить книга, которая повернута или плоская, если вы тренируетесь только в верхней части книги.

...