이전 포스팅에서 한글데이터를 다운받아 한글 Recognition 성능을 높이고자 시도하였다. 그러나 프로젝트 마감기한이 다가오고 4기가가 넘는 데이터양과 학습시간을 고려하니 직접 fine tuning을 시키는 방법보다는 pre train모델을 몇개 가져와서 성능을 비교해보는 방법을 택했다.
결론적으로 Text Detection 모델을 따로 가져와서 검출된 roi를 tesseract로 넘기고 OCR을 진행하는 방식을 택하였다.
위와같은 방법을 택한 이유는 다음과 같다. Tesseract를 기본 OCR모델로 사용한다. 이때 text가 아닌 영역역을 검출하거나 혹은 띄어진 단어인데 같은 단어로 인식하는 문제가 발생했다.
따라서 이를 해결하고자 Text Detection모델을 따로 가져온 것이다. 그렇다면 왜 CRAFT인가? 이유를 알기위해 CRAFT가 도출하는 결과값을 살펴본다.
CRAFT는 두가지 Score를 리턴해준다.
text detection 이후 roi 값을 주기 때문에 해당 영역에만 tesseract를 적용하여 ocr을 수행할 수 있어서 앞선 문제점이 해결되었다. 또한 Affinity Score를 가지고 우리가 직면한 문제를 해결할 수 있었다. 같은 단어로 인식하던 글자를 threshold를 높혀가며 다른 단어로 인식시킬 수 있었다.
따라서 이후에서는 craft를 detection 모델로 가져와서 roi를 활용할 것이다. 또한 이를 tesseract로 받아 최종 OCR을 진행한다.
사용한 코드는 다음과 같다.
def get_roi(image): # load models refine_net = load_refinenet_model(cuda=False) craft_net = load_craftnet_model(cuda=False)
# perform prediction
prediction_result = get_prediction(image=image,
craft_net=craft_net,
refine_net=refine_net,
text_threshold=0.9,
link_threshold=0.5, # 클수록 잘게 자름
low_text=0.6, # 작을수록 bboxes 오차범위 키움
long_size=1280)
# get roi
roi = []
for i in range(len(prediction_result["boxes"])):
left, top = map(int, prediction_result["boxes"][i][0])
right, bottom = map(int, prediction_result["boxes"][i][2])
# print(left, top, right, bottom)
roi.append([left,top,right,bottom])
# print(roi)
return roi ```
pytesseract.pytesseract.tesseract_cmd =’C:/Program Files/Tesseract-OCR/tesseract.exe’
def clean_text(read_data): text = re.sub(‘[0123456789]’, ‘’, read_data) return text
def craft_tesseract(dst, th1): roi = craft.get_roi(th1) myData=[] numData=[] for x,r in enumerate(roi): left, top = r[0]-10,r[1]-5 right, bottom = r[2]+5,r[3]+5 imgCrop = th1[top:bottom , left:right] #h,w # cv2.imshow(str(x), imgCrop)
config = r'--oem 2 --psm 6 -c tessedit_char_whitelist=0123456789-.'
number_info = pytesseract.image_to_string(imgCrop, lang='kor',config=config)
numData.append(number_info)
if ('-' in number_info) and ('.' not in number_info) and len(number_info) > 8:
cv2.rectangle(dst, (left,top), (right,bottom), (0,0,0), -1)
myData = "".join(numData)
return myData, dst ```
참고사이트