자동 텍스트 처리 시스템
프로젝트 저장소: 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 모델 활용한 이미지 텍스트 추출 구현
- 규칙 기반 표 인식 모듈 확장 및 최적화
- 표 구조 인식과 텍스트 추출의 통합 처리 강화