-
[Week 11] Photo OCRCourses/Andrew Ng - Machine Learning 2022. 2. 28. 14:31
Problem Description and Pipeline
Photo OCR은 이미지의 텍스트 인식 기술을 뜻합니다. 사진속의 단어나 문장들을 인식하고 텍스트로 변환하는 기술입니다. 이 또한 머신러닝 기술을 활용하여 다룰 수 있습니다.

OCR은 Optical Character Recognition의 줄임말로 이미지의 텍스트를 인식하는 기술입니다. 위와 같은 사진이 있을 때 간판이나 창문에 적혀있는 "LULAB's" 같은 단어를 텍스트로 인식하여 나중에 이 사진을 찾을 때 단어로 검색할 수 있게 합니다.

먼저 알고리즘은 사진을 살펴보고 텍스트가 존재하는 위치를 감지합니다. 그 이후 인식한 단어의 문자를 하나하나 분리합니다. 분리한 문자들을 인식하여 알파벳으로 분류합니다.

이러한 복합적인 머신러닝 어플리케이션을 파이프라인이라고 합니다. 텍스트 감지, 문자 분리, 문자 인식 모두 독립적인 머신러닝 모듈입니다. 문제를 해결할 때 이러한 모듈들을 세부적으로 설계하는 것이 중요합니다.
Sliding Windows

Photo OCR의 첫번째 단계는 텍스트 감지입니다. 텍스트 감지는 타겟 주위로 사각형의 영역을 감지합니다. 오른쪽 이미지를 보면 보행자를 찾고 감지하고 있습니다. 사람의 가로 세로 비율은 비슷하기 때문에 텍스트 감지보다 조금 더 쉽습니다. 텍스트의 경우 모두 다른 비율입니다.

82x36 픽셀의 이미지로 보행자의 샘플을 학습합니다. 왼쪽은 보행자에 해당되는 positive 예제들이고 왼쪽은 negative 예제입니다. 이미지를 캡쳐하여 보행자가 있는지 없는지 판단하는 지도 학습을 진행할 수 있습니다.

이제 실제로 영상에서 보행자를 인식해보려고 합니다. 녹색 박스는 82x36픽셀의 영역입니다. 박스 안에 보행자가 있는지 없는지 판단합니다. 현재는 보행자가 없으므로 0을 반환합니다.

다음으로 녹색 박스를 오른쪽으로 조금 더 옯깁니다. 그 후 보행자가 있는지 확인합니다. 매번 녹색 박스가 움직이는 간격을 스탭 사이즈 또는 슬라이드 파라미터라고 부릅니다. 가장 성능이 좋고 효율적인 파라미터를 선정해야 합니다. 이런 식으로 이미지의 끝까지 수평축으로 움직이고 다음 행으로 넘어갑니다.

현재 녹색 박스는 한 보행자만 감지할 수 있습니다. 이 박스의 사이즈를 키워서 분류기를 실행하고 무언가 감지된다면 82x36사이즈로 줄여서 판별하게 할 수도 있습니다.

그리고 전체 알고리즘을 완료하면 보행자가 존재하는 영역을 보여줍니다.

이번에는 보행자가 아닌 텍스트를 감지해봅시다. 목표는 텍스트 영역을 나타내는 붉은 박스를 위치시키는 것 입니다. 다만 모두 유사한 사이즈였던 보행자와는 달리, 텍스트의 경우 모두 비율이 달라집니다.

글자가 포함된 이미지를 positive 예제로 두고 글자가 포함되지 않은 이미지는 negative로 놓습니다. 이 세트를 알고리즘에 학습시킵니다.

이 예시에서도 슬라이딩 윈도우를 사용합니다. 텍스트의 길이가 어느정도일 지 알 수 없으니 , 작은 슬라이딩 윈도우를 사용합니다. 왼쪽 하단의 이미지는 슬라이딩 윈도우가 텍스트를 찾은 위치를 표시합니다. 흰색 영역이 텍스트를 인식한 영역입니다. 오른쪽 하단의 이미지는 텍스트를 인식한 영역을 확장한 것입니다. 흰색 영역 주변에 다른 흰색 픽셀이 있다면 채색합니다.
흰색 영역의 주위로 경계 상자를 그립니다. 그리고 이상한 비율의 상자들은 배제합니다. 상자의 가로세로 비율은 가로가 훨씬 더 길어야 합니다.(가로쓰기이므로) 따라서 아래의 길쭉한 두 상자는 신경쓰지 않습니다. 이제 선택된 영역을 잘라내고 파이프라인의 다음 단계로 진입합니다.

다음 단계는 문자 분할입니다. 위와 같이 텍스트 상자가 있을 때 어떻게 분할해야 할까요? 다시 지도 학습을 진행합니다. 문자 사이를 나눌 수 있는 이미지들을 positive로 학습합니다. 그 외의 이미지는 negative로 학습합니다. 이렇게 문자간의 영역을 인식할 수 있게 만듭니다.

이제 텍스트 상자에 슬라이딩 윈도우를 움직이면서 분류기를 작동시킵니다. 문자 간 사이처럼 보인다면 알고리즘이 텍스트를 문자로 분할할 것 입니다. 이 과정을 반복하면서 이미지를 개별 문자로 분할합니다.


그 다음 분할된 문자를 글자 분류 파이프라인에 넣어 이미지를 문자 데이터로 변환할 수 있습니다.
Getting Lots of Data and Artificial Data
머신러닝 시스템을 구성하면서 많은 양의 데이터가 필요할 수 있습니다. 그렇지만 현실에서 얻을 수 있는 데이터에 한계가 있다면, 인공 데이터를 합성하여 새로운 학습 셋을 만들 수 있습니다.

예를 들어 글자를 인식하는 알고리즘을 만든다면 주어진 데이터셋 뿐만 아니라 , 이미 존재하는 다양한 글꼴을 사용하여 인공 합성 데이터를 만들고 학습에 이용할 수 있습니다.

오른쪽 사진은 임의의 글꼴과 배경으로 합성한 인공 데이터입니다. 다양한 경우를 고려하기 위해 글자를 왜곡하거나 회전하거나 크기를 조정하는 등의 전처리 과정을 거칠 수 있습니다.

두번째로 이미 존재하는 데이터를 변형하는 방법입니다. 회전이나 왜곡, 노이즈등의 다양한 이미지 처리를 거쳐 여러개의 새로운 데이터를 생성하는 것 입니다. 다만 이미지 처리가 실제로 합리적인 변형인지 그저 데이터의 수만 늘리는 것인지 잘 생각해야 합니다.

중요한 점은 이미지 처리가 현실을 대변할 수 있는지 여부입니다. 위 이미지는 샘플에 가우시안 잡음을 추가한 것으로 육안으로도 구분할 수 없는 의미없는 데이터입니다. 이런 종류의 데이터는 학습에 도움이 되지 않습니다. 합성의 결과물은 현실에서 볼만한 데이터여야 합니다.

머신러닝 알고리즘이 낮은 편향 분류기라면 많은 데이터 셋이 도움이 될 것입니다. 낮은 편향이 아니라면 분류기의 변수의 수를 늘리거나 인공 신경망의 은닉 유닉 수를 늘려서 낮은 편향 상태로 만듭니다.

새로운 데이터를 얻는 방법과 시간에 대해 생각해봅시다. 만약 지금 가진 데이터의 10배의 데이터를 얻는 시간을 계산해보니 겨우 2일 정도 걸린다고 치면 이는 해볼만한 시도입니다. 하지만 만약 너무 오랜 시간이 걸린다면 다른 방법을 찾아보는 것이 더 나을 수도 있습니다.
요즘은 crowd sourcing이라는 새로운 데이터 수집 방법도 있습니다. 인터넷에서 저렴한 비용으로 사람들을 고용하여 데이터에 레이블을 달아주는 작업을 진행할 수 있습니다.
Ceiling Analysis: What Part of the Pipeline to Work on Next
이번엔 머신 러닝 시스템 분석 과정에서 시간을 절약할 수 있는 천장 분석(Ceiling Analysis)에 대해 알아봅니다.

위와 같이 머신러닝 파이프라인이 있을 때, 어떤 모듈이 최종 정확도에 가장 큰 영향을 주는지 알아봅시다. 현재 시스템의 정확도는 72%입니다. 직접 수동으로 데이터를 처리하여 정확도 100% 모듈 작업을 진행한다고 합시다. 예를 들어 문자 감지 모듈을 수동으로 처리하여 정확도를 100%로 올렸을 때 전체 파이프라인의 정확도는 89%로 상승합니다. 즉 문자 감지가 완벽하다면 전체 정확도는 17% 상승하는 셈입니다. 그에 반해 문자 분류 모듈을 완벽하게 진행해도 정확도는 89%에서 90%로 1%만 상승합니다. 따라서 문자 분류 모듈에 많은 시간과 인력을 쏟을 필요는 없다는 결론입니다.

다른 예제로 얼굴 인식 파이프라인을 들어 보겠습니다. 이미지 전처리 과정을 완벽하게 해도 0.1% 정확도 향상만 제공합니다. 그에 반해 얼굴 인식 모듈은 5.9%의 향상을 보여줍니다. 따라서 얼굴 인식 모듈에 더 많은 자원을 쏟는 것이 우선시됩니다. 이렇게 전체 시스템에 영향을 많이 주는 모듈부터 시간과 노력을 기울이는 것이 맞습니다.
혼자서 강의를 듣고 정리한 것이니 틀린 점이 있다면 언제든지 지적 부탁드립니다 :)
'Courses > Andrew Ng - Machine Learning' 카테고리의 다른 글
Machine learning 강의 완강 후기 (0) 2022.02.28 [Week 10] Advanced Topic (0) 2022.02.25 [Week 10] Gradient Descent with Large Datasets (0) 2022.02.23 [Week 9] Recommender Systems (0) 2022.02.09 [Week 9] Buidling an Anomaly Detection System (0) 2022.02.08