HOG ๋์คํฌ๋ฆฝํฐ
HOG(Histogram of Oriented Gradient)๋ ๋ณดํ์ ๊ฒ์ถ์ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง ํน์ง ๋์คํฌ๋ฆฝํฐ ์ค ํ๋๋ก ์ฃ์ง์ ๊ธฐ์ธ๊ธฐ ๋ฐฉํฅ๊ณผ ๊ท๋ชจ๋ฅผ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ํ๋ธ ๊ฒ.
SIFT, SURF, ORB ๋ฑ๊ณผ ๊ฐ์ ํน์ง ์คํฌ๋ฆฝํฐ๋ค์ ํน์ง์ ํ๋ํ๋์ ๋ํด์ ์์ ํ๊ณ ์์ด์ ๊ฐ์ฒด์ ์ง์ญ์ ํน์ฑ์ ํํํ๋ ๋ฐ๋ ๋ฐ์ด๋์ง๋ง, ์ ์ฒด์ ์ธ ๋ชจ์์ ํน์ง์ผ๋ก ํํํ๊ธฐ ์ด๋ ต๋ค.
๊ทธ์ ๋ฐ์์. HOG๋ ๋์ ๊ฐ์ฒด์ ์ํ๋ ์์ธ๊ฐ ์ฝ๊ฐ ๋ค๋ฅด ๋๋ผ๋ ๊ทธ ํน์ง์ ์ผ๋ฐํํด์ ๊ฐ์ ๊ฐ์ฒด๋ก ์ธ์ํ๋ ๊ฒ์ด ํน์ง์ด๋ค.
์์ ์์
-
์ ์ฒด ์ด๋ฏธ์ง์์ ์ธ์ํ๊ณ ์ ํ๋ ์์ญ์ ์๋ผ๋ด์ผํ๋ค. ์ด๊ฒ์ ์๋(window)๋ผ๊ณ ํจ.
-
์๋ผ๋ธ ์์ญ์ ์๋ฒจ ํํฐ๋ฅผ ์ด์ฉํด์ ์ฃ์ง์ ๊ธฐ์ธ๊ธฐ gx, gy๋ฅผ ๊ตฌํ๊ณ , ๊ธฐ์ธ๊ธฐ์ ๋ฐฉํฅ๊ณผ ํฌ๊ธฐ ๊ณ์ฐ
img = cv2.imread('img.png')
img = np.flaot(img)
gx = cv.Sobel(img, cv.CV_32F, 1, 0)
gy = cv.Sobel(img, cv.CV_32F, 0, 1)
magnitude, angle = cv.cartToPolar(gx, gy)
HOG API
-
descriptor = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins): HOG ํฌ์ค๋ฆฝํฐ ์ถ์ถ๊ธฐ ์์ฑ
winSize : ์๋ ํฌ๊ธฐ, HOG ์ถ์ถ ์์ญ
blockSize: ๋ธ๋ก ํฌ๊ธฐ, ์ ๊ทํ ์์ญ
blockStride : ์ ๊ทํ ๋ธ๋ก ๊ฒธ์นจ ํฌ๊ธฐ
cellSize : ์
ํฌ๊ธฐ, ํ์คํ ๊ทธ๋จ ๊ณ์ฐ ์์ญ
nbins : ํ์คํ ๊ทธ๋จ ๊ณ๊ธ ์
descriptor : HOG ํน์ง ๋์คํฌ๋ฆฝํฐ ์ถ์ถ๊ธฐ
-
hog = descriptor.compute(img): HOG ๊ณ์ฐ
img : ๊ณ์ฐ ๋์ ์ด๋ฏธ์ง
hog : HOG ํน์ง ์คํฌ๋ฆฝํฐ ๊ฒฐ๊ณผ
๋ณดํ์ ์ธ์์ ์ํ ๋ฏธ๋ฆฌ ํ๋ จ๋ HOG API
-
svmdetector = cv2.HOGDescriptor_getDefaultPeopleDetector() : 64x128 ์๋ ํฌ๊ธฐ๋ก ํ๋ จ๋ ๋ชจ๋ธ
-
svmdetector = cv2.HOGDescriptor_getDaimlerPeopleDetector(): 48x96 ์๋ ํฌ๊ธฐ๋ก ํ๋ จ๋ ๋ชจ๋ธ
-
descriptor = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins) : HOG ์์ฑ
-
descriptor.setSVMDetector(svmdetector) : ํ๋ จ๋ SVM ๋ชจ๋ธ ์ค์
-
rects, weights = descriptor. detectMultiScale(img) : ๊ฐ์ฒด ๊ฒ์ถ
img: ๊ฒ์ถํ๊ณ ์ ํ๋ ์ด๋ฏธ์ง
rects: ๊ฒ์ถ๋ ๊ฒฐ๊ณผ ์์ญ ์ขํ NX4(x,y,w,h)
weights: ๊ฒ์ถ๋ ๊ฒฐ๊ณผ ๊ณ์ N X 1