def test_mm_rpred_bbox_default_tags(self): """ Tests recognition with default tag. """ pred = mm_rpred( defaultdict(lambda: self.model), self.overfit_line, { 'boxes': [[('foobar', [0, 0, 2544, 156])], [('default', [0, 0, 2544, 156])]], 'text_direction': 'horizontal', 'script_detection': True }, True) record = next(pred) self.assertEqual(record.prediction, 'ܡ ܘܡ ܗ ܡܕܐ ܐ ܐܐ ܡ ܗܗܐܐܐܕ') record = next(pred) self.assertEqual(record.prediction, 'ܡ ܘܡ ܗ ܡܕܐ ܐ ܐܐ ܡ ܗܗܐܐܐܕ')
def recognizer(model, pad, bidi_reordering, base_image, input, output, lines): try: im = Image.open(base_image) except IOError as e: raise click.BadParameter(str(e)) ctx = click.get_current_context() scripts = None st_time = time.time() if not lines: lines = input with open_file(lines, 'r') as fp: bounds = json.load(fp) # script detection if bounds.get('script_detection',False): scripts = set() for l in bounds['boxes']: for t in l: scripts.add(t[0]) it = rpred.mm_rpred(model, im, bounds, pad, bidi_reordering=bidi_reordering) else: it = rpred.rpred(model['default'], im, bounds, pad, bidi_reordering=bidi_reordering) preds = [] for pred in it: spin('Processing') preds.append(pred) message(u'\b\u2713', fg='green', nl=False) message('\033[?25h\n', nl=False) ctx = click.get_current_context() with open_file(output, 'w', encoding='utf-8') as fp: message(u'Writing recognition results for {}\t'.format(base_image), nl=False) logger.info(u'Serializing as {} into {}'.format(ctx.meta['mode'], fp.name)) if ctx.meta['mode'] != 'text': fp.write(serialization.serialize(preds, base_image, Image.open(base_image).size, ctx.meta['text_direction'], scripts, ctx.meta['mode'])) else: fp.write(u'\n'.join(s.prediction for s in preds)) if not ctx.meta['verbose']: message(u'\u2713', fg='green')
def recognizer(input_image, model, pad, no_segmentation, bidi_reordering, script_ignore, mode, text_direction, segments) -> None: bounds = segments # Script detection. if bounds['script_detection']: for l in bounds['boxes']: for t in l: scripts.add(t[0]) it = rpred.mm_rpred(model, input_image, bounds, pad, bidi_reordering=bidi_reordering, script_ignore=script_ignore) else: it = rpred.rpred(model['default'], input_image, bounds, pad, bidi_reordering=bidi_reordering) preds = [] with log.progressbar(it, label='Processing', length=len(bounds['boxes'])) as bar: for pred in bar: preds.append(pred) #-------------------- print('Recognition results = {}.'.format('\n'.join(s.prediction for s in preds))) if False: with open_file(output, 'w', encoding='utf-8') as fp: print('Serializing as {} into {}'.format(mode, output)) if mode != 'text': from kraken import serialization fp.write( serialization.serialize(preds, base_image, Image.open(base_image).size, text_direction, scripts, mode)) else: fp.write('\n'.join(s.prediction for s in preds))
def test_mm_rpred_bbox_ignore_tags(self): """ Tests mm_rpred recognition with ignore tags. """ pred = mm_rpred({'default': self.model}, self.overfit_line, { 'boxes': [[('foobar', [0, 0, 2544, 156])], [('default', [0, 0, 2544, 156])]], 'text_direction': 'horizontal', 'script_detection': True }, True, tags_ignore=['foobar']) record = next(pred) self.assertEqual(record.prediction, '') record = next(pred) self.assertEqual(record.prediction, 'ܡ ܘܡ ܗ ܡܕܐ ܐ ܐܐ ܡ ܗܗܐܐܐܕ')
def test_mm_rpred_bl_nobidi(self): """ Tests baseline recognition without bidi reordering. """ pred = mm_rpred( defaultdict(lambda: self.model), self.overfit_line, { 'lines': [{ 'tags': { 'type': 'default' }, 'baseline': [[0, 10], [2543, 10]], 'boundary': [[0, 0], [2543, 0], [2543, 155], [0, 155]] }], 'script_detection': True, 'type': 'baselines' }, bidi_reordering=False) record = next(pred) self.assertEqual(record.prediction, 'ܕܗ .ܣܐܗܗ.ܐ ܗܣ ܕ ܗܣ ܗ.ܗܝܣܗ ܣ ܗܢ ܪܗܗܕ ܐ ܗܠ')
def recognizer(model, pad, no_segmentation, bidi_reordering, script_ignore, input, output) -> None: import json from kraken import rpred ctx = click.get_current_context() bounds = None if 'base_image' not in ctx.meta: ctx.meta['base_image'] = input if ctx.meta['first_process']: if ctx.meta['input_format_type'] != 'image': doc = get_input_parser(ctx.meta['input_format_type'])(input) ctx.meta['base_image'] = doc['image'] doc['text_direction'] = 'horizontal-lr' bounds = doc try: im = Image.open(ctx.meta['base_image']) except IOError as e: raise click.BadParameter(str(e)) if not bounds and ctx.meta['base_image'] != input: with open_file(input, 'r') as fp: try: fp = cast(IO[Any], fp) bounds = json.load(fp) except ValueError as e: raise click.UsageError( f'{input} invalid segmentation: {str(e)}') elif not bounds: if no_segmentation: bounds = { 'script_detection': False, 'text_direction': 'horizontal-lr', 'boxes': [(0, 0) + im.size] } else: raise click.UsageError( 'No line segmentation given. Add one with the input or run `segment` first.' ) elif no_segmentation: logger.warning( 'no_segmentation mode enabled but segmentation defined. Ignoring --no-segmentation option.' ) scripts = set() # script detection if 'script_detection' in bounds and bounds['script_detection']: it = rpred.mm_rpred(model, im, bounds, pad, bidi_reordering=bidi_reordering, script_ignore=script_ignore) else: it = rpred.rpred(model['default'], im, bounds, pad, bidi_reordering=bidi_reordering) preds = [] with log.progressbar(it, label='Processing') as bar: for pred in bar: preds.append(pred) ctx = click.get_current_context() with open_file(output, 'w', encoding='utf-8') as fp: fp = cast(IO[Any], fp) message(f'Writing recognition results for {ctx.meta["orig_file"]}\t', nl=False) logger.info('Serializing as {} into {}'.format(ctx.meta['output_mode'], output)) if ctx.meta['output_mode'] != 'native': from kraken import serialization fp.write( serialization.serialize( preds, ctx.meta['base_image'], Image.open(ctx.meta['base_image']).size, ctx.meta['text_direction'], scripts, bounds['regions'] if 'regions' in bounds else None, ctx.meta['output_mode'])) else: fp.write('\n'.join(s.prediction for s in preds)) message('\u2713', fg='green')
def recognizer(model, pad, no_segmentation, bidi_reordering, script_ignore, base_image, input, output, lines) -> None: import json import tempfile from kraken import rpred try: im = Image.open(base_image) except IOError as e: raise click.BadParameter(str(e)) ctx = click.get_current_context() # input may either be output from the segmenter then it is a JSON file or # be an image file when running the OCR subcommand alone. might still come # from some other subcommand though. scripts = set() if not lines and base_image != input: lines = input if not lines: if no_segmentation: lines = tempfile.NamedTemporaryFile(mode='w', delete=False) logger.info( 'Running in no_segmentation mode. Creating temporary segmentation {}.' .format(lines.name)) json.dump( { 'script_detection': False, 'text_direction': 'horizontal-lr', 'boxes': [(0, 0) + im.size] }, lines) lines.close() lines = lines.name else: raise click.UsageError( 'No line segmentation given. Add one with `-l` or run `segment` first.' ) elif no_segmentation: logger.warning( 'no_segmentation mode enabled but segmentation defined. Ignoring --no-segmentation option.' ) with open_file(lines, 'r') as fp: try: fp = cast(IO[Any], fp) bounds = json.load(fp) except ValueError as e: raise click.UsageError('{} invalid segmentation: {}'.format( lines, str(e))) # script detection if bounds['script_detection']: for l in bounds['boxes']: for t in l: scripts.add(t[0]) it = rpred.mm_rpred(model, im, bounds, pad, bidi_reordering=bidi_reordering, script_ignore=script_ignore) else: it = rpred.rpred(model['default'], im, bounds, pad, bidi_reordering=bidi_reordering) if not lines and no_segmentation: logger.debug('Removing temporary segmentation file.') os.unlink(lines.name) preds = [] with log.progressbar(it, label='Processing', length=len(bounds['boxes'])) as bar: for pred in bar: preds.append(pred) ctx = click.get_current_context() with open_file(output, 'w', encoding='utf-8') as fp: fp = cast(IO[Any], fp) message('Writing recognition results for {}\t'.format(base_image), nl=False) logger.info('Serializing as {} into {}'.format(ctx.meta['mode'], output)) if ctx.meta['mode'] != 'text': from kraken import serialization fp.write( serialization.serialize(preds, base_image, Image.open(base_image).size, ctx.meta['text_direction'], scripts, ctx.meta['mode'])) else: fp.write('\n'.join(s.prediction for s in preds)) message('\u2713', fg='green')
def recognizer(model, pad, no_segmentation, bidi_reordering, script_ignore, base_image, input, output, lines) -> None: import json import tempfile from kraken import rpred try: im = Image.open(base_image) except IOError as e: raise click.BadParameter(str(e)) ctx = click.get_current_context() # input may either be output from the segmenter then it is a JSON file or # be an image file when running the OCR subcommand alone. might still come # from some other subcommand though. scripts = set() if not lines and base_image != input: lines = input if not lines: if no_segmentation: lines = tempfile.NamedTemporaryFile(mode='w', delete=False) logger.info('Running in no_segmentation mode. Creating temporary segmentation {}.'.format(lines.name)) json.dump({'script_detection': False, 'text_direction': 'horizontal-lr', 'boxes': [(0, 0) + im.size]}, lines) lines.close() lines = lines.name else: raise click.UsageError('No line segmentation given. Add one with `-l` or run `segment` first.') elif no_segmentation: logger.warning('no_segmentation mode enabled but segmentation defined. Ignoring --no-segmentation option.') with open_file(lines, 'r') as fp: try: fp = cast(IO[Any], fp) bounds = json.load(fp) except ValueError as e: raise click.UsageError('{} invalid segmentation: {}'.format(lines, str(e))) # script detection if bounds['script_detection']: for l in bounds['boxes']: for t in l: scripts.add(t[0]) it = rpred.mm_rpred(model, im, bounds, pad, bidi_reordering=bidi_reordering, script_ignore=script_ignore) else: it = rpred.rpred(model['default'], im, bounds, pad, bidi_reordering=bidi_reordering) if not lines and no_segmentation: logger.debug('Removing temporary segmentation file.') os.unlink(lines.name) preds = [] with log.progressbar(it, label='Processing', length=len(bounds['boxes'])) as bar: for pred in bar: preds.append(pred) ctx = click.get_current_context() with open_file(output, 'w', encoding='utf-8') as fp: fp = cast(IO[Any], fp) message('Writing recognition results for {}\t'.format(base_image), nl=False) logger.info('Serializing as {} into {}'.format(ctx.meta['mode'], output)) if ctx.meta['mode'] != 'text': from kraken import serialization fp.write(serialization.serialize(preds, base_image, Image.open(base_image).size, ctx.meta['text_direction'], scripts, ctx.meta['mode'])) else: fp.write('\n'.join(s.prediction for s in preds)) message('\u2713', fg='green')