Enjoy My Posts

인공지능 랩에서 경험한 OCR 개발 프로젝트

Posted on By Geunwon Lim

IT 관련 제 첫 프로젝트인 ‘인공지능 랩에서 경험한 OCR프로젝트’에 대해 적어보겠습니다.

시기는 2017년 2월~6월입니다.

워낙 오래 전이라 생생하게는 기억이 나지는 않습니다.

16년 12월 말 쯤 한양대학교 김종우 교수님의 연구실에서 프로젝트학기제(학부연구생) 면접을 본 후, 미국 여행 중 합격 통보를 받았습니다. 한국에 도착한 바로 다음날 출근하였는데, 이미 다른 학생들은 며칠간 파이썬을 공부하고 있었습니다. 당시 학생들이 공부하던 책은 점프투파이썬 이었는데, 저도 바로 구매하여 공부를 했습니다. 이 때는 내가 코딩을 하고 있다는 사실 자체가 너무 신기했습니다. 이게 얼마나 초급 단계인지는 별로 생각지도 않고, 코딩을 하는 거 자체로 대견했던 것 같습니다. 붕어빵을 비유로 클래스 개념을 공부한 게 생각나네요. 매주 석사 선배님이 내주는 과제를 하며 파이썬 공부를 했는데요. 당시 공부 자료를 보니 목차가 이러하네요.

  1. 구구단 프로그램
  2. 홈런레이스 시뮬레이터
  3. 미로찾기 로봇
  4. 웹 크롤러 프로그램
  5. 인공신경망의 역사
  6. 딥러닝의 역사
  7. 실전 크롤링
  8. 인식기 관련 논문 스터디
  9. 인식기 모형

잘 가르려쳐주신 김기태 선배님 항상 감사드립니다.

책으로 공부하는 것 뿐 아니라 인터넷 동영상들도 활용했는데, 파이썬을 공부할 때는 코세라 강좌, 생활코딩 강좌 가 기억나네요. 당시 저는 같이 공부하던 친구들보다 뛰어나지는 않았었는데요. 저보다 잘하는 친구와 선의의 경쟁을 하고, 자극 받으며 공부했었습니다. 오후 11까지 공부하고 퇴근하는데 내일 또 공부할 것에 설레고 그랬습니다. 함께 공부하던 친구들보다 잘하진 않았지만 가장 재밌어하긴 했던 것 같네요.

파이썬을 어느정도 공부한 후에는 인공지능에 대해 공부했었는데, 정말 타이트했던 기억이 납니다. 일례로 석사 선배님이 책을 소개시켜주며 읽어오라고 했었는데, 빨리 따라가고 싶어 하루만에 인공지능과 딥러닝이라는 책을 다 읽은 적이 있습니다. 하루만에 책 한권을 다 읽은 것이 처음이라 당시 인스타그램에 남기기도 했었네요.

그림1

그리고 밑바닥부터 시작하는 딥러닝 이라는 책을 열심히 스터디했습니다. 이후에 딥러닝 첫걸음, 딥러닝 제대로 시작하기 등을 사서 공부하기도 했습니다. 인터넷 동영상은 코세라 강의, 모두의 딥러닝 등을 봤었습니다. 당시 수학때문에 헷갈리면서도, 대강은 알겠다 싶었는데 이제는 거의 다 까먹었네요.

열심히 공부하는 중간에 학부생들이 해야했던 과제가 있었는데, 이미지 파일 내 글자를 드래그하고(위치 정보를 얻음),

그림2

그 글자가 뭔지 타이핑하는 것이었습니다(분류 정보를 얻음).

그림3

쉽게 말해 노가다였죠. 하루에 3시간 정도 그 작업을 했는데, 평균적으로 1장에 3분정도 걸렸습니다. 학부생이 총 4명이었으니 하루에 약 250개의 데이터를 얻을 수 있었죠.

이 노가다를 했던 이유는 인공지능 랩의 최종 프로젝트 때문이었습니다. 저희 최종 과제는 인공지능을 활용하여 이미지 내 텍스트를 인식하는 OCR 프로그램을 개발하는 것이었습니다. 이 프로젝트는 저희 랩의 장이신 김종우 교수님과 교수님의 동기이자 사업가이신 분이 함께 시작한 것이었는데요. 프로젝트를 시작하게 된 배경은 이러합니다. 사업가 분의 경험상 온라인 쇼핑몰에서 대부분의 정보는 카탈로그에 적혀있는데, 카탈로그가 이미지 형식이라 고객이 그 정보를 검색할 수 없었습니다. 다음은 카탈로그 이미지 예시입니다.

그림4

만약 인공지능을 활용해 이미지 내 글자를 인식할 수 있다면, 고객이 카탈로그 내 정보를 포함하여 제품을 검색할 수 있게 됩니다. 예를 들어, 원래는 “후라이팬”이라고 검색했는데 이후에는 “스텐으로 된 후라이팬”과 같이 자세히 검색할 수 있게 되는 것이죠. 이를 가능하게 하기 위해서는 인공지능을 학습시켜야 하는데, 인공지능이 지도학습을 하기 때문에 정답 라벨링된 데이터가 필요했습니다. 그래서 학부생들이 열심히 데이터에 라벨링을 한 것이죠.

하지만 라벨링 작업(노가다 작업)이 고단할 뿐 아니라, 매일 작업한다고 해도 프로젝트 기간 내 충분한 데이터를 모으기는 불가능했습니다. 그래서 학부생들끼리 작정하고 교수님과의 회의 시간에 제안을 합니다. 하루 라벨링 작업 시간을 줄여주면, 파이썬으로 데이터 자동 생성 프로그램을 만들겠다고. 교수님은 흔쾌히 승낙하셨고, 그 때부터 약 한달 간 훈련데이터 자동 생성 프로그램을 만듭니다.

파이썬 이미지 라이브러리 Pillow를 사용하여 글자를 포함하지 않은 이미지에 원하는 글자를 뿌려주는 프로그램이었습니다. 먼저 Pillow에서 필요한 함수들을 찾고, 그 함수들을 이용하여 글자 크기, 글자체, 글자 위치 등 글자에 관련된 다양한 특성들을 원하는대로 조작할 수 있게 개발하였습니다. 당시 필요한 함수들을 정리한 py파일과 그 함수들을 활용하는 py파일을 사용하여 이미지를 생성했는데, 함수들을 활용하는 py파일은 너무 지저분해서 github에 올리지 않았고, 함수들을 정리한 파일은 여기 github repo에 올려놨습니다.

다음은 당시 제가 만든 이미지 파일들입니다.

그림5

어려웠던 점은 글자를 겹치지 않게 뿌려주는 것이었는데, 처음에는 랜덤으로 뿌려주는 것에 그쳤지만 나중에는 문장단위로, 나아가 문단단위로 배치시킬 수 있었습니다.

그림5

이렇게 원하는대로 글자를 제어한 덕분에 나중에 글자들의 특징을 비교하며 성능을 측정하여 논문을 작성할 수 있었습니다. 이 때 당시를 기억해보면 수작업한 데이터 1,000개 정도로 처음에 10% 정도의 인식률을 보였었고, 자동 생성한 데이터 1,000개의 데이터는 전혀 인식을 못해 0%의 인식률을 보였었습니다. 인식기는 그대로인데 데이터 생성을 고도화하면서 10%까지 오르고, 이후 10%의 벽에 막혔다가, 작업을 더 해 30%를 찍어 기뻐하고 그랬었습니다.

프로그램으로 자동화하여 정답 라벨링된 데이터를 만든 후 인공지능 사물인식기를 훈련시켰습니다. 사물인식기는 singleshot multibox detector라는 것을 사용했는데, 사물인식기를 customize하는 것은 석사 선배님이 담당해주셨습니다. 당시 입력할 이미지의 크기를 수정하는 것, 기학습된 부분은 더이상 학습되지 못하게 freeze됐던 걸 풀어줬던 것 등이 대표적으로 수정된 사항으로 알고 있습니다.

결과적으로, 논문 작성시까지 총 10개의 키워드에 대하여 82%의 인식률을 기록하였고, 논문 작성 후 석사 선배님이 추가작업하여 총 200개 키워드에 대하여 82%의 인식률을 기록하였습니다. 처음 프로젝트를 시작할 때 협력사 측에서 자기들이 분석한 결과 200~300개의 키워드를 인식할 수 있다면 고객들에게 유의미한 가치를 제공할 수 있을 것이라고 했던 것과 비교해보면 꽤 유의미한 성과라고 할 수 있습니다. 다음은 당시 인공지능 인식기가 글자를 인식한 걸 시각화한 것입니다.

그림6

프로젝트 학기제 마무리 단계에서 저희의 프로젝트 과정과 성과를 공유하는 자리가 있었습니다. 다음은 워커힐 호텔에서 제가 프로젝트에 대해 설명하는 모습입니다.

그림7

대강 이런 분위기였습니다.

그림8

그리고 논문으로 작성하여 게재하였는데, 여기에서 확인하실 수 있습니다.

지금까지 IT 관련하여 제가 처음으로 참여한 ‘인공지능 랩에서 경험한 OCR 개발 프로젝트’를 살펴보았습니다. 이 후 이 프로젝트를 확장시키는 프로젝트를 수주하여 진행했는데, 그 때 기억은 정말 흐릿해 회고하기 어렵겠네요. 자료구조를 엄청 공부하고 pandas와 open-korean-text라는 라이브러리를 썼던 기억이 납니다. 어쨌든, 첫 프로젝트였지만 괜찮은 성과를 냈던 것은 주변에 함께 했던 훌륭한 동료들과 저희를 이끌어주신 김종우 교수님 덕분이었습니다. 함께 했던 분들 모두 감사합니다.

다음에는 제가 이 때 얻은 인공지능 관련 지식을 가지고 특허를 출원했던 경험을 적겠습니다.

읽어주셔서 감사합니다.