이태원 참사 추모 메시지 디지털화 프로젝트 "이태원 기억담기 캠페인" 작업 후기 (1/n) 저는 기획+데이터 전처리 등을 담당했습니다. https://campaigns.do/campaigns/1686/stories/1038

한국 데이터저널리즘 어워드 수상! + 캠페인 제작기 (데이터 전처리 편) - | 빠띠 캠페인즈

지난 11월 28일 열린 한국 데이터저널리즘 어워드 시상식에서 "이태원 기억담기 캠페인"이 “올해의 오픈 데이터 특별상”을 수상했습니다🎉 시상식에 앞서 진행된 데이터저널리즘코리아 컨퍼런스에서는 캠페인의 배경, 의의, 설계 과정 등을 소개했습니다. 캠페인 설계 과정, 특히 기술적인 요소들에 관해서는 이번 컨퍼런스에서 처음 발표했는데요. 그 내용을 아래 소개합니다. *추모메시지 아카이브 작업의 진행 경과와 참여형 아카이브 구축 활동의 사회적 의미에 관해서는 앞서 10월에 열린 10.29 이태원 참사 3주기 피해자권리위원회 토론회 발표자료(링크 내 PDF 첨부파일)를 참고해 주세요! 이태원 기억담기 캠페인 제작기: 데이터 전처리 편 글: 아침 (빠띠 공익데이터팀)  ‘이태원 기억 담기’라는 이름으로 진행된 추모메시지 기록보존활동은 다음과 같이 도식화할 수 있습니다.  도표 원본: 시민대책회의 피해자권리위원회 박이현 메시지 수거와 현장 정비에서 출발해 각종 단계를 거쳐 사회적 공론화로 향하는 이 활동에서, 10.29 이태원참사 시민대책회의(이하 시민대책회의)와 빠띠가 함께 진행한 <이태원 기억담기 캠페인>(이하 캠페인)은 [디지털 스캔 - 이미지 처리 - 텍스트 검수 - (사회적 공론화)]까지를 다루는 작업입니다. 간단히 말하자면, 이번 캠페인은 이태원 참사 추모 메시지를 디지털화하는 프로젝트입니다. 구성 요소는 다음과 같습니다. 디지털 스캔이미지 처리개별 메시지 구획텍스트 인식 (OCR, 언어 판독 등)텍스트 검수를 위한 크라우드소싱 캠페인 디지털 스캔 디지털 스캔 작업은 시민대책회의 피해자권리위원회 기록보존팀 측 자원활동가들이 밤늦게까지 고생하며 진행했습니다. 포스트잇 등 추모 메시지를 A4용지 위에 부착하여 보존한 기록물을 북스캐너로 스캔했습니다. 이렇게 스캔한 이미지가 총 6천 장 가량입니다. 개별 메시지 분리 1: 자동구획 A4용지에는 대부분 여러 건의 추모 메시지가 담겨 있어, 스캔한 이미지에서 개별 포스트잇 이미지를 하나씩 분리해야 했습니다. 처음에는 다음과 같은 방법을 검토했습니다. 수작업으로 이미지를 하나씩 구획한다 (이른바 ‘누끼 따기’)포스트잇을 탐지할 수 있는 CV 모델을 학습시킨다 (참고 예시1, 예시2) 수작업으로 분리하기에는 이미지 양이 많았기 때문에 어떻게든 자동화를 하고 싶었습니다. 그런데 객체 탐지 모델을 학습시키기 위한 훈련 데이터를 만들고 테스트하는 작업도 부담스럽기는 마찬가지여서 고민하던 차에, 사전 학습된 이미지 구획 모델로도 어느 정도 결과를 얻을 수 있다는 것을 확인했습니다.  메타가 공개한 Segment Anything Model 2를 적용했을 때, 파인튜닝 없이 개별 메시지 구획이 가능했습니다. 다만 부정확한 구획도 다수 포함하고 있어 해당 오류를 걸러낼 방법이 필요했는데요. 이를 위해 두 가지 접근을 취했습니다. 1. 개별 메시지가 아닌 것으로 추정되는 구획을 제거하기 위해 다음과 같은 간단한 휴리스틱 로직을 적용했습니다.  구획 예측 신뢰도구획 가로/세로가 A4 용지 전체에 육박하는지 여부구획된 이미지를 다시 구획했을 때, 하위 구획 예측에 전체 사이즈 구획이 포함되는지 여부 2. 휴리스틱으로 필터링한 구획별 이미지를 다시 수동으로 검수했습니다. 개별 메시지 분리 2: 수동검수 개별 이미지 구획 예측-검수 과정에서 Label Studio나 CVAT 같은 데이터 어노테이션 전문 툴을 활용할지 잠시 고려했습니다. 다만 이번 캠페인 작업에는 오버킬이라고 판단하여 예측 작업에는 구글 Colab을, 검수에는 Airtable을 이용하기로 했습니다. (이후 저는 이 판단을 후회하게 됩니다.) Airtable은 웹 기반 데이터베이스 어플리케이션입니다. 스프레드시트처럼 보이지만 구글 시트 등 일반 스프레드시트와 달리 이미지 첨부가 잘 구현되어 있고, 간단한 웹 인터페이스에서 버튼을 클릭하면 데이터 필드를 업데이트하는 등의 인터랙션을 노코드로 설계할 수도 있습니다. 이런 특징 덕에 프로젝트 팀원들이 함께 검수 작업을 진행하기에 수월한 툴이라고 생각했습니다. Airtable 인터페이스로 잘못 구획된 사례나, 잘 구획되었는데 휴리스틱 로직이 오류로 분류한 사례를 바로잡았습니다. 다만 이렇게 진행할 경우 검수에 한계가 있었는데, 잘못 구획된 사례를 위양성(false positive)라고 보았을 때, 반대로 아예 포스트잇을 인식하지 못해 구획 자체가 없는 위음성(false negative) 사례도 있기 때문입니다. 이 경우 수동으로 구획을 추가 지정해야 하는데, Airtable로는 무리였습니다. 결국 Airtable에서 검수한 결과를 다시 가져와서 수동으로 추가 구획을 지정하고 메타데이터를 저장하는 커스텀 툴을 p5.js 라이브러리로 구현했습니다. 이 커스텀 툴에 기능을 하나둘 추가하며 생각했습니다. 그냥 데이터 어노테이션 전문 툴을 처음부터 이용할 걸 그랬다고… 하지만 되돌아가기엔 또 애매한 타이밍이 되어버려서, SAM2 → (Airtable) → 커스텀 검수 툴의 단계를 거쳐 이미지 구획을 완성했습니다.  메시지 OCR 이렇게 전처리한 개별 추모메시지 이미지가 3만3천여 건. 다음 순서로는 이미지에 OCR을 적용하여 초벌 텍스트를 추출했습니다. 기록보존팀이 예전에 OCR을 시도했을 때는 결과가 좋지 않다고 말씀해 주셨는데, AI 업체 간 경쟁 추세 속에서 OCR 모델 성능도 빠르게 변하는 듯해 최신 API를 활용해보니 나쁘지 않은 결과를 얻을 수 있었습니다. (OCR에는 업스테이지 Document Parse 모델을 이용했습니다. 마침 비영리기관 대상 API 무료 지원 프로그램에 선정되어 감사하게도 해당 API를 무상으로 이용할 수 있었습니다.) 다만 추모메시지는 손글씨인 만큼, 특히 흘려쓴 글씨일 수록 기계 인식에 한계는 여전히 있었고, 더구나 습기에 번지는 등 훼손된 글씨도 적지 않아 사람이 반드시 추가로 수정해주는 과정을 거쳐야 했는데요. 기술적 한계인 셈이지만, 한편으로 이 캠페인을 기획하는 단계에서부터 중점을 두었던 것은 (단지 효율적인 디지털화만이 아니라) 기록 보존 과정에 많은 사람이 참여하여 연대를 확장하고, 또 참여 과정에서 이들 추모메시지가 환기되는 효과였기에 기획 의도에 부합하는 상황이었습니다. 메시지 언어 탐지 이태원 참사 추모메시지는 외국어로 쓰인 경우가 많습니다. 이미지를 텍스트로 옮길 때 특정 언어 구사자가 (자신이 읽고 입력할 줄 아는) 해당 언어로 쓰인 메시지를 작업할 수 있도록, 메시지의 언어를 파악하는 것이 유용합니다. 다만 기존의 물리적 보존 과정에서는 한국어/외국어 여부만 분류가 된 상태였기에, 언어 판독을 위해 파이썬 lingua 라이브러리를 활용했습니다. 다만 이 경우에도 (손글씨에 대한 OCR 판독이 부정확한 편이기에) 기계로 탐지한 언어가 꼭 들어맞지는 않아, 영어-일본어-중국어 등 비교적 정확히 판독되는 언어를 제외하고는 ‘기타 외국어’로 일괄 분류했습니다. 나가며 이처럼 스캔 - OCR - 언어 탐지 등 전처리 과정을 거친 이미지를 클라우드에 업로드하고, 텍스트 자료로 변환하기 위한 크라우드소싱 캠페인을 진행했는데요. 바로 이 캠페인이 ‘이태원 기억담기 캠페인’입니다. 디지털 시민광장 빠띠 플랫폼에 원래 있던 ‘캠페인’ 기능을 기반으로, 이번 프로젝트를 위한 특별 캠페인을 개발했습니다. 캠페인의 기술적 구현과 참여자 경험 설계에 관해서는 다음 기회에 소개하겠습니다. 이태원 기억담기 캠페인은 아직 끝나지 않았습니다. 특히 아직 입력해야 할 외국어 메시지가 많이 남아 있는데요. 추모 메시지를 디지털 자료로 잘 변환하여 프로젝트를 마무리할 수 있도록 여러분의 많은 참여 부탁드립니다. 이태원 기억담기 캠페인 바로가기

campaigns.do · 내 손 안의 광장, 빠띠

0

If you have a fediverse account, you can quote this note from your own instance. Search https://hackers.pub/ap/notes/019b3b3a-e82d-739d-96fd-20bca44d6d38 on your instance and quote it. (Note that quoting is not supported in Mastodon.)