Быстрый детектор скользящего окна с использованием HOG + SVM? - PullRequest
0 голосов
/ 07 февраля 2020

Я обучил три классификатора SVM, используя функции HOG (используя функцию hog, представленную в образе лыжи) для лиц и лиц. Чтобы найти лица на изображениях, я использую скольжение windows разных размеров, и это работает нормально. Но проблема в том, что я зацикливаюсь на windows, используя циклы for, и это слишком медленно (около 2,4 секунд для изображения 320x240). Я хочу довести его до уровня, позволяющего обнаруживать лица в видеопотоке (не менее 10 кадров в секунду). Это возможно? Есть ли способ ускорить его? Пожалуйста, помогите.

Я пытался использовать map (), только с незначительными улучшениями во время выполнения. Вот мой код ...



pixels_per_cell = [(32,32),(16,16),(8,8)]
cells_per_block = [(2,2),(2,2),(2,2)]
clfs = [clf2,clf3,clf4]


def detect_in_window(window):

    img,p1,p2 = window

    x1,y1 = p1
    x2,y2 = p2 

    rect = cv2.resize(img[y1:y2,x1:x2],(64,64))

    flag = True

    for k in range(3):

        hh = feature.hog(rect,orientations=9,pixels_per_cell=pixels_per_cell[k],cells_per_block=cells_per_block[k])
        hh = hh.reshape((1,len(hh)))
        y = clfs[k].predict(hh)[0]

        if (y == 0):
            flag = False
            break 

    if (flag):
        return True
    return False


def get_windows(img):

    #sizes = [32,48,64,80,96,112]
    sizes = [40,56,72,88,104]
    #sizes = [40,56,]
    #scales = [0.5,0.75,1,1.25,1.5,2]

    #sizes = [48,80,112]
    rects = []
    h,w = img.shape
    strideY = strideX = 16

    windows = []

    for s in sizes:
        for i in range(0,h-s,strideY):
            for j in range(0,w-s,strideX):
                #print(i,j,s)
                windows.append((img,(j,i),(j+s,i+s)))

    return windows




img = cv2.imread('test/sultansofswing.jpg',cv2.IMREAD_GRAYSCALE)
h,w = img.shape 
img = cv2.resize(img,(320,240))
#img = cv2.resize(img,(w//2,h//2))

start_time = time.time()
#rects = cascaded_detect(img)
windows = get_windows(img)
print(len(windows))

results = filter(lambda x : x, map(detect_in_window, windows))
print(list(results))

print('Done in',time.time()-start_time)

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