Android OCR 한글 및 영문 인식 Tesseract 오류 정리, 질문, QNA

2016. 12. 7. 14:17mobile/android

Android OCR 한글 및 영문 인식 Tesseract 오류 정리, 질문, QNA

 

 

OCR 프로토타입 앱을 만들 기회가 있어서 아래 포스팅을 작성한 적이 있다.

 

Android OCR 한글 및 영문 인식 Tesseract 샘플 프로젝트 테스트

 

이 포스팅에 대해서 이렇게 많은 사람들이 질문을 할줄은 몰랐다.

 

벌써 약 80개의 댓글과 답글이 달려있다.

 

그 중에서 일부 오류와 해결방법, 질문들을 별도로 정리해보았다.

 

 



 

1. 인식률과 인식 시간 이슈

 

본 예제는 테스트 예제입니다.
구현과 실행에 의의를 두었고 그렇기 때문에 무료로 제공되 Tesseract를 사용하였습니다.
별도의 커스터마이징 및 트레이닝 없이는 속도와 인식률이 낮을 수 밖에 없습니다.
인식률을 높이기 위해서는 트레이닝(학습)이 필요합니다.
이는 폰트, 글자크기, 간격 등 여러 사항을 고려할 수 있습니다.
Tesseract의 장점이라고 할 수 도 있겠습니다.
그게 아니라면 ABBYY OCR을 이용하시는 것도 좋습니다.
체험 무료버전이 기간제로 존재하고 인식률은 매우 높기로 알려져있습니다 ^^
트레이닝에 관한 내용은 정리한게 없습니다.
다만 구글링해보면 아래와 같은 글들을 볼 수 있는데 그 쪽을 참고하면 좋을 듯 싶습니다 ^^

 

 

 


2. 한자 인식

 

별도로 한국에서 배우는 한자로 한정지은 한문 인식이 가능하지는 않은거같아요
다만 중국어나 일본어는 인식이 가능하다는 내용은 있네요
다른 방법으로는 본문에 있는 데이터파일을 직접 만들수 있다고 알고있어요
한문에 대한 데이터파일을 만들고 트레이닝을 통해서 한자인식을 가능하도록 하는 방법이 있을듯 합니다

 

 

 

 

3. E/Tesseract(native)(6593): Could not initialize Tesseract API with language=kor!
A/libc(6593): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 6593 (roid.ocr.simple)

lang을 kor로 바꾸고 실행 시키면 사진 찍는거 까지는 되는데 사진찍고 인식과정에서 오류뜨면서 강제종료

 

트레인 파일 경로를 assets/tessdata 인지 확인

 

 

 


4. 사진을 찍고 그 찍은 사진 데이터를 넘겨주는 부분이 어딘지 알 수 있을까요?

 

onPhotoTaken 함수

 

 

 


5. 이미지파일을 가져와서 인식하려면

 

SimpleAndroidOCRActivity 에서 startCameraActivity 함수를 보면 카메라를 호출하고 있음
이 부분을 이미지 파일을 가져오는 것으로 수정

 

 

 

 

6. cannot resolve corresponding JNI function ...

 

tess-two 라이브러리는 android API level 9 ~ 22 까지 허용합니다.
그 말인 즉 API level 23 부터는 책임지지 않겠다는 뜻이 되겠네요.
프로젝트와 디바이스의 버전을 맞춘 후 테스트 하기를 권장합니다.

하지만 API level 23이상의 카메라의 권한은 project 에서 수정가능할 것으로 보이며
http://webnautes.tistory.com/822 여기를 참고하시면 해결가능해 보입니다.

 

 

 

 

7. Caused by: java.lang.IllegalArgumentException: Data file not found at /storage/emulated/0/SimpleAndroidOCR/tessdata/eng.traineddata

 

traineddata 파일은 assets/tessdata 폴더에 그냥 카피해서 넣으면 된다.
assets 폴더 위치는 main 아래에 꼭 있어야 하고 res 폴더와 같은 레벨임

 

 




8. Error:Execution failed for task ':tess-two:ndkBuild'.
 > A problem occurred starting process 'command 'ndk-build.cmd''


 tess-two 프로젝트에서 build.gradle 파일을 보시면 중간쯤에

 

// Call external ndk-build(.cmd) script to build the native code
 task ndkBuild(type: Exec) {
 def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
 commandLine "ndk-build${ndkBuildExt}", '-C', file('.').absolutePath,
 '-j', Runtime.runtime.availableProcessors()
 }

 tasks.withType(JavaCompile) {
 compileTask -> compileTask.dependsOn ndkBuild
 }

 // Cleanup task to remove previously generated binaries
 task ndkClean(type: Exec) {
 def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
 commandLine "ndk-build${ndkBuildExt}", '-C', file('.').absolutePath, 'clean'
 }

 tasks.withType(Delete) {
 cleanTask -> cleanTask.dependsOn ndkClean
 }

 

이런 부분이 있을 거에요

여기에서 경로가 맞는지 확인한번 해주세요 ㅎㅎ

소스상으로 동일하다면 ndk-build 경로를 잘못 지정해준 경우일 수 있는데

NDK 를 설치하셨는지, 환경변수에 잘 등록하셨는지 확인해볼 필요가 있을 듯 합니다.

 

 

 


9. Plugin with id 'com.github.dcendents.android-maven' not found

 

현재까지 알려주신 내용중에서 총 3가지 해결방법이 있음

 

9-1. tess-two 모듈의 build.gradle 을 수정해야 하는데 프로젝트의 build.gradle를 수정한 경우 발생할 수 있음

 

9-2. 최근 새로 생긴 설정인지 몰라도 javadocJar 밑에 maven 관련 설정이 생겼습니다.

javadocJar밑에 artifacts가 있고 그 밑에 maven관련 내용들을 전부 지워주니 해결되네요.
물론 맨 윗줄 plugin단에서도 library를 제외한 것들은 모두 지웠습니다.
구글링 해봤는 데 지워도 크게 문제가 없다더군요.

 

9-3. root경로의 build.gradle 파일을 수정 (아래 2줄 추가)

 

classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'

 

 

아래는 build.gradle 파일 전체 소스입니다. (참고용)

 

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
 repositories {
 jcenter()
 }
 dependencies {
 classpath 'com.android.tools.build:gradle:2.1.3'
 classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
 classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'

 // NOTE: Do not place your application dependencies here; they belong
 // in the individual module build.gradle files
 }
}

allprojects {
 repositories {
 jcenter()
 }
}

task clean(type: Delete) {
 delete rootProject.buildDir
}

 

 

 

 

10. Error:Execution failed for task ':tess-two:ndkClean'.
> A problem occurred starting process 'command 'ndk-build.cmd''

 

tess-two/build.gradle 파일 보시면 44라인 쯤 보시면 ndkClean 설정있습니다. 이부분을 다시설정해 보세요.

 

 

 


11. 숫자만 인식하는 방법 ?

 

- SimpleAndroidOCRActivity에 recognizedText = recognizedText.replaceAll("[^0-9]+", " "); 로 수정
http://stackoverflow.com/questions/14001338/tesseract-ocr-only-numbers 참고

 

 

 

 

12. NDK설치도 완료하고 1,2과정까지 다 진행하고, tess-two모듈을 import module하는 과정까지 진행했는데 왜 저는 project structure부분에서 Modules에 tess-two가 뜨지 않을까요?
Dependencies에서 module dependency에 들어가면 tess-two가 있는데 project structure부분에서 Modules에 tess-two가 뜨지 않는 이유가 궁금합니다.

 
importm 할 때 대기시간이 길어지면서 안드로이드스튜디오가 멈춘거같아서 import 하는 중간에 안드로이드 스튜디오를 강제종료하고 다시 켰어요
그랬더니 Modules 에 나오지않더라구요 그래서 다시 import 하고 가만히 계속 기다렸더니 import 가 완료됬고 정상적으로 Modules 에 등록되어 있었습니다.
즉 정상적으로 import 후 project structure 를 실행해보니 Modules 에 tess-two 가 뜨는것을 확인했습니다.

 

 

 

 

13. Error:No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi

 

NDK 업그레이드 또는 설치 오류 등 여러 이유가 있을 수 있음
정상적으로 재설치하는 것을 권장함
NDK 다운로드 : https://developer.android.com/ndk/downloads/index.html