数据预处理:中英文印刷字体图片分类数据集生成
轉載AI Studio項目鏈接https://aistudio.baidu.com/aistudio/projectdetail/3481076
0 項目背景
現在,隨著OCR技術普及,從PDF或者圖片中提取到文字內容已經不是什么難事。
但是,對于排版的格式文檔,如何在提取內容的時候,完整地還原其排版、字體,仍然是一個比較大的挑戰。
比如,面對這樣一個場景:我們手上有一份掃描版的PDF論文,希望能轉化出它的word版本,保留它的排版、圖片、字體、公式……
這里面至少涉及到:
- 版面分析和圖表提取
- OCR公式識別
- OCR字體識別
因此,本系列項目(又開一坑……)研究的就是其中的OCR字體識別場景。
1 場景分析
對于該場景,我們先做個初步分析。一般來說,基于印刷字體的PDF或圖片文檔,字體分布會有兩種情況:
- 一種是整段整段的字體相同,這種場景可能比較普遍,版面字體分析準備數據集時,相對也比較簡單,只要能定位段落的字體就行;
- 另一種就是我們比較熟悉的論文形式,尤其是中文論文,往往規定了,中文用哪種字體、英文用哪種字體、公式用哪種字體,一個段落里,它們是混著用的。
1.1 處理思路
還是走從易到難的路線,在第一個項目中,先研究對印刷字單字的字體識別。
由于商用字體在版權上是比較敏感的,這個項目中,我們就先用一些開源字體,跑通整個流程。
1.2 難點分析
項目一上來就面臨比較大的難點,包括了不同字體的圖片在哪里?如何組織?
這里就涉及到如何將字體文件轉換為圖片了。我們先看下AI Studio系統(Ubuntu系統)的字體文件在哪里。
# 定位系統某個字體文件位置 !ls /usr/share/fonts/ !ls /usr/share/fonts/truetype/noto/ cmap fangzheng truetype type1 X11 NotoMono-Regular.ttf然后我們先試試看,如何實現字體文件轉圖片,參考這篇文章:python 由ttf字體文件生成png預覽圖
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')但是,這種做法,在我們傳入中文字符的時候,就遇到了問題。亂碼出現了,因為NotoMono-Regular.tff這個字體文件中,沒有對中文字符的支持。
draw_png('/usr/share/fonts/truetype/noto/', 'NotoMono-Regular.ttf','測試 ttf to png')我們找個支持中文字符顯示的字體看看。
!ls /usr/share/fonts/fangzheng/ FZHLJW.TTF FZSYJW.TTF # 換成支持中文的字體,就不會亂碼了 draw_png('/usr/share/fonts/fangzheng/', 'FZHLJW.TTF','測試 ttf to png')2 準備數據集
# 拉取開源中文字體包 !git clone https://gitee.com/mirrors/noto-cjk.git # 把簡體中文字體整理在一個目錄 !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庫的應用
fontTools是一系列用于在Python中操作字體的庫和實用程序。
# 準備工具庫 !pip install fontTools !pip install freetype-py對一個字體文件,使用fontTools可以獲得很多關鍵信息。同時,結合FreeTypePen這個庫,還可用繪制字形圖。
# 獲取各節點名稱,返回為列表 print(font.keys()) # 獲取getGlyphOrder節點的name值,返回為列表 print(font.getGlyphOrder()) print(font.getGlyphNames()) # 獲取cmap節點code與name值映射, 返回為字典 print(font.getBestCmap()) # 獲取glyf節點TTGlyph字體xy坐標信息 print(font['glyf']['uniE1A0'].coordinates) # 獲取glyf節點TTGlyph字體xMin,yMin,xMax,yMax坐標信息 print(font['glyf']['uniE1A0'].xMin, font['glyf']['uniE1A0'].yMin,font['glyf']['uniE1A0'].xMax, font['glyf']['uniE1A0'].yMax) # 獲取glyf節點TTGlyph字體on信息 print(font['glyf']['uniE1A0'].flags) # 獲取GlyphOrder節點GlyphID的id信息, 返回int型 print(font.getGlyphID('uniE1A0')) # 查看指定字體是否支持中文 from fontTools.ttLib import TTFont font = TTFont('cn-fonts/FZSYJW.TTF') # 隨機找個中文字符 print(ord('很') in font.getBestCmap()) True注:ord() 函數是 chr() 函數(對于8位的ASCII字符串)或 unichr() 函數(對于Unicode對象)的配對函數,它以一個字符(長度為1的字符串)作為參數,返回對應的 ASCII 數值,或者 Unicode 數值,如果所給的 Unicode 字符超出了你的 Python 定義范圍,則會引發一個 TypeError 的異常。
# 換一個不支持中文的字體文件 font = TTFont('/usr/share/fonts/truetype/noto/NotoMono-Regular.ttf') # 隨機找個中文字符 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) # 實例化Pen子類 font = TTFont('cn-fonts/FZSYJW.TTF') glyph = font.getGlyphSet()[font.getBestCmap()[28183]] # 通過字形名稱選擇某一字形對象 glyph.draw(pen) # “畫”出字形輪廓 width, ascender, descender = glyph.width, font['OS/2'].usWinAscent, -font['OS/2'].usWinDescent # 獲取字形的寬度和上沿以及下沿 height = ascender - descender # 利用上沿和下沿計算字形高度 pen.show(width=width, height=height, transform=Offset(0, -descender)) # 顯示以及矯正 # 同時顯示多種字體效果 !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 字體文件批量轉圖片
!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) # 判斷結果if not isExists:# 如果不存在則創建目錄# 創建目錄操作函數os.makedirs(font_dir) font = TTFont(font_path) # 實例化TTFontfor key in tqdm(font.getBestCmap()):pen = FreeTypePen(None) # 實例化Pen子類glyph = font.getGlyphSet()[font.getBestCmap()[key]] # 通過字形名稱選擇某一字形對象glyph.draw(pen) # “畫”出字形輪廓width, ascender, descender = glyph.width, font['OS/2'].usWinAscent, -font['OS/2'].usWinDescent # 獲取字形的寬度和上沿以及下沿height = ascender - descender # 利用上沿和下沿計算字形高度im = pen.image(width=width, height=height, transform=Offset(0, -descender)) # 顯示以及矯正# 個別字符在裁剪時會出現越界,這里做個處理if width > 10:im.save(font_dir + '/' + font.getBestCmap()[key]+'.png')3 訓練分類模型
3.1 數據集劃分
PaddleX提供了數據集一鍵劃分的功能,這么省力的操作怎能不用?
!pip install paddlex # 數據集劃分 !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 模型訓練
本文對字體圖片文件進行了分類模型訓練嘗試,結果卻發現,無論是哪種模型,效果都不太好,這里有個猜測。
-
懷疑問題在于resize這個操作,所有的字形圖,輸入神經網絡前都被resize到了相同大小,這里面,一些線條受到了扭曲,自然導致字形圖原始特征遭到破壞,分類也就難以分出效果了。
-
第二個可能,也許不同字體的差異,這種特征過于微弱,即使用深度學習,也存在困難?
-
還有可能,就是卷積神經網絡的固有曲線,在字體分類任務中被嚴重放大了。
不管怎么說,這也是一個挑戰,單字字體識別分類準確率是否能進一步提升?后續的項目中,我們將進一步研究。
import paddlex as pdx from paddlex import transforms as T# 定義訓練和驗證時的transforms # API說明: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() ])# 定義訓練和驗證所用的數據集 # API說明: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)# 初始化模型,并進行訓練 # 可使用VisualDL查看訓練指標,參考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說明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/classification.md # 各參數介紹與調整說明: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 再看場景
4.1 生成短語字體分類數據集
在單字識別上碰了壁,現在我們回來思考下,字體識別分類的“初心”是什么?
其實既不是整段相同字體的識別、也不是單字字體的識別,二是短語的識別。
比如,我們把PaddleOCR文檔的第一句話拎出來,是這么寫的:
PaddleOCR旨在打造一套豐富、領先、且實用的OCR工具庫,助力使用者訓練出更好的模型,并應用落地。
好了,即使用中文論文的排版要求,最多也就要求PaddleOCR和OCR是Times New Roman字體,其它中文字體是宋體吧?
那么在識別的時候,即使是最復雜的場景,大不了再對各種短語加個檢測模型?
—— 一個非常不成熟的設想是,用OCR文字識別,然后結合分詞信息,框出短語檢測框。
所以,現在我們完全可以試著降低下難度,把單字識別弄成短語識別,看看分類器是否能起作用?
from PIL import Image, ImageDraw, ImageFont import os import jieba fileList = os.listdir('cn-fonts')textList = ['PPOCRLabel是一款適用于OCR領域的半自動化圖形標注工具', '內置PPOCR模型對數據自動標注和重新識別', '使用python3和pyqt5編寫', '支持矩形框標注和四點標注模式', '導出格式可直接用于PPOCR檢測和識別模型的訓練', '近期更新2021-8-11:新增功能', '打開數據所在文件夾、圖像旋轉(注意:旋轉前的圖片上不能存在標記框)', '(by Wei-JL)新增快捷鍵說明(幫助-快捷鍵)', '修復批處理下的方向快捷鍵移動功能(by d2623587501)', '新增批處理與撤銷功能(by Evezerest)批處理功能', '按住Ctrl鍵選擇標記框后可批量移動、復制、刪除、重新識別', '撤銷功能:在繪制四點標注框過程中或對框進行編輯操作后', '按下Ctrl+Z可撤銷上一部操作', '修復圖像旋轉和尺寸問題', '優化編輯標記框過程(by ninetailskim、 edencfc)', '優化標注體驗(by edencfc):用戶可在“視圖', '彈出標記輸入框”選擇在畫完檢測框后標記輸入框是否彈出', '識別結果與檢測框同步滾動', '識別結果更改為單擊修改', '(如果無法修改,請切換為系統自帶輸入法,或再次切回原輸入法)', '支持對單個標記框進行重新識別(by ninetailskim)', '完善快捷鍵。盡請期待鎖定框模式:針對同一場景數據', '被鎖定的檢測框的大小與位置能在不同圖片之間傳遞', '如果您對以上內容感興趣或對完善工具有不一樣的想法', '歡迎加入我們的SIG隊伍與我們共同開發', '可以在此處完成問卷和前置任務', '經過我們確認相關內容后即可正式加入', '享受SIG福利', '共同為OCR開源事業貢獻(特別說明:針對PPOCRLabel的改進也屬于PaddleOCR前置任務)', 'PaddleX集成飛槳智能視覺領域圖像分類', '目標檢測、語義分割、實例分割任務能力', '將深度學習開發全流程從數據準備', '模型訓練與優化到多端部署端到端打通', '并提供統一任務API接口及圖形化開發界面Demo', '開發者無需分別安裝不同套件', '以低代碼的形式即可快速完成飛槳全流程開發。', '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.', '新增產業最實用目標檢測模型PP-YOLO', 'FasterRCNN、MaskRCNN、YOLOv3、DeepLabv3p等模型', '新增內置COCO數據集預訓練模型,適用于小模型精調', '新增多種Backbone,優化體積及預測速度', '優化OpenVINO、PaddleLite Android、服務端C++預測部署方案', '新增樹莓派部署方案等。', '新增人像分割、工業標記讀數案例', '模型新增HRNet、FastSCNN、FasterRCNN', '實例分割MaskRCNN新增Backbone HRNet', '集成X2Paddle','PaddleX所有分類模型和語義分割模型支持導出為ONNX協議', '新增模型加密Windows平臺支持。新增Jetson、Paddle Lite模型部署預測方案。']# 隨機找一段短語 # mytext = 'PPOCRLabel是一款適用于OCR領域的半自動化圖形標注工具,內置PPOCR模型對數據自動標注和重新識別。使用python3和pyqt5編寫,支持矩形框標注和四點標注模式,導出格式可直接用于PPOCR檢測和識別模型的訓練。近期更新2021-8-11:新增功能:打開數據所在文件夾、圖像旋轉(注意:旋轉前的圖片上不能存在標記框)(by Wei-JL)新增快捷鍵說明(幫助-快捷鍵)、修復批處理下的方向快捷鍵移動功能(by d2623587501)2021-2-5:新增批處理與撤銷功能(by Evezerest)批處理功能:按住Ctrl鍵選擇標記框后可批量移動、復制、刪除、重新識別。撤銷功能:在繪制四點標注框過程中或對框進行編輯操作后,按下Ctrl+Z可撤銷上一部操作。修復圖像旋轉和尺寸問題、優化編輯標記框過程(by ninetailskim、 edencfc)2021-1-11:優化標注體驗(by edencfc):用戶可在“視圖 - 彈出標記輸入框”選擇在畫完檢測框后標記輸入框是否彈出。識別結果與檢測框同步滾動。識別結果更改為單擊修改。(如果無法修改,請切換為系統自帶輸入法,或再次切回原輸入法)2020-12-18: 支持對單個標記框進行重新識別(by ninetailskim),完善快捷鍵。盡請期待鎖定框模式:針對同一場景數據,被鎖定的檢測框的大小與位置能在不同圖片之間傳遞。如果您對以上內容感興趣或對完善工具有不一樣的想法,歡迎加入我們的SIG隊伍與我們共同開發。可以在此處完成問卷和前置任務,經過我們確認相關內容后即可正式加入,享受SIG福利,共同為OCR開源事業貢獻(特別說明:針對PPOCRLabel的改進也屬于PaddleOCR前置任務)'# 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 # 批量生成長文本、短語字體分類圖片 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 # 數據集劃分 !paddlex --split_dataset --format ImageNet --dataset_dir StsDataset --val_value 0.2 --test_value 0.14.2 生成固定size字體分類數據集
前面我們生成的是字形圖,不同字形圖大小不一。
現在,嘗試生成不同固定字號的單字圖片。
!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字符,也可以考慮在此處引入一個字典,逐字生成圖片image.save('MyDataset/' + name[:-4] + '/' + str(i) + '.png') # 數據集劃分 !paddlex --split_dataset --format ImageNet --dataset_dir MyDataset --val_value 0.2 --test_value 0.15 小結
對于從字體轉圖片這個任務,在本項目中,對多種形式的字體分類識別數據集完成了準備。
當然,挑戰才剛剛開始,字體分類這個任務,究竟用哪種模型才能達到較好的效果?還是要引入匹配算法?
后續項目中,將開始更加深入的探討。
總結
以上是生活随笔為你收集整理的数据预处理:中英文印刷字体图片分类数据集生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL导出记录到Excel表格下载打
- 下一篇: 【bb平台刷课记】wireshark结合