지능형 텍스트 자동 처리 기술 (이어짐)

자동 텍스트 처리 시스템

프로젝트 저장소: https://github.com/jiangnanboy/AutoText

본 도구는 문서 오류 보정, 이미지 내 텍스트 추출(OCR), 표 구조 인식 등 주요 기능을 제공합니다.

주요 기능

  • 문장 오류 수정
  • 이미지 기반 텍스트 인식
  • 표 형식 구조 분석
  • 향후 개선 방향
  • 연락처 및 라이선스 정보

오류 보정 기능

  • jcorrector 라이브러리 기반으로 다양한 오류 정정 알고리즘 적용
  • 지원되는 기법:
  • 고전적 n-그램 기반 오류 검출
  • 딥러닝 기반 문법 오류 보정
  • 중국어 문법 규칙 기반 패턴 매칭
  • 성어 및 전문 용어 오류 처리

사용 예시는 examples/correct/ 폴더 또는 별도의 jcorrector 프로젝트에서 확인 가능합니다.

이미지 텍스트 추출 (OCR)

  • PaddleOCR의 객체 탐지 및 문자 인식 모델을 사용하며, ONNX 포맷으로 변환하여 실행 최적화
  • 이미지 전처리를 통해 CPU 환경에서도 평균 10초 내외의 처리 시간 달성
  • 사용 방법은 examples/ocr/text/OcrDemo.java 참조

Java 코드 예시:

String imagePath = "examples\\ocr\\img_test\\text_example.png";
Path imageFile = Paths.get(imagePath);
Image image = ImageFactory.getInstance().fromFile(imageFile);

String detectionModelPath = OcrDemo.class.getClassLoader()
    .getResource(PropertiesReader.get("text_recog_det_model_path"))
    .getPath()
    .replaceFirst("/", "");

String recognitionModelPath = OcrDemo.class.getClassLoader()
    .getResource(PropertiesReader.get("text_recog_rec_model_path"))
    .getPath()
    .replaceFirst("/", "");

OcrApp ocrApp = new OcrApp(Paths.get(detectionModelPath), Paths.get(recognitionModelPath));
ocrApp.init();

long startTime = System.currentTimeMillis();
Pair<List<TextListBox>, Image> result = ocrApp.ocrImage(image, 960);
System.out.println("처리 시간: " + (System.currentTimeMillis() - startTime) / 1000.0 + "초");

for (TextBox box : result.getLeft()) {
    System.out.println(box);
}

ocrApp.saveImageOcrResult(result, "ocr_result.png", "examples\\ocr\\output");
ocrApp.closeAllModel();

출력 결과 (좌표와 텍스트):

[800.0, 609.0, 877.0, 609.0, 877.0, 645.0, 800.0, 645.0] → "8.23%"
[433.0, 607.0, 494.0, 607.0, 494.0, 649.0, 433.0, 649.0] → "68.4"
[96.0, 610.0, 316.0, 611.0, 316.0, 641.0, 96.0, 640.0] → "주주권익비율 (%)"
...

결과 이미지에는 추출된 텍스트와 그 위치가 함께 표시됩니다.

표 구조 인식

  • OpenCV 기반 규칙 기반 알고리즘 활용
  • 인식 가능한 표 유형:
  • 외곽선 있는 표
  • 외곽선 없는 표
  • 일부 외곽선이 있는 표

사용 예시는 examples/ocr/table/TableDemo.java 파일에 포함되어 있음.

Java 코드 예시:

public static void detectBorderedTable() {
    Mat img = imread("D:\\project\\AutoText\\src\\main\\java\\examples\\ocr\\img_test\\bordered_example.png");
    List<List<List<Integer>>> cells = BorderedRecog.recognizeStructure(img);
    System.out.println(cells);
}

출력 예시 (셀 좌표 리스트):

[
  [[58, 48, 247, 182], [560, 48, 247, 182], ...],
  [[58, 234, 247, 118], [309, 234, 247, 118], ...],
  ...
]

각 요소는 각 셀의 좌상단, 우상단, 우하단, 좌하단 좌표를 포함합니다.

표 구조 + OCR 통합 처리

  • 표의 경계 구조와 텍스트 내용을 동시에 추출
  • examples/ocr/table_text/TableTextDemo.java 참고

예시 코드:

public static void main(String... args) throws IOException {
    String imgPath = "D:\\project\\AutoText\\src\\main\\java\\examples\\ocr\\img_test\\bordered_example.png";
    TableText tableText = new TableText();
    List<TextListBox> results = tableText.tableTextRecog(imgPath);
    
    for (TextBox box : results) {
        System.out.println(box);
    }
}

출력 결과 (표 셀 좌표 + 텍스트):

[58.0, 48.0, 305.0, 48.0, 305.0, 230.0, 58.0, 230.0] → "절차 星期"
[309.0, 48.0, 556.0, 48.0, 556.0, 230.0, 309.0, 230.0] → "월요일"
[58.0, 234.0, 305.0, 234.0, 305.0, 352.0, 58.0, 352.0] → ""
[309.0, 234.0, 556.0, 234.0, 556.0, 352.0, 309.0, 352.0] → "국어"
...

이러한 결과는 표의 구조와 내용을 동시에 파악하는 데 유용합니다.

개발 계획 (Todo)

  • jcorrector 연동 및 코드 통합
  • Java 기반으로 PaddleOCR 모델 활용한 이미지 텍스트 추출 구현
  • 규칙 기반 표 인식 모듈 확장 및 최적화
  • 표 구조 인식과 텍스트 추출의 통합 처리 강화

태그: java OCR PaddleOCR OpenCV Table Recognition

7월 1일 17:29에 게시됨