Сегментация автомобиля windows - PullRequest
1 голос
/ 06 февраля 2020

Я делаю проект, в котором нам нужно сделать сегментацию окна машины изнутри машины. Я работаю с OpenCV , но это не обязательно. (Также python или C ++ в порядке)

До сих пор у меня есть некоторые (не очень хорошие) результаты. Я следовал этой последовательности:

1) Применить cv2.grabCut() в области интереса, где windows может быть.

import cv2
import numpy as np
from matplotlib import pyplot as plt

#Read Image
img = cv2.imread("test1.png",-1)

#Grab Cut iterations
itera = 30

p1 = True
if p1: # This takes quite long so this helps when debugging 
    gb_mask_w1 = np.zeros(img.shape[:2],np.uint8) #output mask
    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)
    rect = (1,12,390,845) #ROI of window 1
    cv2.grabCut(img,gb_mask_w1,rect,bgdModel,fgdModel,itera,cv2.GC_INIT_WITH_RECT)

    # 0-pixels and 2-pixels are put to 0 (ie background) and all 1-pixels and 
    # 3-pixels are put to 1(ie foreground pixels).
    mask_w1 = np.where((gb_mask_w1==3),0,1).astype('uint8') #

    gb_mask_w2 = np.zeros(img.shape[:2],np.uint8)#output mask
    rect_1 = (1500,12,323,820) #ROI of window 2
    cv2.grabCut(img,gb_mask_w2,rect_1,bgdModel,fgdModel,itera,cv2.GC_INIT_WITH_RECT)

    # 0-pixels and 2-pixels are put to 0 (ie background) and all 1-pixels and 
    # 3-pixels are put to 1(ie foreground pixels).
    mask_w2 = np.where((gb_mask_w2==3),0,1).astype('uint8')

2) Эрозия на пикселях переднего плана, чтобы иметь чистые (er) края

# Morphological Operations
kernel = np.ones((10,10),np.uint8)

eroded_w1  = cv2.erode(mask_w1,kernel,iterations = 1)
eroded_w2  = cv2.erode(mask_w2,kernel,iterations = 1)

3) Aplpy cv2.fastNlMeansDenoising(), чтобы избежать артефактов

# DeNoise artifacts
mask_w1_porc = cv2.fastNlMeansDenoising(eroded_w1)
mask_w2_porc = cv2.fastNlMeansDenoising(eroded_w2)

4) Просто примените получившуюся маску и сюжет

img_treated = img.copy()

# Green background
bskg = np.zeros(img.shape[:3],np.uint8)  
bskg[:] = (0, 177, 64)

#Apply mask
img_treated[mask_w1_porc==0] = bskg[mask_w1_porc==0]
img_treated[mask_w2_porc==0] = bskg[mask_w2_porc==0]

#Plot
f,ax=plt.subplots(2,2)
ax[0,0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB ))
ax[0,1].imshow(mask_w1_porc)
ax[1,0].imshow(mask_w2_porc)
ax[1,1].imshow(cv2.cvtColor(img_treated,cv2.COLOR_BGR2RGB ))

Задачи :

  • Бывает, что фактически обнаруживается только часть окна.

  • Может случиться так, что части автомобиля будут обнаружены как окно

  • Очень медленно (~ 20 секунд на окно)

Что-то работает?

  • По крайней мере, важная часть windows всегда обнаруживается

  • Это устойчиво к окклюзии

Что я хочу?

  • Мне интересно, что я могу добавить к этому конвейеру, чтобы улучшить обнаружение окон => фильтр, чтобы упростить работу cv2.grabCut() ?

  • Может быть там есть пост т путь?

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

Я добавляю график, чтобы вы могли видеть результаты (Исходное изображение, маски и вывод): Output from all that code

[Редактировать]:

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

Image with occlusion

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...