二、OCR训练时,将txt文件和图片数据转为lmdb文件格式


前言

随着人工智能的不断发展,机器学习这门技术也越来越重要,本文就介绍OCR训练前ldmb文件制作的基础内容。

提示:以下是本篇文章正文内容,下面案例可供参考

一、背景?

示例:是基于ocr训练而作。

二、直接上内容

1.代码

代码如下(示例):


# -*- coding:utf-8 -*-

import os
import lmdb  # ?pip install?????
import cv2
import glob  #????????????
import numpy as np


def checkImageIsValid(imageBin):
    if imageBin is None:
        return False
    imageBuf = np.fromstring(imageBin, dtype=np.uint8)
    img = cv2.imdecode(imageBuf, cv2.IMREAD_GRAYSCALE)
    if img is None:
        return False
    imgH, imgW = img.shape[0], img.shape[1]
    if imgH * imgW == 0:
        return False
    return True


def writeCache(env, cache):
    with env.begin(write=True) as txn:
        # for k, v in cache.iteritems():  #python2
        for k, v in cache.items():  #python3
            txn.put(k.encode(), str(v).encode())


def createDataset(outputPath, imagePathList, labelList, lexiconList=None, checkValid=True):
    """
    Create LMDB dataset for CRNN training.
#    ARGS:
        outputPath    : LMDB output path
        imagePathList : list of image path
        labelList     : list of corresponding groundtruth texts
        lexiconList   : (optional) list of lexicon lists
        checkValid    : if true, check the validity of every image
    """
    # print (len(imagePathList) , len(labelList))
    assert (len(imagePathList) == len(labelList))
    nSamples = len(imagePathList)
    print('...................')
    env = lmdb.open(outputPath, map_size=8589934592)  # 1099511627776)????????????????1T?????8g???????????????????

    cache = {}
    cnt = 1
    for i in range(nSamples):
        imagePath = imagePathList[i]
        label = labelList[i]
        if not os.path.exists(imagePath):
            print('%s does not exist' % imagePath)
            continue
        with open(imagePath, 'r') as f:
            imageBin = f.read()
        if checkValid:
            if not checkImageIsValid(imageBin):
                print('%s is not a valid image' % imagePath)  # ??????linux????f.read??????????????
                continue

        imageKey = 'image-%09d' % cnt
        labelKey = 'label-%09d' % cnt
        cache[imageKey] = imageBin
        cache[labelKey] = label
        if lexiconList:
            lexiconKey = 'lexicon-%09d' % cnt
            cache[lexiconKey] = ' '.join(lexiconList[i])
        if cnt % 1000 == 0:
            writeCache(env, cache)
            cache = {}
            print('Written %d / %d' % (cnt, nSamples))
        cnt += 1
    nSamples = cnt - 1
    cache['num-samples'] = str(nSamples)
    writeCache(env, cache)
    print('Created dataset with %d samples' % nSamples)


def read_text(path):
    with open(path) as f:
        text = f.read()
    text = text.strip()

    return text


if __name__ == '__main__':
    # lmdb ????
    outputPath = r'E:\enducate\test_paper\Train_code\train'  # ?????????????????????

    path = r"E:\enducate\test_paper\Train_code\data22222\*.png"  # ?txt?jpg???????????
    imagePathList = glob.glob(path)
    print('------------', len(imagePathList), '------------')

    imgLabelLists = []
    for p in imagePathList:
        try:
            imgLabelLists.append((p, read_text(p.replace('.jpg', '.txt'))))
        except:
            continue

    # imgLabelList = [ (p, read_text(p.replace('.jpg', '.txt'))) for p in imagePathList]
    # sort by labelList
    imgLabelList = sorted(imgLabelLists, key=lambda x: len(x[1]))
    imgPaths = [p[0] for p in imgLabelList]
    txtLists = [p[1] for p in imgLabelList]

    createDataset(outputPath, imgPaths, txtLists, lexiconList=None, checkValid=True)
    


2.文件说明

第一种文件格式
图片路径和txt标签文件共存。(1张图片对应1个txt标签文件)
在这里插入图片描述

txt文件和图片是放在一个文件夹的。


第二种文件格式如下:
文件有多张图片和1个txt文件组成,其中txt文件是包括所有图片的标签。
格式为:图片路径名+\t+标签。
在这里插入图片描述

// A code block
var foo = 'bar';
// An highlighted block

""" a modified version of CRNN torch repository https://github.com/bgshih/crnn/blob/master/tool/create_dataset.py """

import fire
import os
import lmdb
import cv2

import numpy as np


def checkImageIsValid(imageBin):
    if imageBin is None:
        return False
    imageBuf = np.frombuffer(imageBin, dtype=np.uint8)
    img = cv2.imdecode(imageBuf, cv2.IMREAD_GRAYSCALE)
    imgH, imgW = img.shape[0], img.shape[1]
    if imgH * imgW == 0:
        return False
    return True


def writeCache(env, cache):
    with env.begin(write=True) as txn:
        for k, v in cache.items():
            txn.put(k, v)


def createDataset(inputPath, gtFile, outputPath, checkValid=True):
    """
    Create LMDB dataset for training and evaluation.
    ARGS:
        inputPath  : input folder path where starts imagePath
        outputPath : LMDB output path
        gtFile     : list of image path and label
        checkValid : if true, check the validity of every image
    """
    os.makedirs(outputPath, exist_ok=True)
    env = lmdb.open(outputPath, map_size=1099511627776)
    cache = {}
    cnt = 1

    with open(gtFile, 'r', encoding='utf-8') as data:
        datalist = data.readlines()

    nSamples = len(datalist)
    for i in range(nSamples):
        imagePath, label = datalist[i].strip('\n').split('\t')
        # imagePath = os.path.join(inputPath, imagePath)

        # # only use alphanumeric data
        # if re.search('[^a-zA-Z0-9]', label):
        #     continue

        if not os.path.exists(imagePath):
            print('%s does not exist' % imagePath)
            continue
        with open(imagePath, 'rb') as f:
            imageBin = f.read()
        if checkValid:
            try:
                if not checkImageIsValid(imageBin):
                    print('%s is not a valid image' % imagePath)
                    continue
            except:
                print('error occured', i)
                with open(outputPath + '/error_image_log.txt', 'a') as log:
                    log.write('%s-th image data occured error\n' % str(i))
                continue

        imageKey = 'image-%09d'.encode() % cnt
        labelKey = 'label-%09d'.encode() % cnt
        cache[imageKey] = imageBin
        cache[labelKey] = label.encode()

        if cnt % 1000 == 0:
            writeCache(env, cache)
            cache = {}
            print('Written %d / %d' % (cnt, nSamples))
        cnt += 1
    nSamples = cnt-1
    cache['num-samples'.encode()] = str(nSamples).encode()
    writeCache(env, cache)
    print('Created dataset with %d samples' % nSamples)


if __name__ == '__main__':
    fire.Fire(createDataset)

# python create_lmdb_dataset.py --inputPath /data2/ --gtFile /data2/meterdataset/digital_dataset/otherdataset/1030_data/collect_val.txt --outputPath /data2/meterdataset/digital_dataset/otherdataset/1030_data/2021-0507-result/val

第二个运行说明:
> 输入路径:inputPath 操作的文件夹
txt文件: gtFile
ldmb输出的文件路径: outputPath

// An highlighted block
python create_lmdb_dataset.py --inputPath /data2/ --gtFile /data2/enducation/paper_recog_total/train-paper-recog/Recognization/deep-text-recognition-SHENG/data/text_recog/txt4val/img_gt/gt.txt --outputPath /data2/enducation/paper_recog_total/train-paper-recog/Recognization/deep-text-recognition-SHENG/data/val
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Halcon OCR是一款强大的OCR(Optical Character Recognition,光学字符识别)软件。训练文件是用于训练Halcon OCR引擎的重要组成部分。 在使用Halcon OCR训练文件起着至关重要的作用。训练文件包含了各种不同字体、大小、颜色和风格的字符样本。通过对这些样本的识别和辨别,Halcon OCR可以学会如何正确识别不同的字符。 训练文件一般由两个主要部分组成:样本图像和字符标签。样本图像是训练文件中最重要的组成部分,它包含了不同字体和样式的字符图像。这些字符图像通过扫描或者手动绘制得到,并且需要有一定的多样性,以便训练文件可以覆盖到各种场景下的字符。 字符标签是与样本图像相对应的字符标识。它告诉Halcon OCR训练文件中每个样本图像所代表的字符是什么。这些标签可以是英文字母、数字、符号或者其他语言的字符,取决于应用场景。 在创建训练文件,需要确保样本图像与字符标签的对应关系是正确的。这可以通过手动输入或者自动识别的方式来实现。对于大规模的训练文件,建议使用自动识别的方式来提高效率。 使用训练文件进行训练,Halcon OCR会根据样本图像和字符标签的关系来学习字符的特征和识别规则。通过大量的训练,Halcon OCR可以准确地识别不同样式和字体的字符,实现高效的光学字符识别。 总之,Halcon OCR训练文件是用于训练Halcon OCR引擎的关键组成部分,它包含了各种样本图像和字符标签,用于训练引擎学习字符特征和识别规则,从而实现准确的光学字符识别。 ### 回答2: Halcon OCR训练文件是用于训练Halcon OCR引擎的文件。Halcon是一种可以进行图像处理与分析的软件开发工具。OCR(Optical Character Recognition,光学字符识别)是一项技术,可以将图像中的文字转换为可编辑和可搜索的文本。Halcon OCR训练文件用于训练OCR引擎,使其能够识别特定字体、特定大小和特定样式的文字。 Halcon OCR训练文件通常由两个主要部分组成:训练图片训练数据训练图片是用于训练的一系列图像,这些图像中包含了所需识别的文字。训练数据是每个训练图片上的文字的标签信息,用于训练引擎建立文字识别模型。 在训练过程中,Halcon OCR引擎会使用训练图片和标签信息,根据一定的训练算法和模型结构进行学习和训练。通过反复训练,引擎可以逐渐调整模型参数,提高对字体、大小和样式的识别准确度。 训练完成后,Halcon OCR引擎将生成一个训练模型文件,该文件包含了训练过程中学到的识别规则和特征。引擎可以根据该模型文件进行识别任务,从输入图像中找出并识别出文字。 总之,Halcon OCR训练文件是用于训练Halcon OCR引擎的文件,其中包含了训练图片训练数据,通过训练可以建立一个识别特定字体、特定大小和特定样式文字的模型文件。该模型文件可以用于实际的文字识别任务。 ### 回答3: Halcon OCR训练文件是指用于训练Halcon OCR(Optical Character Recognition,光学字符识别)引擎的文件。Halcon是一种强大的视觉处理软件,能够识别图像中的文字并将其转化为可编辑的文本。 为了让Halcon OCR能够准确地识别各种字体、大小和风格的字符,需要进行训练训练文件包含了用于训练OCR引擎的数据,其中包括各种字体和字符的样本。通过对大量的字符样本进行训练OCR引擎可以学习字符的特征和区别,并建立字符识别模型。 在创建训练文件之前,需要收集大量的字符样本,以涵盖各种字体和大小。字符样本可以通过手动采集、扫描文字文档或从已有的数据集中获取。采集样本,应该包含不同字体、大小和倾斜度的字符。 制作训练文件需要使用Halcon的训练工具,通过将字符样本加载到工具中进行训练训练过程中,需要手动标记字符的边界框,以便OCR引擎能够准确地识别字符。标记边界框可以通过在字符样本上绘制矩形或多边形来完成。 一旦训练文件创建完成,就可以将其加载到Halcon OCR引擎中使用。OCR引擎会根据训练文件中的模型进行字符识别,并将结果返回。通过不断优化训练文件训练过程,可以提高OCR引擎的准确性和鲁棒性。 总而言之,Halcon OCR训练文件是用于训练Halcon OCR引擎的文件,其中包含字符样本和识别模型。通过训练文件,Halcon OCR引擎能够识别各种字体、大小和风格的字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值