Я пытаюсь написать алгоритм классификации, который будет идентифицировать изображения, которые 1) изображают людей на 2) нейтральном / простом фоне. Идея состоит в том, чтобы найти изображения, которые будут легко «редактируемыми» редакторами. Я не пытаюсь фактически выполнить извлечение переднего плана самостоятельно.
Я использую комбинацию обнаружения объектов (в частности, маски R-CNN) и OpenCV. Вот то, что у меня есть.
Вот положительный пример изображений, которые я пытаюсь идентифицировать:
Маска R-CNN скажет мне, что да, здесь есть человек, и даже предоставит маску для сегментации экземпляра:
Тогда я смогу взять маскуи манипулировать моим изображением, используя 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)
На данный момент я должен выполнить какой-то тест на извлеченном фоне. И я открыт для идей! Но моей первой мыслью было попытаться обнаружить любые края только в замаскированной области.
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)
Это кажется многообещающим, но я получаю края вокруг своего экземпляра. Таким образом, любой тест по «краям» будет неудачным, так как есть некоторых ребер.
Кажется ли моя идея обнаружения краев хорошей? Если так, как я могу улучшить свой код, чтобы он работал?
Или есть другие пути, которые я должен изучить?