Thuật toán detect object-dlib

object-detection

#1

mọi người cho mình hỏi chút ạ. theo mình đọc qua về face recognize sử dụng thư viện dlib. ở ở phần detetc đối tượng có cách là sử dụng HOG+SVM và sử dụng cửa sổ trượt. nhưng tốc độ khi sd thư viện Dlib vẫn khá nhanh. nhưng khi mình code lại cũng thuật toán đấy. sử dụng của sổ trượt và thay đổi tỉ lệ ảnh đầu vào nhưng kết quả lại khá chậm. Nguyên cho quét cửa sổ và hiển thị lên các ô quét chưa cho vào hàm predic kết quả cũng chỉ đc 0.8 fps. Mọi người có kinh nghiệm giải thích giúp mình với ạ. và cho mình hỏi có cách nào hay thuật toán nào để detect nhanh hơn khi vẫn sd HOG+SVM k ạ. MÌnh cảm ơn


Hỏi đáp về opencv và dlib
#2

Bạn nói chung chung thế biết nó chậm đoạn nào. Phải đo runtime và fps của từng đoạn. Do perform của bạn thôi. Mình cũng dùng svm + hog + pca và vẫn realtime trên mobile. Nếu k tự code tối ưu được thì nên dùng thư viện. Hog chú ý tự implement phải dùng intergral image nếu không sẽ rất chậm


#4

dạ e bị chậm chỗ dịch cửa sổ đấy ạ. nguyên dịch cửa sổ thôi e đo tốc độ cũng chỉ đc 0.8 fps ạ.


#5

Sao dịch cửa sổ xong, bươc tiếp theo lại cho vào hàm predict nhỉ? Bạn cho đoạn code bạn slide window lên đây


#8

thuật toán của em là em sẽ dùng cửa sổ trượt qua ảnh. với mỗi vị trí của cửa sổ e sẽ roi ra 1 ảnh tại vị trí cửa sổ đó và cho vào hàm predic. mỗi vị trí của cửa sổ sẽ cho vào dự đoán 1 lần. nhưng do chậm quá nên e mới test thử thì thấy chậm là do thuật toán trượt cửa sổ. e cho 2 lần trượt cửa sổ qua toàn bộ ảnh với lần thứ nhất tỉ lệ ảnh giữ nguyên, lần 2 giảm kích thước đi 1.5 lần (chỉ cho trượt cửa sổ qua và hiển thị cửa sổ lên để quan sát nó dịch như thế nào thôi ạ) thì tốc độ đo được cũng chỉ còn 0.8 fps. đây là code đoạn dịch cửa sổ của e ạ. ở đây chỉ gửi đc file ảnh, a cho e xin mail e gửi qua cho dễ ạ.


#9

Với source code các bạn cố gắng paste trực tiếp vào đây theo format của markdown. Như thế dễ nhìn hơn ảnh.


#10
  • Bạn copy code lên đây. Rồi format ở nút này image

  • Không biết các bước xử lý của bạn ntn, nhưng cắt được window xong cho vào predict nghe sai sai. Predict là bước xử lý thuộc về model, mà model thì không có chứa các bước tiền xử lý. Bạn để nguyên ảnh rồi predict thì nghĩa là không qua bước tiền xử lý và trích chọn đặc trưng sao?

  • Bạn kiểm tra lại hàm resize. Mình dùng Opencv C/C++ trên Android NDK cũng chậm FPS do hàm resize. Còn mấy cái bước tính toán tỉ lệ window và cắt roi không xử lý chậm đến mức thế đâu. Mình đã ở issue ở repo opencv trên github nhưng không được rep mà bị cho vào invalid question :joy:


#12

Sao bình luận của bạn cứ báo xóa sau 24h thế?


#14

Vì bạn ấy chủ động xóa bạn ạ.


#15

Diễn đàn không có chức năng xóa bài, Bạn mở post xong, bình luận xong xóa đi. Sau này những ng khác vào xem không biết đầu đuôi ntn. Còn mỗi bình luận của mình kiểu như độc thoại vậy :V


#16

code e đây ạ. e sau khi roi ảnh e tính HOG và reshape rồi mới đưa vào predic ạ. và a cho e hỏi luôn là các bước để làm detect SVM+HOG+PCA của a như nào k ạ. để e tìm hiểu theo với, e mới tìm hiểu sang mảng này mong a giúp đỡ ạ.

    import pickle
    import cv2
    #from sklearn.svm import LinearSVC
    import numpy as np
    import os
    import time
    import imutils

    filename = 'finalized_model2.sav'
    clf = pickle.load(open(filename, 'rb'))
    cap = cv2.VideoCapture(0)

    def pyramid(image, scale=1.5, minSize=(30, 30)):
	    # yield the original image
        yield image

	# keep looping over the pyramid
    while True:
        # compute the new dimensions of the image and resize it
	w = int(image.shape[1] / scale)
	image = imutils.resize(image, width=w)

	# if the resized image does not meet the supplied minimum
	# size, then stop constructing the pyramid
	if image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:
		break
		# yield the next image in the pyramid
	yield image

    def sliding_window(image, stepSize, windowSize):
	# slide a window across the image
        for y in range(0, image.shape[0], stepSize):
	    for x in range(0, image.shape[1], stepSize):
		# yield the current window
		yield (x, y, image[y:y + windowSize[1], x:x + windowSize[0]])
    def get_hog() :
        winSize = (64,128)
        blockSize = (16,16)
        blockStride = (8,8)
        cellSize = (8,8)
        nbins = 9
        derivAperture = 1
        winSigma = -1.
        histogramNormType = 0
        L2HysThreshold = 0.2
        gammaCorrection = 1
        nlevels = 64
        signedGradient = True   
        hog=cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,
        nbins,derivAperture,winSigma,histogramNormType,L2HysThreshold,
        gammaCorrection,nlevels, signedGradient)
        return hog


    (winW, winH) = (50, 50)
    while (1):
        #start_time=time.time()
	#image=cv2.imread("/home/nguyenson/Desktop/sliding-window/images/a.jpg")
	ret, image = cap.read()
    # loop over the image pyramid
	for resized in pyramid(image, scale=1.5):
	# loop over the sliding window for each layer of the pyramid
	    for (x, y, window) in sliding_window(resized, stepSize=32, windowSize=(winW, 
            winH)):
		# if the window does not meet our desired window size, ignore it
		if window.shape[0] != winH or window.shape[1] != winW:
			continue
		clone = resized.copy()
		if x + winW > resized.shape[0] or y + winH > resized.shape[1]:
			continue
		roi_img=clone[x:x+winW,y:y+winH]
		roi_img=cv2.resize(roi_img,(64,128))
		roi_img=get_hog().compute(roi_img)
		roi_img=roi_img.reshape(1,3780)
		pred = clf.predict(roi_img)[0]
		if pred==1:
			print("face")
		k = cv2.waitKey(5)
		if k == ord('q'):
			break
    cv2.destroyAllWindows()

#17

Mình dùng đặc trưng hog rồi giảm chiều với pca sau đó huấn luyện bằng svm. Việc dùng thuật toán nào để trích chọn đặc trưng, thuật toán nào đề huấn luyện phụ thuộc vào dữ liệu , đối tượng. Bài toán mình làm không phải nhận dạng khuôn mặt.

Với vấn đề của bạn, check lại hàm resize rồi tính tiếp. Mà bạn cắt được roi xong đã đưa vào tính hog chưa? Bạn thử slide window xong vẽ rect lên ảnh, rồi cho hiển thị. Xem fps được bao nhiêu? Phải cô lập từng phần đề xác định nó chậm chỗ nào (Nhớ là chỉ duyệt, tính toán cỡ roi và vẽ rồi hiển thị luôn, không cho qua hog)


#18

Do em chưa sửa xong đoạn code theo format đã bấm gửi nên e xóa đi ạ :)))


#19

e thử k cho qua HOG như a nói thì được 0.8fps đấy ạ. em sẽ check lại hàm resize xem sao Thế lúc detect a đã làm thì a cũng dùng trượt cửa sổ hay dùng gì ạ?


#20

Vậy kiểm tra lại hàm resize đi, thử resize cái ảnh trước (bằng phần mềm chỉnh sửa ảnh nào đó) sao cho các tham số phù hợp với hàm slide window. Xong comment khúc resize lại, với không tính hog. Tạm thời xác định roi xong vẽ rect lên ảnh rồi cho hiển thị và đo fps + runtime xem có khác biệt không. Theo mình thấy hàm resize nếu thực hiện trên ảnh to thì sẽ giảm fps rất nhiều, còn thực hiện trên ảnh bé thì đỡ hơn. Resize trong opencv các kiểu sau

  • INTER_NEAREST - a nearest-neighbor interpolation
  • INTER_LINEAR - a bilinear interpolation (used by default)
  • INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to theINTER_NEAREST method.
  • INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
  • INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood

Trong đó mình thử thấy INTER_LANCZOS4 nhanh nhất rồi đến INTER_CUBIC với ảnh cỡ x.y (x và y < 100)

Detect obj có nhiều cách mà, đối tượng mình làm đơn giản nên mình detect bằng xử lý ảnh thuần chứ không dùng ml

Khả năng cao fps chậm vì hàm resize và có thể do hàm tính hog bạn implement theo cách được trình bày trên lý thuyết. (tính đi tính lại feature vector cho các block theo cách thông thường)


#21

vâng ạ. e cảm ơn a !


#22

Thế bạn đã thử chưa, xác định được vấn đề ở đâu chưa?


#23
winSize = (64,128) 

blockSize = (16,16)

 blockStride = (8,8) 

cellSize = (8,8) 

nbins = 9 

derivAperture = 1

 winSigma = -1.

 histogramNormType = 0

 L2HysThreshold = 0.2

 gammaCorrection = 1 

nlevels = 64 

signedGradient = True

Có vẻ như bạn đang dùng các tham số hog mặc định, tham số này cho bài toán detect người. Bạn áp dụng với face mà để winsize (64,128) là không ổn rồi. Bạn đọc lại về hog để hiểu và biết cách tùy chỉnh các tham số này


#24

vâng ạ. e xem lại vấn đề bị chậm vẫn là do thuật toán dịch cửa sổ k phải do hàm resize ạ. còn hàm HOG đúng là e dùng tham số mặc định :)))


#25

Bạn nghiên cứu dùng hàm as_strided của numpy để viết lại hàm sliding window mình nghĩ có thể sẽ cải thiện được tốc độ. Mà ảnh input đầu vào chỗ hàm sliding window của bạn kích thước bao nhiêu thế?