LBP


위의 그림1 처럼 이미지를 tile로 나누고 각 tile의 LBP 히스토그램을 나열하여 최종적으로 feature histogram을 만든다. 다른 이미지의 feature histogram과 비교하여 동일인인지 판별할 수 있다.
LBP hisogram을 만들기 위해서 그림2와 같은 연산이 필요하다. 알고리즘은 아래와 같다.
- 3x3 block으로 이미지의 pixel정보를 얻어온다.
- center pixel을 중심으로 나머지 픽셀들과 크기비교를 한다. center pixel 보다 크거나 같다면 1 작다면 0으로 계산한다.
- (그림3 참고)좌측 pixel 부터 차례대로 나열하여 11001011이라는 2진수를 만든다. 그리고 이를 다시 10진수로 바꾸면 203이라는 값이나오고 이 값이 중간 픽셀의 값으로 바뀌게된다.
위의 간단한 알고리즘을 직접사용하기 위해 구현을 진행하였다.
- 먼저 이미지를 25x25 타일로 crop한다. 그리고 LBP를 적용한 후 feature histogram을 계산한다. 그리고 이때 prev_hist와 hist사이의 제곱오차를 계산하여 이전 이미지와 현재이미지 사이의 오차를 계산한다.
def lbp_run(self, recent_frame):
gray = cv2.cvtColor(recent_frame, cv2.COLOR_BGR2GRAY)
resize_frame = cv2.resize(gray, (250, 250))
hist=list()
for x in range(25, 251, 25):
for y in range(25, 251, 25):
self.LBP(resize_frame[y-25:y,x-25:x])
for i in np.histogram(self.transform_img.flatten(),10,[0,255])[0]:
hist.append(i/625)
if self.prev_hist == None:
self.result_hist = None
else:
# self.result_hist = [((self.prev_hist[i]-hist[i])**2)/(self.prev_hist[i]+hist[i]) for i in range(0, len(hist))]
self.result_hist = [((self.prev_hist[i]-hist[i])**2) for i in range(0, len(hist))]
self.prev_hist = hist
2. 위 함수에서 사용된 LBP 알고리즘이다.
def lbp_run(self, recent_frame):
gray = cv2.cvtColor(recent_frame, cv2.COLOR_BGR2GRAY)
resize_frame = cv2.resize(gray, (250, 250))
hist=list()
for x in range(25, 251, 25):
for y in range(25, 251, 25):
self.LBP(resize_frame[y-25:y,x-25:x])
for i in np.histogram(self.transform_img.flatten(),10,[0,255])[0]:
hist.append(i/625)
if self.prev_hist == None:
self.result_hist = None
else:
# self.result_hist = [((self.prev_hist[i]-hist[i])**2)/(self.prev_hist[i]+hist[i]) for i in range(0, len(hist))]
self.result_hist = [((self.prev_hist[i]-hist[i])**2) for i in range(0, len(hist))]
self.prev_hist = hist
자세한 실행 코드는 아래 github를 clone하여 실행해보시거나 위의 코드들을 참고하여 직접 구현해보시는 것을 추천 드립니다.
github link : https://github.com/22ema/ComputerVision/tree/main/LBPRecognizer
GitHub - 22ema/ComputerVision: Computer Vision based module
Computer Vision based module. Contribute to 22ema/ComputerVision development by creating an account on GitHub.
github.com
결론
Computer vision 베이스이기 때문에 현재 딥러닝 기반의 기술들 보다 정확도가 다소 떨어지지만 GPU 자원이 없다면 위의 코드도 적용해볼 수 있을것 같습니다. 그리고 위의 LBP 코드를 기반으로 확장된 논문들이 많기 때문에 다른 논문들을 읽는데도 본 포스트가 도움이 될 것 같습니다. 감사합니다.
참고 자료
'Computer Vision' 카테고리의 다른 글
Computer vision based Skin Detector (0) | 2022.07.20 |
---|---|
OpenCV Face Detection and Recognition(얼굴 탐지 및 인식) - 1부 (0) | 2022.07.09 |