Overview
- 이미지만을 고려하는 기존 OCR 서비스와는 달리, PDF에 담긴 정보까지 이용해 모바일 기사로 나타낼 수 있는 정보를 만드는 Serverless 기반 백엔드와 검수용 프론트엔드 개발 프로젝트
- 요구 사항을 분석해 AWS Serverless 서비스들을 이용한 구조로 문제를 쪼개고 각 Lambda의 초중반부 개발을 진행했습니다.
- 수백 건 단위의 Lambda concurrency를 동원해 수십 페이지 단위의 PDF 정형화를 동시에 진행할 수 있었습니다.
Technology
- S3 presigned url을 이용해 PDF를 업로드하면 PDF 정형화 Step Function이 호출되도록 구성
- PDF를 HTML로 변환해서 좌표 정보를 추출하는 Lambda 개발 및 유지 보수
- Step Functions Activity Worker 를 이용한 이미지 처리 Worker 개발
- 모든 Lambda와 Step Function의 event payload 문서화 및 관리
Milestones
마일스톤 별로 집중했던 개발 내용에 따라서 정리했습니다.
1st. 신문 레이아웃 이미지 처리 돌려보기
- pdf를 문서보다는 이미지 데이터로 간주해 레이아웃에 대한 object detection 모델을 적용해 기반 기술로 활용
- 제목, 문단, 이미지 등 기사 요소를 레이아웃이라고 정의하고 layout-parser Python library 적용
2nd. 통합 Step Function 구성
- pdf를 변환하고 데이터를 추출하는
PDF ConverterLambda를 pdf2htmlEX 기반으로 구축 - stefuna
라이브러리로 Step Functions Activity Worker 형태의
Layout Parser라이브러리 서비스화 Group article: 모든 결과를 종합해 기사 별로 묶는 알고리즘을 마지막에 배치- S3 presigned url을 통해 신문 pdf를 S3에 업로드하면 아래와 같은 Step Function이 구동되고 SQS를 통해서 처리 결과를 획득할 수 있는 아키텍처; AWS docs
stateDiagram-v2
pdf2naverocr: PDF Converter
layout_parser: Layout Parser
news: Group articles
[*] --> pdf2naverocr
pdf2naverocr --> layout_parser
layout_parser --> news
pdf2naverocr --> news
news --> SQS
SQS -->[*]
3rd. 결과 품질 개선, 결과 저장, 검수용 FE
- 워드 프로세서를 이용해 위에서부터 아래로 pdf를 작성한 경우와 그렇지 않은 경우로 나눠 알고리즘 개선
- 띄어쓰기 정제 모듈 도입
- 아래와 같이 용어를 정의하고 DB 스키마 정의
신문 권호 - 페이지 - 기사 - 레이아웃
- serverless-express 를 이용해 Step Function 내부와 검수용 Frontend에서 Postgres DB에 접근할 수 있도록 함
stateDiagram-v2
pdf2naverocr: PDF Converter
layout_parser: Layout Parser
news: Group articles
express: Serverless Express
db: Postgres
express --> db
[*] --> pdf2naverocr
pdf2naverocr --> express
pdf2naverocr --> layout_parser
layout_parser --> news
layout_parser --> express
pdf2naverocr --> news
news --> Spacing
Spacing --> SQS
Spacing --> SNS
Spacing --> express
express --> Frontend
SQS --> Frontend
Frontend --> [*]
4th. 구조 개선 및 Naver OCR로 텍스트 소실 PDF 처리
- pdf 업로드 로직에 pdf를 장별로 분할하는 기능 추가
- Naver OCR을 적용해 텍스트 추출이 불가능한 pdf에 대응
- 텍스트의 출처를 원본 pdf와 Naver OCR로 나누어 별도의 파이프라인을 만들어 레이아웃 별로 텍스트를 할당하고 띄어쓰기를 보정함
- 레이아웃을 기사 별로 묶는 알고리즘을 텍스트 처리와 분리해 개발과 테스트를 독립적으로 수행함
- 마지막에 Step Function 바깥에서 DB 쿼리를 통해서 텍스트의 출처를 OCR과 PDF 중 선택하고 변경할 수 있음
flowchart TD
pdf2naverocr[PDF Converter]
express[Serverless Express]
db[Postgres]
layout_parser[Layout Parser]
ocr_layout[OCR Layout]
ocr_spacing[Spaced OCR Text]
pdf_spacing[Spaced PDF Text]
news[Group articles]
final[Final Articles with text]
express --- db
express --- Redis
Start --> pdf2naverocr
pdf2naverocr -.- express
pdf2naverocr --> news
pdf2naverocr --> layout_parser
layout_parser -.- express
pdf2naverocr --> OCR
OCR -.- express
layout_parser --> news
pdf2naverocr --> pdf_spacing
pdf_spacing -.- express
layout_parser --> ocr_layout
OCR --> ocr_layout
ocr_layout -.- express
ocr_layout --> ocr_spacing
ocr_spacing -.- express
news -.- express
news --> final
pdf_spacing --> final
ocr_spacing --> final
final --> SQS
final --> SNS
final -.- express
express --> Frontend
SQS --> Frontend
Lessons
- pdf 자료 구조에 대한 이해를 얻었습니다.
- AWS Serverless 서비스들을 조합한 아키텍처로 비즈니스 로직이 많이 들어간 대용량 데이터 처리를 효율적으로 할 수 있음
- 프로젝트 기간 중 AWS SDK integration for Step Functions 기능이 출시되며 Step Functions 내부에서 연동이 가능한 AWS 서비스들이 갑자기 많아졌는데, 이것를 보고 AWS가 Serverless를 정말 강력하게 추진하고 있음을 느꼈습니다.
- 클라우드 아키텍처의 복잡성에도 불구하고 수동 배포를 한 탓에 종합적인 진행 상황이 잘 관리되지 않아 연동과 테스트가 쉽지 않았었습니다. 복잡성이 있는 Serverless 프로젝트에는 CDK를 반드시 도입할 계획으로 개인적으로 미리 기술을 익혀두고 있습니다.