mirror of
https://github.com/RapidAI/RapidOCR.git
synced 2026-11-12 05:50:49 +08:00
106 lines
3.8 KiB
Python
Executable File
106 lines
3.8 KiB
Python
Executable File
# !/usr/bin/env python
|
|
# -*- encoding: utf-8 -*-
|
|
# @File: utils.py
|
|
# @Time: 2021/05/22 10:53:17
|
|
# @Author: Max
|
|
import cv2
|
|
import os
|
|
import imghdr
|
|
import numpy as np
|
|
|
|
|
|
def get_image_file_list(img_file):
|
|
imgs_lists = []
|
|
if img_file is None or not os.path.exists(img_file):
|
|
raise FileNotFoundError("not found any img file in {}".format(img_file))
|
|
|
|
img_end = {'jpg', 'bmp', 'png', 'jpeg', 'rgb', 'tif', 'tiff', 'gif', 'GIF'}
|
|
if os.path.isfile(img_file) and imghdr.what(img_file) in img_end:
|
|
imgs_lists.append(img_file)
|
|
elif os.path.isdir(img_file):
|
|
for single_file in os.listdir(img_file):
|
|
file_path = os.path.join(img_file, single_file)
|
|
if imghdr.what(file_path) in img_end:
|
|
imgs_lists.append(file_path)
|
|
if len(imgs_lists) == 0:
|
|
raise FileNotFoundError("not found any img file in {}".format(img_file))
|
|
return imgs_lists
|
|
|
|
|
|
def check_and_read_gif(img_path):
|
|
if os.path.basename(img_path)[-3:] in ['gif', 'GIF']:
|
|
gif = cv2.VideoCapture(img_path)
|
|
ret, frame = gif.read()
|
|
if not ret:
|
|
print("Cannot read {}. This gif image maybe corrupted.")
|
|
return None, False
|
|
if len(frame.shape) == 2 or frame.shape[-1] == 1:
|
|
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2RGB)
|
|
imgvalue = frame[:, :, ::-1]
|
|
return imgvalue, True
|
|
return None, False
|
|
|
|
|
|
class CTCLabelDecode(object):
|
|
""" Convert between text-label and text-index """
|
|
|
|
def __init__(self, character_dict_path):
|
|
super(CTCLabelDecode, self).__init__()
|
|
self.character_str = []
|
|
assert character_dict_path is not None, "character_dict_path should not be None"
|
|
with open(character_dict_path, "rb") as fin:
|
|
lines = fin.readlines()
|
|
for line in lines:
|
|
line = line.decode('utf-8').strip("\n").strip("\r\n")
|
|
self.character_str.append(line)
|
|
dict_character = self.character_str
|
|
|
|
dict_character = self.add_special_char(dict_character)
|
|
self.dict = {}
|
|
for i, char in enumerate(dict_character):
|
|
self.dict[char] = i
|
|
self.character = dict_character
|
|
|
|
def __call__(self, preds, label=None, *args, **kwargs):
|
|
preds_idx = preds.argmax(axis=2)
|
|
preds_prob = preds.max(axis=2)
|
|
text = self.decode(preds_idx, preds_prob, is_remove_duplicate=True)
|
|
if label is None:
|
|
return text
|
|
label = self.decode(label)
|
|
return text, label
|
|
|
|
def add_special_char(self, dict_character):
|
|
dict_character = ['blank'] + dict_character
|
|
return dict_character
|
|
|
|
def get_ignored_tokens(self):
|
|
return [0] # for ctc blank
|
|
|
|
def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
|
|
""" convert text-index into text-label. """
|
|
result_list = []
|
|
ignored_tokens = self.get_ignored_tokens()
|
|
batch_size = len(text_index)
|
|
for batch_idx in range(batch_size):
|
|
char_list = []
|
|
conf_list = []
|
|
for idx in range(len(text_index[batch_idx])):
|
|
if text_index[batch_idx][idx] in ignored_tokens:
|
|
continue
|
|
if is_remove_duplicate:
|
|
# only for predict
|
|
if idx > 0 and text_index[batch_idx][idx - 1] == text_index[
|
|
batch_idx][idx]:
|
|
continue
|
|
char_list.append(self.character[int(text_index[batch_idx][
|
|
idx])])
|
|
if text_prob is not None:
|
|
conf_list.append(text_prob[batch_idx][idx])
|
|
else:
|
|
conf_list.append(1)
|
|
text = ''.join(char_list)
|
|
result_list.append((text, np.mean(conf_list)))
|
|
return result_list
|
|
|