7.2. 머신러닝이 바꾼 것¶
image 모듈에는 몇 가지 레거시 검출 메서드가 포함되어 있습니다 – Haar 캐스케이드 얼굴 검출을 위한 find_features(), 고정된 동공 탐지기인 find_eye(), 기울기 방향 요약을 위한 find_hog(), 그리고 임의의 키포인트를 위한 find_keypoints() 와 find_lbp() 경로가 그것입니다. 이들은 모두 여전히 동작하지만, 모두 머신러닝 파이프라인으로 대체되었습니다.
7.2.1. 고전적 분리: 사람이 설계한 요약, 학습된 판단¶
고전적인 비전 파이프라인은 두 단계로 이루어진 것이었습니다. 첫 번째 단계는 원시 픽셀을, 그림 안에 무엇이 있었는지를 요약하도록 선택된 간결한 숫자 집합으로 바꿨습니다 – 픽셀 값 그 자체가 아니라, 어떤 패턴이 어디에 나타났는지에 대한 더 짧은 기술입니다. 두 번째 단계는 그 요약을 받아 판단을 내렸습니다 – 얼굴인지 아닌지, 이 객체인지 저 객체인지, 같은 대상인지 다른 대상인지.
이 분리가 중요했던 이유는 두 단계의 작성자가 달랐기 때문입니다. 첫 번째 단계는 사람이 작성했습니다. 누군가가 앉아서, 특정한 두 직사각형 사이의 밝기 차이가 눈 영역을 잘 요약한다는 것, 격자의 각 셀에서 우세한 에지 방향이 서 있는 사람의 윤곽선을 잘 요약한다는 것, 각 픽셀 주변의 밝거나 어두운 패턴이 국소 질감을 잘 요약한다는 것을 결정했습니다. 이러한 선택 하나하나가 사람이 직접 작성한 알고리즘이었습니다 – 작성되고, 디버깅되고, 발표된 것입니다. 위의 레거시 메서드들은 모두 이런 종류의 요약으로서 표준 도구가 된 것들입니다:
find_features()는 여러 직사각형 내부의 밝기를 합산하고 그 합계를 비교하여 이미지의 한 윈도우를 요약합니다. 직사각형 배치는, 사람 얼굴이 신뢰할 만한 밝음 대 어두움의 대비를 보여 주기 때문에 선택되었습니다 – 뺨에 대한 눈썹, 이마에 대한 눈구멍, 주변 피부에 대한 코의 대비처럼요.find_hog()는 작은 셀들로 이루어진 격자를 훑으면서 각 셀에서 어떤 에지 방향이 우세한지를 기록하여 이미지를 요약합니다. 이 격자는, 서 있는 사람의 윤곽선이 옷이나 조명과 무관하게 인식 가능한 에지 방향 패턴을 만들어내기 때문에 선택되었습니다.find_lbp()는 주변 픽셀들 중 어느 것이 더 밝고 어느 것이 더 어두운지를 부호화하여 각 픽셀의 이웃을 요약합니다. 이 부호화는, 이러한 더 밝음/더 어두움 패턴이 전체 조명과 무관하게 표면의 질감을 포착하기 때문에 선택되었습니다.find_keypoints()는 이미지에서 모서리 점을 찾고, 모서리가 회전되어도 동일하게 유지되는 방식으로 각 모서리 주변 영역을 기술합니다. 이 모서리-회전 방식은, 장면을 다른 각도에서 보더라도 동일한 모서리가 다시 나타나기 때문에 선택되었습니다.
요약이 일단 사람의 손으로 작성되고 나면, 그 위에 얹은 작은 학습 단계가 그 숫자들을 조합하여 판단으로 만들 수 있었습니다. 얼굴 검출 알고리즘은 직사각형 차이 요약 위에 학습 단계를 붙이고, 레이블이 달린 얼굴 및 비얼굴 이미지로 학습시켜 어떤 차이의 조합이 얼굴을 신호하는지를 학습하게 했습니다. 에지 방향 요약은 레이블이 달린 사람 및 비사람 이미지로 학습된 학습 단계로 입력되었습니다. 모서리 디스크립터는 각 모서리에 얼마만큼의 가중치를 줄지를 학습하는 매칭 단계로 입력되었습니다. 이러한 두 번째 단계들은 각각 하나의 학습 알고리즘입니다 – 현대 기준으로는 작은 것이지만, 어쨌든 학습 알고리즘입니다.
기여의 분리가 바로 중요한 점이었습니다. 사람은 요약 을 기여했습니다. 기계는 조합 을 학습했습니다. 새 대상을 추가한다는 것은 새 요약을 작성한다는 뜻이었습니다.
7.2.2. 신경망이 바꾼 것¶
신경망(neural network) 은 이 분리를 지워 버립니다. 신경망의 초기 계층들은 사람이 작성한 알고리즘이 하던 요약 작업 – 위에 나열한 레거시 메서드들이 각각 검출하도록 조정되었던 바로 그것, 즉 에지, 모서리, 방향성 막대, 질감을 검출하는 일 – 을 수행하지만, 사람이 작성한 것이 아닙니다. 그것들은 판단 단계가 학습되는 것과 동일한 학습 데이터로부터, 신경망의 양쪽 절반을 한꺼번에 조정하는 단일 학습 패스에서 학습됩니다. 더 깊은 계층들은 사람이 작성한 요약 위에 얹혀 있던 작은 학습 단계가 하던 조합 작업을 수행하며, 이 또한 같은 패스에서 학습됩니다.
누가 무엇을 설계하는지에 대한 변화는 전면적입니다:
사람은 입력 을 설계합니다 – 주어진 크기와 형식의 캡처된 프레임.
사람은 출력 을 설계합니다 – 결과 텐서의 레이아웃(분류의 경우 클래스마다 하나의 점수, 검출의 경우 상자 목록, 랜드마크의 경우 키포인트 격자).
사람은 레이블이 달린 학습 데이터 를 제공합니다 – 학습 과정이 학습할 거리를 갖도록 충분한 수의 대상 예시와 충분한 수의 비대상 예시.
입력과 출력 사이의 모든 것은 학습 과정에 의해 생성됩니다. 별도의 요약 작성 단계는 존재하지 않습니다. 초기 계층들이 에지 및 질감 검출기로 자리 잡는 것은 누군가가 그렇게 작성했기 때문이 아니라, 에지와 질감 검출이 바로 신경망의 예측을 레이블과 일치시키는 것이기 때문입니다. 더 깊은 계층들이 모양 및 객체 검출기로 자리 잡는 것도 같은 이유에서입니다. 양쪽 절반이 함께 학습되며, 이로 인해 각 계층이 만들어내는 요약이 다음 계층이 필요로 하는 바로 그 요약이 될 수 있습니다 – 사람이 작성한 파이프라인이 만족할 수밖에 없었던 범용 요약이 아니라요.
7.2.3. image 모듈과 조합하기¶
신경망 파이프라인도 여전히 동일한 센서 API를 통해 캡처하고, 동일한 draw_rectangle() 및 draw_circle() 기본 함수로 결과를 그리며, 동일한 (x, y, w, h) ROI로 작업 범위를 한정합니다. 전형적인 파이프라인은 프레임을 캡처하고, 선택적으로 find_blobs() 같은 고전적 검출기로 대략적인 대상을 찾아 그 경계 상자를 ROI로 추론에 전달하며, 추론을 실행한 뒤, 반환된 검출 결과를 원래 프레임에 다시 표시합니다. 고전적 기본 함수들이 토대이고, 신경망은 그 중간에 추가된 새로운 단계입니다.