Я обучил три классификатора 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)