ria-com/nomeroff-net

textDetector.predict outputs broken text

Closed this issue · 5 comments

After training the OCR using the custom dataset, the test function of the textDetector was able to correctly output the data from images, but for some reason, I have an error during execution of the predict function. Looks like there is some text postprocessing issue, as it seems the number are shown correctly and "-" and "_" are replaced by "X". Notebooks for running and training and sample data jsons are attached. Do you have any ideas how to solve it?

https://gist.github.com/kurshakuz/1f84552e674c0c72bf063213d4b93d4d

image
image
image

Интересно, что оба метода в конце вызывают одну и ту же функцию predict внутри OCR.py, тем не менее выход получается разный в завимости от того как инициализируется TextDetector.
При загрузке подобным образом, аутпут выходит как и ожидается

from NomeroffNet.Base import OCR
class kz(OCR):
    def __init__(self):
        OCR.__init__(self)
        # only for usage model
        # in train generate automaticly
        self.letters = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "E", "H", "I", "K", "M", "O", "P", "T", "X"]
        
        self.EPOCHS = 1
ocrTextDetector = kz()
model = ocrTextDetector.load("./models/anpr_ocr_kz-1993_2021_04_13_tensorflow_v2.h5")
imgDir = './dataset/test-data/img/*'
imgs2 = [cv2.imread(img_path) for img_path in glob.glob(imgDir)]
ocrTextDetector.predict(imgs2)

Но когда хочу запустить процедуру через следующую процедуру, результат получается совсем другой. Может я как то не так его иницилизирую?

from NomeroffNet.TextDetector import TextDetector
textDetector = TextDetector({...})
textArr = textDetector.predict(zones, regionNames, countLines)

Это происходит из за того что в вашей натренированной модельке
и в
https://github.com/ria-com/nomeroff-net/blob/master/NomeroffNet/TextDetectors/kz.py
не совпадают letters
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "E", "H", "I", "K", "M", "O", "P", "T", "X"]
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
И поэтому неправильно дешифруется выход из сети

@dimabendera с нуля перетрейнил используя правильные леттерс, но ошибка выходит вся та же:
https://gist.github.com/kurshakuz/bf28fa2fbb4be046c6f840154958cf83

Тут скорее нужно было исходить от обратного и просто поменять letters в классе kz при инференсе.
При тренировке мы обьясняем что, letters генерируется автоматичски для датасета.
Если вы передатите в функцию ocrTextDetector.prepare параметр verbose=1
то вы увидете обьяснение для вашего набора данных
Screenshot from 2021-04-14 15-37-02
тут Letters train == Letters val == Letters test
И этот сгенерённый и отсортированный в алфавитном порядке по датасету Letters и будет вашим конечным набором letters.
В итоге после тренировки модели стоит только обьявить класс в TextDetectors по примеру https://github.com/ria-com/nomeroff-net/blob/master/NomeroffNet/TextDetectors/kz.py и использовать его как шаблон в модуле TextDetector или же подгружать как отдельный модуль и использовать

Спасибо, проблема решена! Теперь понятно как подгружать модуль отдельно