数据预处理:中英文印刷字体图片分类数据集生成
轉(zhuǎn)載AI Studio項(xiàng)目鏈接https://aistudio.baidu.com/aistudio/projectdetail/3481076
0 項(xiàng)目背景
現(xiàn)在,隨著OCR技術(shù)普及,從PDF或者圖片中提取到文字內(nèi)容已經(jīng)不是什么難事。
但是,對(duì)于排版的格式文檔,如何在提取內(nèi)容的時(shí)候,完整地還原其排版、字體,仍然是一個(gè)比較大的挑戰(zhàn)。
比如,面對(duì)這樣一個(gè)場(chǎng)景:我們手上有一份掃描版的PDF論文,希望能轉(zhuǎn)化出它的word版本,保留它的排版、圖片、字體、公式……
這里面至少涉及到:
- 版面分析和圖表提取
- OCR公式識(shí)別
- OCR字體識(shí)別
因此,本系列項(xiàng)目(又開一坑……)研究的就是其中的OCR字體識(shí)別場(chǎng)景。
1 場(chǎng)景分析
對(duì)于該場(chǎng)景,我們先做個(gè)初步分析。一般來(lái)說(shuō),基于印刷字體的PDF或圖片文檔,字體分布會(huì)有兩種情況:
- 一種是整段整段的字體相同,這種場(chǎng)景可能比較普遍,版面字體分析準(zhǔn)備數(shù)據(jù)集時(shí),相對(duì)也比較簡(jiǎn)單,只要能定位段落的字體就行;
- 另一種就是我們比較熟悉的論文形式,尤其是中文論文,往往規(guī)定了,中文用哪種字體、英文用哪種字體、公式用哪種字體,一個(gè)段落里,它們是混著用的。
1.1 處理思路
還是走從易到難的路線,在第一個(gè)項(xiàng)目中,先研究對(duì)印刷字單字的字體識(shí)別。
由于商用字體在版權(quán)上是比較敏感的,這個(gè)項(xiàng)目中,我們就先用一些開源字體,跑通整個(gè)流程。
1.2 難點(diǎn)分析
項(xiàng)目一上來(lái)就面臨比較大的難點(diǎn),包括了不同字體的圖片在哪里?如何組織?
這里就涉及到如何將字體文件轉(zhuǎn)換為圖片了。我們先看下AI Studio系統(tǒng)(Ubuntu系統(tǒng))的字體文件在哪里。
# 定位系統(tǒng)某個(gè)字體文件位置 !ls /usr/share/fonts/ !ls /usr/share/fonts/truetype/noto/ cmap fangzheng truetype type1 X11 NotoMono-Regular.ttf然后我們先試試看,如何實(shí)現(xiàn)字體文件轉(zhuǎn)圖片,參考這篇文章:python 由ttf字體文件生成png預(yù)覽圖
from PIL import Image, ImageDraw, ImageFont import os %matplotlib inlinedef draw_png(fontpath, name, text_content, font_size = 24):font=ImageFont.truetype(fontpath + name, font_size)text_width, text_height = font.getsize(name[:-4])image = Image.new(mode='RGBA', size=(text_width, text_height))draw_table = ImageDraw.Draw(im=image)draw_table.text(xy=(0, 0), text=text_content, fill='#000000', font=font) # text是要顯示的文本image.show() # 直接顯示圖片 draw_png('/usr/share/fonts/truetype/noto/','NotoMono-Regular.ttf','test ttf to png')但是,這種做法,在我們傳入中文字符的時(shí)候,就遇到了問(wèn)題。亂碼出現(xiàn)了,因?yàn)镹otoMono-Regular.tff這個(gè)字體文件中,沒(méi)有對(duì)中文字符的支持。
draw_png('/usr/share/fonts/truetype/noto/', 'NotoMono-Regular.ttf','測(cè)試 ttf to png')我們找個(gè)支持中文字符顯示的字體看看。
!ls /usr/share/fonts/fangzheng/ FZHLJW.TTF FZSYJW.TTF # 換成支持中文的字體,就不會(huì)亂碼了 draw_png('/usr/share/fonts/fangzheng/', 'FZHLJW.TTF','測(cè)試 ttf to png')2 準(zhǔn)備數(shù)據(jù)集
# 拉取開源中文字體包 !git clone https://gitee.com/mirrors/noto-cjk.git # 把簡(jiǎn)體中文字體整理在一個(gè)目錄 !mkdir cn-fonts !mv noto-cjk/Serif/OTF/SimplifiedChinese/*.otf ./cn-fonts !mv noto-cjk/Sans/OTF/SimplifiedChinese/*.otf ./cn-fonts !cp /usr/share/fonts/fangzheng/*.TTF ./cn-fonts2.1 fontTools庫(kù)的應(yīng)用
fontTools是一系列用于在Python中操作字體的庫(kù)和實(shí)用程序。
# 準(zhǔn)備工具庫(kù) !pip install fontTools !pip install freetype-py對(duì)一個(gè)字體文件,使用fontTools可以獲得很多關(guān)鍵信息。同時(shí),結(jié)合FreeTypePen這個(gè)庫(kù),還可用繪制字形圖。
# 獲取各節(jié)點(diǎn)名稱,返回為列表 print(font.keys()) # 獲取getGlyphOrder節(jié)點(diǎn)的name值,返回為列表 print(font.getGlyphOrder()) print(font.getGlyphNames()) # 獲取cmap節(jié)點(diǎn)code與name值映射, 返回為字典 print(font.getBestCmap()) # 獲取glyf節(jié)點(diǎn)TTGlyph字體xy坐標(biāo)信息 print(font['glyf']['uniE1A0'].coordinates) # 獲取glyf節(jié)點(diǎn)TTGlyph字體xMin,yMin,xMax,yMax坐標(biāo)信息 print(font['glyf']['uniE1A0'].xMin, font['glyf']['uniE1A0'].yMin,font['glyf']['uniE1A0'].xMax, font['glyf']['uniE1A0'].yMax) # 獲取glyf節(jié)點(diǎn)TTGlyph字體on信息 print(font['glyf']['uniE1A0'].flags) # 獲取GlyphOrder節(jié)點(diǎn)GlyphID的id信息, 返回int型 print(font.getGlyphID('uniE1A0')) # 查看指定字體是否支持中文 from fontTools.ttLib import TTFont font = TTFont('cn-fonts/FZSYJW.TTF') # 隨機(jī)找個(gè)中文字符 print(ord('很') in font.getBestCmap()) True注:ord() 函數(shù)是 chr() 函數(shù)(對(duì)于8位的ASCII字符串)或 unichr() 函數(shù)(對(duì)于Unicode對(duì)象)的配對(duì)函數(shù),它以一個(gè)字符(長(zhǎng)度為1的字符串)作為參數(shù),返回對(duì)應(yīng)的 ASCII 數(shù)值,或者 Unicode 數(shù)值,如果所給的 Unicode 字符超出了你的 Python 定義范圍,則會(huì)引發(fā)一個(gè) TypeError 的異常。
# 換一個(gè)不支持中文的字體文件 font = TTFont('/usr/share/fonts/truetype/noto/NotoMono-Regular.ttf') # 隨機(jī)找個(gè)中文字符 print(ord('很') in font.getBestCmap()) False # 繪制字形圖 from fontTools.ttLib import TTFont from fontTools.pens.freetypePen import FreeTypePen from fontTools.misc.transform import Offsetpen = FreeTypePen(None) # 實(shí)例化Pen子類 font = TTFont('cn-fonts/FZSYJW.TTF') glyph = font.getGlyphSet()[font.getBestCmap()[28183]] # 通過(guò)字形名稱選擇某一字形對(duì)象 glyph.draw(pen) # “畫”出字形輪廓 width, ascender, descender = glyph.width, font['OS/2'].usWinAscent, -font['OS/2'].usWinDescent # 獲取字形的寬度和上沿以及下沿 height = ascender - descender # 利用上沿和下沿計(jì)算字形高度 pen.show(width=width, height=height, transform=Offset(0, -descender)) # 顯示以及矯正 # 同時(shí)顯示多種字體效果 !pip install uharfbuzz import uharfbuzz as hb from fontTools.pens.freetypePen import FreeTypePen from fontTools.pens.transformPen import TransformPen from fontTools.misc.transform import Offseten1, en2, ar, ja = 'Tset', '不同', '字體', '效果' for text, font_path, direction, typo_ascender, typo_descender, vhea_ascender, vhea_descender, contain, features in ((en1, 'cn-fonts/NotoSerifCJKsc-SemiBold.otf', 'ltr', 2189, -600, None, None, False, {"kern": True, "liga": True}),(en2, 'cn-fonts/FZHLJW.TTF', 'ltr', 2189, -600, None, None, True, {"kern": True, "liga": True}),(ar, 'cn-fonts/FZSYJW.TTF', 'rtl', 1374, -738, None, None, False, {"kern": True, "liga": True}),(ja, 'cn-fonts/NotoSansCJKsc-Light.otf', 'ltr', 880, -120, 500, -500, False, {"palt": True, "kern": True}),(ja, 'cn-fonts/NotoSerifCJKsc-Black.otf', 'ttb', 880, -120, 500, -500, False, {"vert": True, "vpal": True, "vkrn": True}) ):blob = hb.Blob.from_file_path(font_path)face = hb.Face(blob)font = hb.Font(face)buf = hb.Buffer()buf.direction = directionbuf.add_str(text)buf.guess_segment_properties()hb.shape(font, buf, features)x, y = 0, 0pen = FreeTypePen(None)for info, pos in zip(buf.glyph_infos, buf.glyph_positions):gid = info.codepointtransformed = TransformPen(pen, Offset(x + pos.x_offset, y + pos.y_offset))font.draw_glyph_with_pen(gid, transformed)x += pos.x_advancey += pos.y_advanceoffset, width, height = None, None, Noneif direction in ('ltr', 'rtl'):offset = (0, -typo_descender)width = xheight = typo_ascender - typo_descenderelse:offset = (-vhea_descender, -y)width = vhea_ascender - vhea_descenderheight = -ypen.show(width=width, height=height, transform=Offset(*offset), contain=contain)2.2 字體文件批量轉(zhuǎn)圖片
!mkdir MyDataset from tqdm import tqdmfileList = os.listdir('cn-fonts') for f in fileList:print(f)font_dir = 'MyDataset/' + f[:-4]font_path = 'cn-fonts/' + fisExists=os.path.exists(font_dir) # 判斷結(jié)果if not isExists:# 如果不存在則創(chuàng)建目錄# 創(chuàng)建目錄操作函數(shù)os.makedirs(font_dir) font = TTFont(font_path) # 實(shí)例化TTFontfor key in tqdm(font.getBestCmap()):pen = FreeTypePen(None) # 實(shí)例化Pen子類glyph = font.getGlyphSet()[font.getBestCmap()[key]] # 通過(guò)字形名稱選擇某一字形對(duì)象glyph.draw(pen) # “畫”出字形輪廓width, ascender, descender = glyph.width, font['OS/2'].usWinAscent, -font['OS/2'].usWinDescent # 獲取字形的寬度和上沿以及下沿height = ascender - descender # 利用上沿和下沿計(jì)算字形高度im = pen.image(width=width, height=height, transform=Offset(0, -descender)) # 顯示以及矯正# 個(gè)別字符在裁剪時(shí)會(huì)出現(xiàn)越界,這里做個(gè)處理if width > 10:im.save(font_dir + '/' + font.getBestCmap()[key]+'.png')3 訓(xùn)練分類模型
3.1 數(shù)據(jù)集劃分
PaddleX提供了數(shù)據(jù)集一鍵劃分的功能,這么省力的操作怎能不用?
!pip install paddlex # 數(shù)據(jù)集劃分 !paddlex --split_dataset --format ImageNet --dataset_dir MyDataset --val_value 0.2 --test_value 0.1 [32m[02-14 19:56:44 MainThread @logger.py:242][0m Argv: /opt/conda/envs/python35-paddle120-env/bin/paddlex --split_dataset --format ImageNet --dataset_dir MyDataset --val_value 0.2 --test_value 0.1 [0m[33m[02-14 19:56:44 MainThread @utils.py:79][0m [5m[33mWRN[0m paddlepaddle version: 2.2.2. The dynamic graph version of PARL is under development, not fully tested and supported [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/parl/remote/communication.py:38: DeprecationWarning: 'pyarrow.default_serialization_context' is deprecated as of 2.0.0 and will be removed in a future version. Use pickle or the pyarrow IPC functionality instead.context = pyarrow.default_serialization_context() [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop workingfrom collections import MutableMapping [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop workingfrom collections import Iterable, Mapping [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop workingfrom collections import Sized [0m2022-02-14 19:56:47 [INFO] Dataset split starts...[0m [0m2022-02-14 19:56:48 [INFO] Dataset split done.[0m [0m2022-02-14 19:56:48 [INFO] Train samples: 61957[0m [0m2022-02-14 19:56:48 [INFO] Eval samples: 17700[0m [0m2022-02-14 19:56:48 [INFO] Test samples: 8849[0m [0m2022-02-14 19:56:48 [INFO] Split files saved in MyDataset[0m [0m[0m3.2 模型訓(xùn)練
本文對(duì)字體圖片文件進(jìn)行了分類模型訓(xùn)練嘗試,結(jié)果卻發(fā)現(xiàn),無(wú)論是哪種模型,效果都不太好,這里有個(gè)猜測(cè)。
-
懷疑問(wèn)題在于resize這個(gè)操作,所有的字形圖,輸入神經(jīng)網(wǎng)絡(luò)前都被resize到了相同大小,這里面,一些線條受到了扭曲,自然導(dǎo)致字形圖原始特征遭到破壞,分類也就難以分出效果了。
-
第二個(gè)可能,也許不同字體的差異,這種特征過(guò)于微弱,即使用深度學(xué)習(xí),也存在困難?
-
還有可能,就是卷積神經(jīng)網(wǎng)絡(luò)的固有曲線,在字體分類任務(wù)中被嚴(yán)重放大了。
不管怎么說(shuō),這也是一個(gè)挑戰(zhàn),單字字體識(shí)別分類準(zhǔn)確率是否能進(jìn)一步提升?后續(xù)的項(xiàng)目中,我們將進(jìn)一步研究。
import paddlex as pdx from paddlex import transforms as T# 定義訓(xùn)練和驗(yàn)證時(shí)的transforms # API說(shuō)明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md train_transforms = T.Compose([T.RandomCrop(crop_size=224), T.Normalize(), T.MixupImage(alpha=1.5, beta=1.5, mixup_epoch=-1)])eval_transforms = T.Compose([T.ResizeByShort(short_size=256), T.CenterCrop(crop_size=224), T.Normalize() ])# 定義訓(xùn)練和驗(yàn)證所用的數(shù)據(jù)集 # API說(shuō)明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md train_dataset = pdx.datasets.ImageNet(data_dir='MyDataset',file_list='MyDataset/train_list.txt',label_list='MyDataset/labels.txt',transforms=train_transforms,shuffle=True)eval_dataset = pdx.datasets.ImageNet(data_dir='MyDataset',file_list='MyDataset/val_list.txt',label_list='MyDataset/labels.txt',transforms=eval_transforms)# 初始化模型,并進(jìn)行訓(xùn)練 # 可使用VisualDL查看訓(xùn)練指標(biāo),參考https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/visualdl.md num_classes = len(train_dataset.labels) model = pdx.cls.MobileNetV3_small(num_classes=num_classes)# API說(shuō)明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/classification.md # 各參數(shù)介紹與調(diào)整說(shuō)明:https://github.com/PaddlePaddle/PaddleX/tree/develop/docs/parameters.md model.train(num_epochs=10,train_dataset=train_dataset,train_batch_size=32,eval_dataset=eval_dataset,lr_decay_epochs=[4, 6, 8],learning_rate=0.01,save_dir='output/mobilenetv3_small',use_vdl=True)4 再看場(chǎng)景
4.1 生成短語(yǔ)字體分類數(shù)據(jù)集
在單字識(shí)別上碰了壁,現(xiàn)在我們回來(lái)思考下,字體識(shí)別分類的“初心”是什么?
其實(shí)既不是整段相同字體的識(shí)別、也不是單字字體的識(shí)別,二是短語(yǔ)的識(shí)別。
比如,我們把PaddleOCR文檔的第一句話拎出來(lái),是這么寫的:
PaddleOCR旨在打造一套豐富、領(lǐng)先、且實(shí)用的OCR工具庫(kù),助力使用者訓(xùn)練出更好的模型,并應(yīng)用落地。
好了,即使用中文論文的排版要求,最多也就要求PaddleOCR和OCR是Times New Roman字體,其它中文字體是宋體吧?
那么在識(shí)別的時(shí)候,即使是最復(fù)雜的場(chǎng)景,大不了再對(duì)各種短語(yǔ)加個(gè)檢測(cè)模型?
—— 一個(gè)非常不成熟的設(shè)想是,用OCR文字識(shí)別,然后結(jié)合分詞信息,框出短語(yǔ)檢測(cè)框。
所以,現(xiàn)在我們完全可以試著降低下難度,把單字識(shí)別弄成短語(yǔ)識(shí)別,看看分類器是否能起作用?
from PIL import Image, ImageDraw, ImageFont import os import jieba fileList = os.listdir('cn-fonts')textList = ['PPOCRLabel是一款適用于OCR領(lǐng)域的半自動(dòng)化圖形標(biāo)注工具', '內(nèi)置PPOCR模型對(duì)數(shù)據(jù)自動(dòng)標(biāo)注和重新識(shí)別', '使用python3和pyqt5編寫', '支持矩形框標(biāo)注和四點(diǎn)標(biāo)注模式', '導(dǎo)出格式可直接用于PPOCR檢測(cè)和識(shí)別模型的訓(xùn)練', '近期更新2021-8-11:新增功能', '打開數(shù)據(jù)所在文件夾、圖像旋轉(zhuǎn)(注意:旋轉(zhuǎn)前的圖片上不能存在標(biāo)記框)', '(by Wei-JL)新增快捷鍵說(shuō)明(幫助-快捷鍵)', '修復(fù)批處理下的方向快捷鍵移動(dòng)功能(by d2623587501)', '新增批處理與撤銷功能(by Evezerest)批處理功能', '按住Ctrl鍵選擇標(biāo)記框后可批量移動(dòng)、復(fù)制、刪除、重新識(shí)別', '撤銷功能:在繪制四點(diǎn)標(biāo)注框過(guò)程中或?qū)蜻M(jìn)行編輯操作后', '按下Ctrl+Z可撤銷上一部操作', '修復(fù)圖像旋轉(zhuǎn)和尺寸問(wèn)題', '優(yōu)化編輯標(biāo)記框過(guò)程(by ninetailskim、 edencfc)', '優(yōu)化標(biāo)注體驗(yàn)(by edencfc):用戶可在“視圖', '彈出標(biāo)記輸入框”選擇在畫完檢測(cè)框后標(biāo)記輸入框是否彈出', '識(shí)別結(jié)果與檢測(cè)框同步滾動(dòng)', '識(shí)別結(jié)果更改為單擊修改', '(如果無(wú)法修改,請(qǐng)切換為系統(tǒng)自帶輸入法,或再次切回原輸入法)', '支持對(duì)單個(gè)標(biāo)記框進(jìn)行重新識(shí)別(by ninetailskim)', '完善快捷鍵。盡請(qǐng)期待鎖定框模式:針對(duì)同一場(chǎng)景數(shù)據(jù)', '被鎖定的檢測(cè)框的大小與位置能在不同圖片之間傳遞', '如果您對(duì)以上內(nèi)容感興趣或?qū)ν晟乒ぞ哂胁灰粯拥南敕?#39;, '歡迎加入我們的SIG隊(duì)伍與我們共同開發(fā)', '可以在此處完成問(wèn)卷和前置任務(wù)', '經(jīng)過(guò)我們確認(rèn)相關(guān)內(nèi)容后即可正式加入', '享受SIG福利', '共同為OCR開源事業(yè)貢獻(xiàn)(特別說(shuō)明:針對(duì)PPOCRLabel的改進(jìn)也屬于PaddleOCR前置任務(wù))', 'PaddleX集成飛槳智能視覺(jué)領(lǐng)域圖像分類', '目標(biāo)檢測(cè)、語(yǔ)義分割、實(shí)例分割任務(wù)能力', '將深度學(xué)習(xí)開發(fā)全流程從數(shù)據(jù)準(zhǔn)備', '模型訓(xùn)練與優(yōu)化到多端部署端到端打通', '并提供統(tǒng)一任務(wù)API接口及圖形化開發(fā)界面Demo', '開發(fā)者無(wú)需分別安裝不同套件', '以低代碼的形式即可快速完成飛槳全流程開發(fā)。', 'PASSL is a Paddle based vision library for state-of-the-art Self-Supervised Learning research with PaddlePaddle', 'PASSL aims to accelerate research cycle in self-supervised learning: from designing a new self-supervised task to evaluating the learned representations.', '新增產(chǎn)業(yè)最實(shí)用目標(biāo)檢測(cè)模型PP-YOLO', 'FasterRCNN、MaskRCNN、YOLOv3、DeepLabv3p等模型', '新增內(nèi)置COCO數(shù)據(jù)集預(yù)訓(xùn)練模型,適用于小模型精調(diào)', '新增多種Backbone,優(yōu)化體積及預(yù)測(cè)速度', '優(yōu)化OpenVINO、PaddleLite Android、服務(wù)端C++預(yù)測(cè)部署方案', '新增樹莓派部署方案等。', '新增人像分割、工業(yè)標(biāo)記讀數(shù)案例', '模型新增HRNet、FastSCNN、FasterRCNN', '實(shí)例分割MaskRCNN新增Backbone HRNet', '集成X2Paddle','PaddleX所有分類模型和語(yǔ)義分割模型支持導(dǎo)出為ONNX協(xié)議', '新增模型加密Windows平臺(tái)支持。新增Jetson、Paddle Lite模型部署預(yù)測(cè)方案。']# 隨機(jī)找一段短語(yǔ) # mytext = 'PPOCRLabel是一款適用于OCR領(lǐng)域的半自動(dòng)化圖形標(biāo)注工具,內(nèi)置PPOCR模型對(duì)數(shù)據(jù)自動(dòng)標(biāo)注和重新識(shí)別。使用python3和pyqt5編寫,支持矩形框標(biāo)注和四點(diǎn)標(biāo)注模式,導(dǎo)出格式可直接用于PPOCR檢測(cè)和識(shí)別模型的訓(xùn)練。近期更新2021-8-11:新增功能:打開數(shù)據(jù)所在文件夾、圖像旋轉(zhuǎn)(注意:旋轉(zhuǎn)前的圖片上不能存在標(biāo)記框)(by Wei-JL)新增快捷鍵說(shuō)明(幫助-快捷鍵)、修復(fù)批處理下的方向快捷鍵移動(dòng)功能(by d2623587501)2021-2-5:新增批處理與撤銷功能(by Evezerest)批處理功能:按住Ctrl鍵選擇標(biāo)記框后可批量移動(dòng)、復(fù)制、刪除、重新識(shí)別。撤銷功能:在繪制四點(diǎn)標(biāo)注框過(guò)程中或?qū)蜻M(jìn)行編輯操作后,按下Ctrl+Z可撤銷上一部操作。修復(fù)圖像旋轉(zhuǎn)和尺寸問(wèn)題、優(yōu)化編輯標(biāo)記框過(guò)程(by ninetailskim、 edencfc)2021-1-11:優(yōu)化標(biāo)注體驗(yàn)(by edencfc):用戶可在“視圖 - 彈出標(biāo)記輸入框”選擇在畫完檢測(cè)框后標(biāo)記輸入框是否彈出。識(shí)別結(jié)果與檢測(cè)框同步滾動(dòng)。識(shí)別結(jié)果更改為單擊修改。(如果無(wú)法修改,請(qǐng)切換為系統(tǒng)自帶輸入法,或再次切回原輸入法)2020-12-18: 支持對(duì)單個(gè)標(biāo)記框進(jìn)行重新識(shí)別(by ninetailskim),完善快捷鍵。盡請(qǐng)期待鎖定框模式:針對(duì)同一場(chǎng)景數(shù)據(jù),被鎖定的檢測(cè)框的大小與位置能在不同圖片之間傳遞。如果您對(duì)以上內(nèi)容感興趣或?qū)ν晟乒ぞ哂胁灰粯拥南敕?歡迎加入我們的SIG隊(duì)伍與我們共同開發(fā)。可以在此處完成問(wèn)卷和前置任務(wù),經(jīng)過(guò)我們確認(rèn)相關(guān)內(nèi)容后即可正式加入,享受SIG福利,共同為OCR開源事業(yè)貢獻(xiàn)(特別說(shuō)明:針對(duì)PPOCRLabel的改進(jìn)也屬于PaddleOCR前置任務(wù))'# mytext = "".join(jieba.cut(mytext)) # textList = list(jieba.cut(mytext)) !mkdir StsDataset !mkdir StsDataset/FZHLJW !mkdir StsDataset/FZSYJW !mkdir StsDataset/NotoSansCJKsc-Black !mkdir StsDataset/NotoSansCJKsc-Bold !mkdir StsDataset/NotoSansCJKsc-DemiLight !mkdir StsDataset/NotoSansCJKsc-Light !mkdir StsDataset/NotoSansCJKsc-Medium !mkdir StsDataset/NotoSansCJKsc-Regular !mkdir StsDataset/NotoSansCJKsc-Thin !mkdir StsDataset/NotoSerifCJKsc-Black !mkdir StsDataset/NotoSerifCJKsc-Bold !mkdir StsDataset/NotoSerifCJKsc-ExtraLight !mkdir StsDataset/NotoSerifCJKsc-Light !mkdir StsDataset/NotoSerifCJKsc-Medium !mkdir StsDataset/NotoSerifCJKsc-Regular !mkdir StsDataset/NotoSerifCJKsc-SemiBold # 批量生成長(zhǎng)文本、短語(yǔ)字體分類圖片 for name in fileList:print(name)# font_dir = 'MyDataset/' + f[:-4]font_path = 'cn-fonts/'font=ImageFont.truetype(font_path + name, 24)text_width, text_height = font.getsize(name[:-4])for i,text_content in enumerate(textList):image = Image.new(mode='RGBA', size=(text_width, text_height))draw_table = ImageDraw.Draw(im=image)if len(text_content) >= 2 :draw_table.text(xy=(0, 0), text=text_content, fill='#000000', font=font) # text是要顯示的文本image.save('StsDataset/' + name[:-4] + '/' + str(i) + '.png') NotoSansCJKsc-Medium.otf NotoSerifCJKsc-ExtraLight.otf FZSYJW.TTF NotoSerifCJKsc-Black.otf FZHLJW.TTF NotoSerifCJKsc-Regular.otf NotoSansCJKsc-Black.otf NotoSansCJKsc-DemiLight.otf NotoSerifCJKsc-Bold.otf NotoSerifCJKsc-Light.otf NotoSerifCJKsc-Medium.otf NotoSansCJKsc-Thin.otf NotoSansCJKsc-Light.otf NotoSansCJKsc-Bold.otf NotoSerifCJKsc-SemiBold.otf NotoSansCJKsc-Regular.otf # 數(shù)據(jù)集劃分 !paddlex --split_dataset --format ImageNet --dataset_dir StsDataset --val_value 0.2 --test_value 0.14.2 生成固定size字體分類數(shù)據(jù)集
前面我們生成的是字形圖,不同字形圖大小不一。
現(xiàn)在,嘗試生成不同固定字號(hào)的單字圖片。
!mkdir MyDataset/FZHLJW !mkdir MyDataset/FZSYJW !mkdir MyDataset/NotoSansCJKsc-Black !mkdir MyDataset/NotoSansCJKsc-Bold !mkdir MyDataset/NotoSansCJKsc-DemiLight !mkdir MyDataset/NotoSansCJKsc-Light !mkdir MyDataset/NotoSansCJKsc-Medium !mkdir MyDataset/NotoSansCJKsc-Regular !mkdir MyDataset/NotoSansCJKsc-Thin !mkdir MyDataset/NotoSerifCJKsc-Black !mkdir MyDataset/NotoSerifCJKsc-Bold !mkdir MyDataset/NotoSerifCJKsc-ExtraLight !mkdir MyDataset/NotoSerifCJKsc-Light !mkdir MyDataset/NotoSerifCJKsc-Medium !mkdir MyDataset/NotoSerifCJKsc-Regular !mkdir MyDataset/NotoSerifCJKsc-SemiBold from tqdm import tqdm for name in fileList:print(name)font_dir = 'MyDataset/' + f[:-4]font_path = 'cn-fonts/'font = ImageFont.truetype(font_path + name, 196)font1 = TTFont(font_path + name)text_width, text_height = font.getsize(name[:-4])for i in tqdm(font1.getBestCmap()):image = Image.new(mode='RGBA', size=(text_width, text_height))draw_table = ImageDraw.Draw(im=image)if i < 100:draw_table.text(xy=(0, 0), text=chr(i), fill='#000000', font=font) # text是要顯示的文本,我們可以直接生成ascii字符,也可以考慮在此處引入一個(gè)字典,逐字生成圖片image.save('MyDataset/' + name[:-4] + '/' + str(i) + '.png') # 數(shù)據(jù)集劃分 !paddlex --split_dataset --format ImageNet --dataset_dir MyDataset --val_value 0.2 --test_value 0.15 小結(jié)
對(duì)于從字體轉(zhuǎn)圖片這個(gè)任務(wù),在本項(xiàng)目中,對(duì)多種形式的字體分類識(shí)別數(shù)據(jù)集完成了準(zhǔn)備。
當(dāng)然,挑戰(zhàn)才剛剛開始,字體分類這個(gè)任務(wù),究竟用哪種模型才能達(dá)到較好的效果?還是要引入匹配算法?
后續(xù)項(xiàng)目中,將開始更加深入的探討。
總結(jié)
以上是生活随笔為你收集整理的数据预处理:中英文印刷字体图片分类数据集生成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL导出记录到Excel表格下载打
- 下一篇: 【bb平台刷课记】wireshark结合