Пограничные рамки для йоло

Я работаю над проектом машинного обучения с помощью YOLO. Я создаю свой собственный набор данных, следуя руководству, которое можно найти здесь (в разделе Как обучать (обнаруживать свои пользовательские объекты)). Для ограничивающих рамок мне нужно знать [x] [y] [width] [height] каждого объекта, на котором я хочу обучать YOLO на данном изображении. Пока я нахожу это вручную, но это отнимает очень много времени. Я надеялся получить помощь в написании сценария, который мог бы рассчитать это за меня. Я знаю, что в opencv есть отличные инструменты для обработки изображений, но я не знаю, с чего начать поиск координат объекта.


person Pjryan    schedule 06.03.2018    source источник


Ответы (3)


На упомянутой вами странице есть раздел, содержащий ссылку на инструмент для работы с этими полями:

Как отмечать ограниченные рамки объектов и создавать файлы аннотаций:

Здесь вы можете найти репозиторий с графическим интерфейсом пользователя для маркировки ограниченных рамок объектов и создания файлов аннотаций для Yolo v2: https://github.com/AlexeyAB/Yolo_mark

person user2518618    schedule 06.03.2018

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

import cv2
import numpy as np 

# read and scale down image
# wget https://bigsnarf.files.wordpress.com/2017/05/hammer.png
img = cv2.pyrDown(cv2.imread('hammer.png', cv2.IMREAD_UNCHANGED))

# threshold image
ret, threshed_img = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),
                127, 255, cv2.THRESH_BINARY)
# find contours and get the external one
image, contours, hier = cv2.findContours(threshed_img, cv2.RETR_TREE,
                cv2.CHAIN_APPROX_SIMPLE)

# with each contour, draw boundingRect in green
# a minAreaRect in red and
# a minEnclosingCircle in blue
for c in contours:
    # get the bounding rect
    x, y, w, h = cv2.boundingRect(c)
    # draw a green rectangle to visualize the bounding rect
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # get the min area rect
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    # convert all coordinates floating point values to int
    box = np.int0(box)
    # draw a red 'nghien' rectangle
    cv2.drawContours(img, [box], 0, (0, 0, 255))

    # finally, get the min enclosing circle
    (x, y), radius = cv2.minEnclosingCircle(c)
    # convert all values to int
    center = (int(x), int(y))
    radius = int(radius)
    # and draw the circle in blue
    img = cv2.circle(img, center, radius, (255, 0, 0), 2)

print(len(contours))
cv2.drawContours(img, contours, -1, (255, 255, 0), 1)

cv2.imshow("contours", img)

ESC = 27
while True:
    keycode = cv2.waitKey()
    if keycode != -1:
        keycode &= 0xFF
        if keycode == ESC:
            break
cv2.destroyAllWindows()
person cuda    schedule 11.01.2019

Вот часть исходного кода Yolo-mark-pwa, как видите, это гораздо более читабельный, чем исходный Yolo_mark (щелкните значок github в правом углу, после чего проверьте src/utils/createExportCord.ts, src/utils/readExportCord.ts). naturalWidth и naturalWidth - размер изображения, height и width - размер синего прямоугольника.

namespace mark {

  export namespace utils {

    export const createExportCord = ({
      name, height, width, top, left, naturalHeight, naturalWidth
    }) => {
      console.log({name, height, width, top, left, naturalHeight, naturalWidth});

      const x = (left + (width/2)) / naturalWidth;
      const y = (top + (height/2)) / naturalHeight;
      const w = width / naturalWidth;
      const h = height / naturalHeight;

      return [name, x, y, w, h].join(' ');
    }

  } // namespace utils

} // namespace mark

введите здесь описание изображения

person Petr Tripolsky    schedule 14.06.2020