From d9549ce6a09dcf1e9d51ce865b929edc47e16921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=96MrCuiHao?= <305243420@qq.com> Date: Thu, 21 Oct 2021 18:39:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E5=88=92=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 20211008154929.png | Bin 19379 -> 0 bytes 20211008155029.png | Bin 25749 -> 0 bytes PPOCRLabel/README.md | 18 ++++++ PPOCRLabel/README_ch.md | 15 +++++ .../gen_ocr_train_val_test.py | 61 +++++++++++++----- gen_ocr_train_val.bat | 1 - ...77\347\224\250\350\257\264\346\230\216.md" | 32 --------- gen_ocr_train_val.sh | 2 - 8 files changed, 77 insertions(+), 52 deletions(-) delete mode 100644 20211008154929.png delete mode 100644 20211008155029.png rename gen_ocr_train_val.py => PPOCRLabel/gen_ocr_train_val_test.py (69%) delete mode 100644 gen_ocr_train_val.bat delete mode 100644 "gen_ocr_train_val.py\344\275\277\347\224\250\350\257\264\346\230\216.md" delete mode 100644 gen_ocr_train_val.sh diff --git a/20211008154929.png b/20211008154929.png deleted file mode 100644 index 7a1c234c03d4b44ea11fb7bdf6d61231cde9ec95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19379 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 SIN)6&kfxf>#d4MFcmEINe!Z3e diff --git a/20211008155029.png b/20211008155029.png deleted file mode 100644 index 26fc052ebb3734c92846f35bff70d6f8e53e633e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25749 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 MV{4;IgR2kz4(^b diff --git a/PPOCRLabel/README.md b/PPOCRLabel/README.md index 9e5b3245..2b3cd5b7 100644 --- a/PPOCRLabel/README.md +++ b/PPOCRLabel/README.md @@ -204,6 +204,24 @@ For some data that are difficult to recognize, the recognition results will not pip install opencv-contrib-python-headless==4.2.0.32 ``` +### Dataset division + +- Enter the following command in the terminal to execute the dataset division script: + ``` + cd ./PPOCRLabel # Change the directory to the PPOCRLabel folder + python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --labelRootPath ../train_data/label --detRootPath ../train_data/det --recRootPath ../train_data/rec + ``` + +- Parameter Description: + + trainValTestRatio is the division ratio of the number of images in the training set, validation set, and test set, set according to your actual situation, the default is 6:2:2 + + labelRootPath is the storage path of the dataset labeled by PPOCRLabel, the default is ../train_data/label + + detRootPath is the path where the text detection dataset is divided according to the dataset marked by PPOCRLabel. The default is ../train_data/det + + recRootPath is the path where the character recognition dataset is divided according to the dataset marked by PPOCRLabel. The default is ../train_data/rec + ### Related 1.[Tzutalin. LabelImg. Git code (2015)](https://github.com/tzutalin/labelImg) \ No newline at end of file diff --git a/PPOCRLabel/README_ch.md b/PPOCRLabel/README_ch.md index 7f9351df..10baae50 100644 --- a/PPOCRLabel/README_ch.md +++ b/PPOCRLabel/README_ch.md @@ -193,7 +193,22 @@ PPOCRLabel支持三种导出方式: ``` pip install opencv-contrib-python-headless==4.2.0.32 ``` +### 数据集划分 +- 在终端中输入以下命令执行数据集划分脚本: + ``` + cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下 + python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --labelRootPath ../train_data/label --detRootPath ../train_data/det --recRootPath ../train_data/rec + ``` +- 参数说明: + + trainValTestRatio是训练集、验证集、测试集的图像数量划分比例,根据你的实际情况设定,默认是6:2:2 + + labelRootPath是PPOCRLabel标注的数据集存放路径,默认是../train_data/label + + detRootPath是根据PPOCRLabel标注的数据集划分后的文本检测数据集存放的路径,默认是../train_data/det + recRootPath是根据PPOCRLabel标注的数据集划分后的字符识别数据集存放的路径,默认是../train_data/rec + ### 参考资料 1.[Tzutalin. LabelImg. Git code (2015)](https://github.com/tzutalin/labelImg) diff --git a/gen_ocr_train_val.py b/PPOCRLabel/gen_ocr_train_val_test.py similarity index 69% rename from gen_ocr_train_val.py rename to PPOCRLabel/gen_ocr_train_val_test.py index 8b338892..64cba612 100644 --- a/gen_ocr_train_val.py +++ b/PPOCRLabel/gen_ocr_train_val_test.py @@ -5,45 +5,61 @@ import random import argparse -# 删除划分的训练集和验证集文件夹,重新创建一个空的文件夹 +# 删除划分的训练集、验证集、测试集文件夹,重新创建一个空的文件夹 def isCreateOrDeleteFolder(path, flag): flagPath = os.path.join(path, flag) + if os.path.exists(flagPath): shutil.rmtree(flagPath) + os.makedirs(flagPath) flagAbsPath = os.path.abspath(flagPath) return flagAbsPath -def splitTrainVal(root, dir, absTrainRootPath, absValRootPath, trainTxt, valTxt, flag): - # 按照指定的比例划分训练集和验证集 +def splitTrainVal(root, dir, absTrainRootPath, absValRootPath, absTestRootPath, trainTxt, valTxt, testTxt, flag): + # 按照指定的比例划分训练集、验证集、测试集 labelPath = os.path.join(root, dir) labelAbsPath = os.path.abspath(labelPath) + if flag == "det": labelFilePath = os.path.join(labelAbsPath, args.detLabelFileName) elif flag == "rec": labelFilePath = os.path.join(labelAbsPath, args.recLabelFileName) + labelFileRead = open(labelFilePath, "r", encoding="UTF-8") labelFileContent = labelFileRead.readlines() random.shuffle(labelFileContent) labelRecordLen = len(labelFileContent) + for index, labelRecordInfo in enumerate(labelFileContent): imageRelativePath = labelRecordInfo.split('\t')[0] imageLabel = labelRecordInfo.split('\t')[1] imageName = os.path.basename(imageRelativePath) + if flag == "det": imagePath = os.path.join(labelAbsPath, imageName) elif flag == "rec": imagePath = os.path.join(labelAbsPath, "{}\\{}".format(args.recImageDirName, imageName)) - # 小于划分比例trainValRatio时,数据集划分到训练集,否则测试集 - if index / labelRecordLen < args.trainValRatio: + + # 按预设的比例划分训练集、验证集、测试集 + trainValTestRatio = args.trainValTestRatio.split(":") + trainRatio = eval(trainValTestRatio[0]) / 10 + valRatio = trainRatio + eval(trainValTestRatio[1]) / 10 + curRatio = index / labelRecordLen + + if curRatio < trainRatio: imageCopyPath = os.path.join(absTrainRootPath, imageName) shutil.copy(imagePath, imageCopyPath) trainTxt.write("{}\t{}".format(imageCopyPath, imageLabel)) - else: + elif curRatio >= trainRatio and curRatio < valRatio: imageCopyPath = os.path.join(absValRootPath, imageName) shutil.copy(imagePath, imageCopyPath) valTxt.write("{}\t{}".format(imageCopyPath, imageLabel)) + else: + imageCopyPath = os.path.join(absTestRootPath, imageName) + shutil.copy(imagePath, imageCopyPath) + testTxt.write("{}\t{}".format(imageCopyPath, imageLabel)) # 删掉存在的文件 @@ -55,48 +71,59 @@ def removeFile(path): def genDetRecTrainVal(args): detAbsTrainRootPath = isCreateOrDeleteFolder(args.detRootPath, "train") detAbsValRootPath = isCreateOrDeleteFolder(args.detRootPath, "val") + detAbsTestRootPath = isCreateOrDeleteFolder(args.detRootPath, "test") recAbsTrainRootPath = isCreateOrDeleteFolder(args.recRootPath, "train") recAbsValRootPath = isCreateOrDeleteFolder(args.recRootPath, "val") + recAbsTestRootPath = isCreateOrDeleteFolder(args.recRootPath, "test") + removeFile(os.path.join(args.detRootPath, "train.txt")) removeFile(os.path.join(args.detRootPath, "val.txt")) + removeFile(os.path.join(args.detRootPath, "test.txt")) removeFile(os.path.join(args.recRootPath, "train.txt")) removeFile(os.path.join(args.recRootPath, "val.txt")) + removeFile(os.path.join(args.recRootPath, "test.txt")) + detTrainTxt = open(os.path.join(args.detRootPath, "train.txt"), "a", encoding="UTF-8") detValTxt = open(os.path.join(args.detRootPath, "val.txt"), "a", encoding="UTF-8") + detTestTxt = open(os.path.join(args.detRootPath, "test.txt"), "a", encoding="UTF-8") recTrainTxt = open(os.path.join(args.recRootPath, "train.txt"), "a", encoding="UTF-8") recValTxt = open(os.path.join(args.recRootPath, "val.txt"), "a", encoding="UTF-8") + recTestTxt = open(os.path.join(args.recRootPath, "test.txt"), "a", encoding="UTF-8") + for root, dirs, files in os.walk(args.labelRootPath): for dir in dirs: - splitTrainVal(root, dir, detAbsTrainRootPath, detAbsValRootPath, detTrainTxt, detValTxt, "det") - splitTrainVal(root, dir, recAbsTrainRootPath, recAbsValRootPath, recTrainTxt, recValTxt, "rec") + splitTrainVal(root, dir, detAbsTrainRootPath, detAbsValRootPath, detAbsTestRootPath, detTrainTxt, detValTxt, + detTestTxt, "det") + splitTrainVal(root, dir, recAbsTrainRootPath, recAbsValRootPath, recAbsTestRootPath, recTrainTxt, recValTxt, + recTestTxt, "rec") break if __name__ == "__main__": - # 功能描述:分别划分检测和识别的训练集和验证集 + # 功能描述:分别划分检测和识别的训练集、验证集、测试集 # 说明:可以根据自己的路径和需求调整参数,图像数据往往多人合作分批标注,每一批图像数据放在一个文件夹内用PPOCRLabel进行标注, - # 如此会有多个标注好的图像文件夹汇总并划分训练集和验证集的需求 + # 如此会有多个标注好的图像文件夹汇总并划分训练集、验证集、测试集的需求 parser = argparse.ArgumentParser() parser.add_argument( - "--trainValRatio", - type=float, - default=0.8, - help="ratio of training set to validation set") + "--trainValTestRatio", + type=str, + default="6:2:2", + help="ratio of trainset:valset:testset") parser.add_argument( "--labelRootPath", type=str, - default="./train_data/label", + default="../train_data/label", help="path to the dataset marked by ppocrlabel, E.g, dataset folder named 1,2,3..." ) parser.add_argument( "--detRootPath", type=str, - default="./train_data/det", + default="../train_data/det", help="the path where the divided detection dataset is placed") parser.add_argument( "--recRootPath", type=str, - default="./train_data/rec", + default="../train_data/rec", help="the path where the divided recognition dataset is placed" ) parser.add_argument( diff --git a/gen_ocr_train_val.bat b/gen_ocr_train_val.bat deleted file mode 100644 index c1fb476f..00000000 --- a/gen_ocr_train_val.bat +++ /dev/null @@ -1 +0,0 @@ -python gen_ocr_train_val.py --trainValRatio 0.8 --labelRootPath ./train_data/label --detRootPath ./train_data/det --recRootPath ./train_data/rec \ No newline at end of file diff --git "a/gen_ocr_train_val.py\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/gen_ocr_train_val.py\344\275\277\347\224\250\350\257\264\346\230\216.md" deleted file mode 100644 index e638847c..00000000 --- "a/gen_ocr_train_val.py\344\275\277\347\224\250\350\257\264\346\230\216.md" +++ /dev/null @@ -1,32 +0,0 @@ -1、功能描述:分别划分检测和识别的训练集和验证集 - -2、说明:可以根据自己的路径和需求调整参数,图像数据往往多人合作分批标注,每一批图像数据放在一个文件夹内用PPOCRLabel进行标注,如此会有多个标注好的图像文件夹汇总并划分训练集和验证集的需求。 - -3、使用方法: - -3.1 首先使用PPOCRLabel标注好图像,一般是分批次标注,多个标注好的图像文件夹存放在train_data目录下的label文件夹里,文件夹没有自己创建,label同级路径下创建det文件夹存放划分好的文本检测数据集,label同级路径下创建rec文件夹存放划分好的字符识别数据集,目录结构如下图所示: - -![20211008154929](20211008154929.png) -![20211008155029](20211008155029.png) - -3.2 gen_ocr_train_val.py参数说明 - -trainValRatio 训练集和验证集的图像数量划分比例,根据你的实际情况设定,默认是0.8 - -labelRootPath PPOCRLabel标注的数据集存放路径,默认是./train_data/label - -detRootPath 根据PPOCRLabel标注的数据集划分后的文本检测数据集存放的路径 - -recRootPath 根据PPOCRLabel标注的数据集划分后的字符识别数据集存放的路径 - -detLabelFileName 使用PPOCRLabel标注图像时,人工确认过的标注结果会存放在Label.txt内 - -recLabelFileName 使用PPOCRLabel标注图像时,点击导出识别结果后,会对人工确认过的字符标注结果进行字符裁剪,生成裁剪后的字符图像路径以及字符图像对应的字符标签保存到rec_gt.txt中 - -recImageDirName 使用PPOCRLabel标注图像时,点击导出识别结果后,会把裁剪后的字符图像保存到crop_img文件夹内 - -3.3 执行gen_ocr_train_val.py方法 -如果目录结构和文件夹名称是严格按照以上说明创建的,可以直接在windows环境下执行gen_ocr_train_val.bat,在linux环境下需要执行gen_ocr_train_val.sh,默认划分比例是0.8 -也可以在终端中输入以下命令执行: -python gen_ocr_train_val.py --trainValRatio 0.8 --labelRootPath ./train_data/label --detRootPath ./train_data/det --recRootPath ./train_data/rec -如果想创建自己的目录结构和文件夹名称,需要手动修改命令里的路径 diff --git a/gen_ocr_train_val.sh b/gen_ocr_train_val.sh deleted file mode 100644 index efd66dce..00000000 --- a/gen_ocr_train_val.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -python gen_ocr_train_val.py --trainValRatio 0.8 --labelRootPath ./train_data/label --detRootPath ./train_data/det --recRootPath ./train_data/rec \ No newline at end of file -- GitLab