Выявление простых фонов вокруг сегментированных экземпляров с помощью OpenCV - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь написать алгоритм классификации, который будет идентифицировать изображения, которые 1) изображают людей на 2) нейтральном / простом фоне. Идея состоит в том, чтобы найти изображения, которые будут легко «редактируемыми» редакторами. Я не пытаюсь фактически выполнить извлечение переднего плана самостоятельно.

Я использую комбинацию обнаружения объектов (в частности, маски R-CNN) и OpenCV. Вот то, что у меня есть.

Вот положительный пример изображений, которые я пытаюсь идентифицировать:

positive example

Маска R-CNN скажет мне, что да, здесь есть человек, и даже предоставит маску для сегментации экземпляра:

masked image

Тогда я смогу взять маскуи манипулировать моим изображением, используя OpenCV:

# just get the first mask
mask = masks[0]
# invert the mask
inverse_mask = np.invert(mask).astype(np.uint8)
# use bitwise_and to extract the background
inverse_masked_data = cv2.bitwise_and(im, im, mask=inverse_mask)

extracted background

На данный момент я должен выполнить какой-то тест на извлеченном фоне. И я открыт для идей! Но моей первой мыслью было попытаться обнаружить любые края только в замаскированной области.

blur = cv2.GaussianBlur(im,(5,5),0)
smooth = cv2.addWeighted(blur,1.5,im,-0.5,0)
edges = cv2.Canny(smooth,100,200)
edges_inverse_masked_data = cv2.bitwise_and(edges, edges, mask=inverse_mask)

mask with edges

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

Кажется ли моя идея обнаружения краев хорошей? Если так, как я могу улучшить свой код, чтобы он работал?

Или есть другие пути, которые я должен изучить?

...