본문 바로가기

[ 프로그래밍 ]/강좌

문자인식 강좌 01. 문자 인식 개론

안녕하세요 마틴입니다.
문자인식이라는 광범위한 주제의 강좌를 본격적으로 진행해 보고자 합니다.

사실, 문자인식 분야를 제법 오~래 공부해온 저 나름의 자존심 문제도 있고 해서,
어려운 논문들을 참조해가며 체계적이고 또한 학문적인 강좌를 진행하고 싶은 욕심이 컸지만,
금새 바닥을 보일 실력... 거짓말은 하지 말자는 생각에,
이야기 하기 쉽고 많은 사람들이 공감할 수 있는 내용들을 이곳에 정리해 가는 것이
원래 강좌를 시작한 취지에도 맞고 훨씬 바람직하다는 생각이 들었습니다.
역시 그러한 과정에서 저 스스로도 많이 배우고 또 깨달을 수 있는 계기가 될 수 있을 것도 같구요.

두산중공업의 출입문을 지나는 차량의 번호판을 인식하는 일을 시작으로,
삼성테크윈의 불법주정차 차량 번호판 인식, 신선대부두의 컨테이너 식별자 인식 등
주로 실세계 영상의 번호 인식에 관련된 일들을 해왔고,
또한 그런 이유로 본 강좌의 최종 목표가 그쪽 방향이 될 것 같은데요,
아무쪼록 글을 읽으시는 분들에게 도움이 되는 강좌가 되었으면 좋겠습니다.




문자 인식에 앞서...

문자를 인식한다라고 하면 구체화 해두어야 할 몇 가지가 떠오르는데,
단연코 그 첫 번 째 는 어떤 문자를 인식 할 것인가일 것이다.

여기서 '어떤'의 의미 또한 광범위 한데,
그것은 한글이냐, 영어냐, 숫자냐의 종류를 나타내는 '어떤'이 될 수도 있고,
인쇄된 문자를 인식할 것인지 손으로 쓴 글씨를 인식 할 것인지를 구분하는 '어떤'이 될 수도 있고,
길 가다가 찍은 사진에서 문자를 인식 할 것인지, 스캐너로 입력받은 문서를 인식 할 것인지의 대상을 구분하는 '어떤'이 될 수도 있겠다.



이 '어떤'을 고민하는 이유는,
문자를 인식하기 위해서 먼저 무엇이 문자인가?에 대해서 컴퓨터가 알아 듣게끔 프로그램을 개발해야 하기 때문이고,
그말인 즉슨, 우리 개발자들이 눈으로 문자를 보고 그것이 문자라는 것을 판단하기 까지,
어떤 특징들을 가지고 그것이 문자라고 인지하게 되는지를 한 번도 생각해 볼 겨를이 없었기 때문에
뭔가 깊게 생각해볼 여지가 있다는 얘기가 된다.

특징이라고 하는 것은 생김새와 크기가 될 수도 있고, 그것의 색상이 될 수도 있을 텐데,
예를들어, 우리가 사과를 보고 그것이 사과인줄 알게 되는 것은
그것이 가지는 둥그스름한 고유의 생김새와 주먹보다 조금 큼직한 크기,
붉은색 혹은 녹색계열의 색상, 그리고 특유의 꼭지 등을 보기 때문인 것 처럼,
문자를 인식하는 것 또한 여러가지 사물들 중에 사과를 인지해 내듯
문자만이 가진 고유한 특징을 결정하는 것이 우선시 되어야 한다.



무엇이 문자인가?

앞서 '어떤'의 예에 대해 잠시 언급한 바 있는데,
한글과 영어, 또는 한자나 일본어, 숫자... 이런 구분을 설명하기 이전에 과연 영상에서 무엇이 문자인가?에 대해서 구분해 낼 수 있는 방법에 대해 생각 할 필요가 있다. 그리고 그것은 문자가 가진, 다른 어떤것들과 구분되는 특징을 찾아야 한다는 말이 된다.

문자가 가진 특징들 중 먼저 문자라고 하는 것은 '획'으로 이루어져 있다는 점에 주목 할 필요가 있다.

[畫]

[명사] 1. 글씨나 그림에서, 붓 따위로 한 번 그은 줄이나 점.
2. {수량을 나타내는 말 뒤에 쓰여}글씨나 그림에서, 붓 따위를 한 번 그은 줄이나 점을 세는 단위.
3. 역수(易數)의 괘를 나타내는 산가지에서 가로 그은 표시. 양(陽)을 나타내는 ‘-’과 음(陰)을 나타내는 ‘--’를 이른다.


'획'은 가늘고 긴 선이고, 문자는 적게는 하나, 많게는 10개 이상의 획을 가지기도 한다.
'획'은 영상에서는 윤곽선이라고 이야기 할 수 있는데,
이것이 글자와 함께 있는 다른 어떤 것들의 윤곽선 보다는 조밀하고 숫자가 많기 때문에
문자와 다른 어떤 것들을 구분될 수 있는 특징이 된다.
또한 '문자'가 '문자열'이 되면 획의 수는 증가 되고, 이 특징은 다른 어떤 것들과 더 확실하게 구분 될 수 있다.


어떤 문자를 인식 할 것인가?

'획'이라는 특징을 가지고 문자를 다른 어떤 것들과 구분하다보면,
'획'만으로는 구분이 힘든 경우가 생기기 마련이다.
나무 기둥의 거친 줄기도, 울창하게 우거진 5월의 푸른 나무잎들도,
안경을 끼고 하품을 하고 있는 내 주름 많은 얼굴도, 체크무늬 옷을 입고 있는 강아지도,
심지어는 아스팔트의 조각 하나하나에 비친 햇빛도
많은 윤곽선들 때문에 문자로 구분될 수 있는 여지가 있다.

그런 이유로, '획' 이상의 특징들을 마치 저그가 앞마당 멀티를 펼치듯 추가하기 위하여,
어떤 문자를 인식할 것인지 범위를 좁혀갈 필요가 있다.

하얀 종이위에 볼펜으로 쓴 글씨, 프린트된 문서들은 하얀것은 종이요 까만것은 글자구나!라는 특징을,
자동차 번호판의 문자들은 녹색 배경에 흰색 글자, 노란색 배경에 어두운 색의 글자, 흰색 배경에 검은 글자 등의 특징을,
길가다 찍은 경고표지판의 문자는 보색으로 눈에 잘 띄고 강렬한 인상을 준다는 특징을 추가할 수가 있겠다.

영어나 숫자는 세로 획이 많고, 한글이나 한자는 가로획도 존재하지만 획의 분포가 다른 어떤 것들이 비해 조밀하고,
이들 모두는 대게 가로 길이 보다는 세로 길이가 길다.

붓글씨는 획이 굵고 가변적이며, 인쇄체는 획의 굵기가 일정하다는 것들도 특징으로 추가될 수 있겠다.

이처럼 인식하고자 하는 문자가 어떤 것인가에 따라 해당 문자가 가지는 특징들을 추가하여,
무엇이 문자인가?의 문제를 풀고 문자를 추출해 낼 수 있을 것이다.


문자 인식하기

문자 하나하나를 추출해내고 나면 이들 문자가 무슨 문자인지를 알아낼 수 있도록 해야한다.

앞서 문자를 추출하는 데에 문자 고유의 특징들이 필요했듯,
문자를 인식하는 데에도 각각의 문자가 가지는 특징들을 묻고 답하는 과정이 필요하다.
마치 옛날 화장실에서 귀신이 같은 휴지임에도 빨간휴지 줄까 파란휴지 줄까 물어보는것처럼.

일곱장의 패를 들고 그림이 비슷한 것이 나오면 딱! 때려서 가져 오는 고스톱 같이
0~9까지의 이미지를 들고 추출된 문자와 생김새를 비교해가며 가장 비슷한 것을 답으로 내어 놓을 수도 있겠고,
삼각형은 직선이 세 점에서 만나 이룬 도형이고, 사각형은 네 점에서 만나는 도형이고, 원은 꺾이는 곳이 없다는 식으로

'가'는 꺾이는 부분이 한군데이고 직선의 가운데서 가지가 튀어 나와 있고, '갈'은 가로획이 네 개이고 어쩌고 저쩌고..
'1'은 획이 하나면서 직선이고 '2'는 획이 하나이지만 구부러져 있다는 식으로 각각을 구분할 수 있겠다.

이렇게 각각을 구분할 특징들은 개발자가 직접 정해주기도 하고,
특징들의 조합은 신경망의 학습 과정을 통해 우리는 알지 못하는 소숫점 형태로 계산하여 저장할 수도 있다.

이렇게 말로 주저리 주저리 읊어 나가는 것을 컴퓨터가 할 수 있도록 하는 과정이,
인식 알고리즘의 개발 과정이 된다.




마틴의 문자인식 강좌 / 1장. 문자인식 개론
본 강좌는 마틴블로그 닷 넷, OpenCV Korea에서 동시에 보실 수 있습니다.



이처럼 다양한 인식 대상과 인식 방법 중에서도,
(서두에 혼잣말로 주절거렸듯) 오랜기간동안 영상처리를 공부하면서 가장 오랫동안 고민했고 또한 자신있는 분야인
자동차 번호판 인식 문제를 주제로 하여 문자인식 강좌를 진행할 예정입니다.

부디 이 강좌가, 문자인식을 처음 접하는 분들께는 조그만 도움이 되고,
연구를 진행하고 있거나 혹은 경험으로 간직하고 계신 분들께는 스스로의 경험들을 공유할 수 있는 계기가 될 수 있는
값어치 있는 강좌가 될 수 있도록 노력하겠습니다.


글의 내용중 수정이 필요한 부분이나 궁금한 부분은, 강좌 방법 또는 방향 개선에 관한 의견은
답글을 다시거나 메일을 보내주시면 적극 반영/수정토록 하겠습니다.

고맙습니다.