Convolution 네트워크는 컴퓨터 비전에서 획기적으로 성능 향상을 이끈 구조입니다. 다양한 피쳐 맵(feature map)을 만들어서 여러 컴퓨터 비전의 작업에 활용했습니다. Semantic segmentation에서도 convolution 네트워크를 활용하려는 시도가 있었고, 이에 대한 효시가 된 논문이 있습니다. [1]
해당 논문에서 제시하고 있는 Segmentation을 위한 FCN의 설계 주요 특징은 다음과 같습니다.
당시 좋은 성능을 내고 있던 VGG-16을 기본 구조(backbone)으로 사용
Fully-connected layer를 Convolution layer로 대체
Transposed convolution을 이용해 pixel-wise 예측을 수행
1.2. Convolution 연산이 필요한 이유
Fully-conneted layer는 모든 신경망들이 연결되어 1차원의 평탄화된 행렬을 통해 이미지를 분류하는데 사용되는 층입니다. 평탄화되어 있는만큼 위치에 대한 정보가 없어지기 때문에 이미지 정보를 담기에는 적절하지 않습니다.
FC 연산[2]
반면에, Convolution은 필터/커널이 이동하면서 연산을 수행하기 때문에 위치 정보가 해치지 않은 상태로 피쳐 맵을 추출할 수 있고, 커널이 이동만 하면되기 때문에 입력의 크기에 상관이 없습니다.
Convolution 연산[2]
1.3. Transposed convolution
Convolution 네트워크의 층을 통과할 때마다 패딩, 스트라이드 등에 따라 다르긴 하지만, 해상도가 갈수록 줄어듭니다. VGG의 경우 최종 층에서 나온 것은 1/32 수준인데, Segmentation에서는 원본 이미지에 표시를 해야 하기 때문에 복원을 위한 업샘플링 과정이 필요합니다.
각 요소의 값에 더 큰 커널을 적용하면 단순히 곱이되는 방식으로 커널 사이즈만큼의 행렬이 생성됩니다. 그것을 모든 요소에 적용하고 그 위치에 맞춘 다음 최종적으로 합을 진행하면 업샘플링이 가능합니다. 아래 그림은 2x2 입력값을 스트라이드 1의 커널 사이즈 3x3을 통해 4x4로 늘려주는 과정입니다. [3] 만약 더 큰 사이즈를 원할 경우 스트라이드를 키우면 더 큰 사이즈로 업샘플링이 가능할 것입니다. 이렇게 스트라이드가 1이 아닌 convolution을 strided convolution이라 합니다.
Transpose Convolution [3]
이러한 convolution 연산을 행렬로 표현하면 sparse한 커널 행렬을 역행렬을 구해서 곱해주면 업샘플링한 값을 구할 수 있습니다. 이는 전치(transpose)해서 우변에 곱하는 과정과 동일하기 때문에 transposed convolution이라고 합니다. 이러한 과정이 역으로 convolution한 것처럼 보인다고 해서 deconvolution이라는 명칭이 많이 활용되기는 하지만,엄밀한 의미에서 convolution의 역연산은 아니기 때문에 정확한 표기는 아닙니다.
Transposed convolution 역시 다른 convolution과 동일하게 학습이 되는 파라미터로 파이토치를 통해 구현이 가능합니다. 파이토치에서 구현하려면 아래와 같이 적을 수 있습니다.
FCN의 구조는 기존의 convoltion 네트워크와 거의 동일합니다. 기본적인 convolution 구조에서 forward 연산을 통해 추론과 backward로 학습이 진행이되고, 맨 마지막 예측은 transpose convolution을 통해 pixel-wise 예측을 수행합니다.
구조 [1]
2. FCN에서 성능 향상 방법
2.1. stride 축소
하지만 진짜 구분해야 하는 ground truth에 비해 세밀함이 부족한 경우들이 많이 보였습니다. 아래 사진을 보면 경계선이 많이 사라진 것을 확인할 수 있는데, 이는 Max Pooling을 지나면서 손실된 정보들 때문입니다. 따라서 Pooling 층을 지나면서 잃어버린 정보에 대한 복원이 필요하고 손실이 발생하기 전에 정보를 합쳐서 정보를 보존하는 방식을 채택합니다.
손실된 이미지 경계선 정보[1]
정보를 합치는 방법은 ResNet에서도 언급된 skip connection (이전 층의 정보를 더하기) 방식으로 개선합니다. 최종층이 1/32이었기 때문에 최종 층에서 나온 Transpose Conv에서 나온 값(FCN-32s)과 1/16 층에서 나온 값을 1x1 Conv를 통과시켜서 합쳐서 예측을 수행한 것이 FCN-16s 입니다.
여기서 더 나아간 것이 FCN-16s 예측값과 1/8 층에서 나온 값을 1x1 conv 통과시켜서 합쳐 Transpose Conv를 통해 예측을 수행한 것이 FCN-8s 입니다. 위 이미지에서 확인할 수 있듯 이전 층의 정보를 합쳐줄수록 더욱 선명한 결과값이 나오는 것을 확인할 수 있습니다.
skip connection [1]
3. 참고자료
[1] Evan Shelhamer, Jonathan Long, Trevor Darrell. "Fully Convolutional Networks for Semantic Segmentation"
Segmentation 또는 Image Segmentation은 컴퓨터 비전에서 연구되는 주요 분야 중 하나로, 이미지를 객체에 대응하는 여러 부분(segments)이나 영역으로 나누는 것입니다. 이미지의 픽셀을 레이블이나 카테고리에 할당해서 비슷한 것끼리 묶는 것을 목표로 하고 있습니다.[1] Segmentation은 크게 Semantic, Instance, Panoptic로 구분할 수 있습니다.
Semantic Segmentation은 이미지의 픽셀 단위로 분류해서 클래스나 객체인지를 구분하는 컴퓨터 비전의 한 영역입니다. 이 과제의 주요 목표는 매핑을 통해 이미지를 모두 구분할 수 있는 구분을 형성하는 것입니다. [2] Instance Segmentation은 이미지 안 있는 개별 객체를 경계와 개별 객체에 고유한 레이블을 부여하는 것입니다. [3] Panoptic Segmentation은 semantic과 instance의 결합된 버전으로 장면에 대한 전반적인 이해를 하는 것을 목표로 하고 있습니다. 이미지를 의미에 따라 나누는 것은 semantic, 각 개별 객체를 구분해내는 것은 instance의 방법을 따라가는 것으로 주어진 이미지에서 의미 레이블과 고유의 인스턴스 id를 부여합니다. [4]
아래 이미지를 참고하면 각각에 대해 한번에 와닿게 이해할 수 있을 겁니다.
Segmentation 구분 [5]
2. 주요 지표
객체 탐지 문제와 유사하게 면적을 계산할 수 있는만큼 Segmentation 역시 IoU를 활용해 평가지표로 활용할 수 있습니다.
이와 유사하게 두개의 영역이 얼마나 겹쳐져 있는지 살펴보는 또 다른 지표인 Dice 라는 것이 존재합니다. 원래 명칭은 Dice-Sørensen coefficient라고 하는데, 두 샘플 사이의 유사도를 측정하는 통계치입니다. 공식은 아래와 같습니다.
Dice Sorensen Coefficient [6]
IOU 공식은 교집합을 합집합으로 나눈 것이었지만, Dice는 교집합의 2배를 각각 집합을 더한 것만큼 나눈 것이기 때문에 수치적으로 조금 차이가 있을 수 있습니다.
이를 컴퓨터에서도 사용할 수 있게끔 boolean으로 풀어쓰면 아래와 같습니다. 겹치는 것은 2배해서 분자와 분모에 모두 넣고 분모에는 추가적으로 Ground Truth에는 있지만 Prediction에는 없는 것(FN)과 Ground Truth에는 없지만 Prediction에만 있는 것(FP)까지 함께 더합니다.
OCR 모델들의 평가는 추론을 진행한 결과와 정답(Ground Truth, GT) 간 비교를 하고, 매칭 및 점수를 매기는 과정(Scoring)을 통해 평가합니다. 여기서 살펴봐야 할 것은 추론 결과와 GT가 어떻게 매칭되는지 판단하고, 그 매칭한 정도에서 어떻게 점수를 계산할 것인지에 대한 방법론입니다.
2. 어떻게 매칭할 것인가
2.1. 기본 개념
두 영역 간 매칭 여부를 판단하고, 그에 따라 매칭 행렬을 계산합니다. 매칭 행렬을 계산하기 위해 알아야 할 기본 개념은 아래와 같습니다.
Area Recall : 정답과 예측의 교집합 넓이 / 정답 넓이
Area Precision : 정답과 예측의 교집합 넓이 / 예측 넓이
또한, 매칭의 방식에 대해서도 구분할 수 있는데, 정확히 하나씩 매칭되는 경우(One-to-One) / 하나의 정답에 여러 개를 매칭하는 경우(One-to-Many, Split Case), 여러 정답에 하나의 예측을 하는 경우(Many-to-One, Merge Case)가 있습니다.
2.2. DetEval
DetEval은 아래 조건을 모두 충족하면 1, 아니면 0으로 해서 매칭 행렬을 설정합니다.
area recall >= 0.8
area precision >= 0.4
그리고 one-to-one, many-to-one은 1을 그대로 유지, one-to-many는 0~1 사이 값(예를 들어, 0.8)으로 페널티를 줍니다. 이렇게 하고 각각의 예측 영역 기준의 평균 값이 Precision과 정답 영역 기준의 평균 값인 Recall을 계산해 둘의 조화평균을 구합니다. 이 숫자가 이미지에 대한 최종 점수입니다.
2.3. IoU와 TIoU
IoU는 이전 정리 글(링크)에서 다룬 것처럼 예측과 정답의 교집합 영역이 일정 기준(보통 0.5) 이상이 넘은 경우에만 매칭 행렬 값을 1로 두는 방법입니다. 하지만, 이 방법에서 맹점은 예측에서 부족하거나 넘치는 영역에 대해서는 반영되지 않는다는 점인데요. 이를 보완하기 위해 등장한 것이 Tightness-aware IoU, 즉 TIoU가 등장합니다.
TIoU는 부족하거나 초과된 영역 크기에 비례해서 IoU 점수에 페널티를 주는 방식입니다. 각각 Recall과 Precision은 아래와 같이 계산할 수 있습니다. 앞서 얘기한 것처럼 두가지 케이스(부족/초과)가 존재할 수 있는데, 부족 영역의 경우 페널티를 주기 위해서는 정답 영역 기준이므로 Recall로 들어가게 되고 반대로 초과 영역은 페널티를 주기 위해서는 분모에 예측 영역이 되어야 하기 때문에 Precision으로 간주합니다.
Recall = IoU * (1-penalty) where penalty = 부족 영영 / 정답 영역
Precision = IoU * (1-penalty) where penalty = 초과 영역 / 예측 영역
이렇게 계산된 recall과 precision의 조화평균을 취해주면 최종 점수를 계산할 수 있습니다.
2.4. CLEval
Character-Level Evaluation(CLEval)은 기존에 영역 기준만으로 측정하는 지표들의 한계를 극복하기 위해 등장했습니다. 즉, 얼마나 맣은 글자를 맞추고 틀렸느냐를 평가하기 위해 등장한 지표인데, 글자 영역을 글자 수만큼 등분하고, 등분한 영역에서 센터를 Pseudo Character Centers(PCCs)를 계산합니다.
텍스트의 기준점 잡기 [2]
위 이미지는 텍스트의 기준점을 잡는 방법에 대한 것으로 PCC는 이미지의 좌측에 한 글자에 해당하는 이미지에서 m-m 을 기준으로 한다고 이해하면 될 것 같습니다. 이렇게 영역에 PCC가 몇개나 있는지 계산합니다.
점수는 정답 기준과 예측 기준으로 두가지를 구해 조화평균하여 산출합니다. 각각의 점수는 다음 식을 사용해서 계산하는데, 각 표시가 기준마다 의미하는 바가 다르므로 그 아래의 표를 참고해주시기 바랍니다.
- ( Correct Number - Granual Penalty ) / Total Number
이전에 객체 인식 문제는 객체의 위치와 클래스를 분류하는 문제였다면, 문자 인식은 1개의 클래스(텍스트)로 구분된 여러 객체들을 인식하는 문제입니다. 흔하게 Optical Characer Recognition(OCR)으로 불리며, 다양한 소스(스캔 파일, 문서 이미지 등)에서 다양한 방식으로 입력(수기, 프린팅 등)된 텍스트를 변환하는 것 입니다.
문자 인식 문제는 환경에 따라 아래와 같이 크게 2가지로 분류할 수 있습니다. 전통적인 문서 형태에서 인식을 하는 것과 일상적인 이미지에서 문자를 인식(예를 들어, 도시 이미지에서 간판 인식)하는 문제 입니다. 후자는 Scene Text Recognition (STR)로도 불리며, 배경이나 문자의 형태가 더욱 복잡하기 때문에 문서보다 어렵다고 여겨집니다.
2. 주요 특징
OCR은 객체 탐지와 비슷한 것 같지만, 그것만이 갖고 있는 고유의 특징들이 있습니다. 먼저 클래스의 분류가 텍스트로만 분류된다는 점입니다. 일반 객체 탐지는 해당 객체가 무엇인지 분류해야 하는 작업이 존재하지만, 글자 검축은 텍스트라는 단일 클래스이기 때문에 위치만 예측하는 문제 입니다.
OCR의 대상에 따라 다양한 특성이 나타납니다. 논문과 같이 문자가 많은 경우는 매우 높은 객체 밀도를 보이기도 하고, 문장 형태로 된 데이터는 극단적으로 긴 종횡비가 나타나기도 합니다. 글자가 놓여있는 형태에 따라서 가로, 세로 쓰기에 따라 가로가 길거나 세로가 더 길 수 있습니다.
글의 목적에 따라서 글의 배치 형태(가로,세로 뿐 아니라 휘어진 형태까지), 크기, 심지어 폰트까지 달라지기도 합니다. 그리고 한글처럼 띄어쓰기에 따라 의미가 달라질 수 있는 언어의 경우 문자의 박스 형태가 모호하게 설정될 수도 있습니다. OCR 문제 해결을 위해서는 이러한 특징들을 고려해서 판단할 필요가 있습니다.
3. OCR 문제 해결
앞서 이야기한 것처럼 OCR은 글자 객체를 찾고(Text Detection), 글자를 인식(Text Recognition)하는 과정으로 이뤄져 있습니다. 이러한 과정을 모듈화해서 살펴볼 수 있는데, Text Detector / Text Recognizer / Serializer / Text Parser로 크게 4가지 구분할 수 있습니다.
3.1. Text Detector
Text Detector는 글자의 위치만 반환하는 역할을 수행합니다. 이미지를 입력으로 받아서 각 글자의 영역별 위치정보를 반환하게 됩니다. 이 때 반환하는 위치 정보는 (x, y, w, h)가 될 수도 있고, 각 점의 좌표를 반환할 수도 있습니다.
3.2. Text Recognizer
Text Recognizer는 Text Detector에서 나온 글자 영역 정보를 바탕으로 영역 내의 글자 인식을 수행합니다. 이미지 전체를 대상으로 판단하지는 않고 해당 영역만을 참고합니다. 이 task는 컴퓨터 비전과 자연어 처리를 모두 해야하는 작업으로 최근에 각광을 받는 Multi-modal의 성격을 띈다고도 볼 수 있습니다. Text Recognizer를 통과하게 되면 해당 영역의 글자 값을 반환하게 됩니다.
3.3. Serializer
Serializer는 해당 영역에서 인식한 글자를 자연어 처리를 할 수 있도록 정렬을 수행합니다. 예를 들어, 한글은 좌상단에서 우하단 방향으로 일반적으로 읽습니다. 그리고 단락별로 구분이 되어있기도 하죠. 이러한 규칙을 바탕으로 자연어를 처리할 수 있게끔 정렬을 수행합니다.
3.4. Text Parser
Text Parser는 앞서 정리된 텍스트들에서 의미를 부여하는 역할을 수행합니다. 많이 사용하는 방법 중 하나는 이미 정의된 key-value에서 글자 영역별 의미를 추출합니다. BIO Tagging을 통해 문장에서 정의된 개체에 대한 값을 추출하는 방법이 있습니다. BIO 태깅은 Begin(개체가 시작하는 부분), Inside(개체의 내부), Outside(개체가 아닌 부분)으로 나눠서 태그를 진행하는 방식입니다. 태그가 완료된 이후에는 개체인 B와 I에 대해서만 사용하는 방식입니다. [2]