概述
該腳本能夠將用戶指定的字符輸出為不同字體的圖像文件,用於訓練文字識別的機器學習模型或用於其他文字識別OCR項目
詳細
一、開發背景
隨着近幾年來計算機算力的不斷提升,機器學習也迎來了爆發式的發展,圖像識別作為機器學習最典型也是最主要的應用之一,目前應用前景火熱。
機器學習最重要的一步就是獲取數據集,沒有一個堅實的數據集做支撐是無法訓練出好用的模型的。因此,本文實現了一個腳本,能夠生成任意數量,任意字體,以及帶有各種模糊及噪聲預處理的圖像,用這些圖像作為訓練集是再合適不過了。
二、腳本效果
1、IDE中的運行界面
2、生成的圖像
每個文件夾存放一個漢字,即一個類別:
打開其中一個文件夾,里面存放的是當前類別漢字的各個字體以及各種預處理后的圖像文件。
三、具體開發
1、功能需求
1. 根據用戶指定的漢字字符生成圖像文件
2. 用戶可自行更改圖像數量及圖像尺寸
3. 用戶可自行更改預處理效果
2、實際項目
(1)項目結構
項目文件夾ImgGenerator下的fonts文件夾用於存放ttf字體文件。
outputs文件夾用於存放輸出圖像。
config.py中設置相關路徑信息。
draw_chara.py是實際的腳本。
(2)實現思路:
-
設定需要輸出的字符:
if __name__ == '__main__': # 加載所有指定字體 fonts = load_fonts(size) # 字符集,將其中的字符保存成圖像 charset = 'u你想輸出的漢字' # 生成n個字 n = 10 draw_txt(n, charset, fonts, size)
2. 加載字體:
# 自動加載字體文件 def load_fonts(size): fnts = [] # 字體路徑 font_path = os.path.join(config.FONT_PATH, "*.*") # 獲取全部字體路徑,存成list fonts = list(glob.glob(font_path)) # 遍歷字體文件 for each in fonts: # 調整字體大小 fnt = ImageFont.truetype(each, int(size[0]*1.75/2), 0) fnts.append(fnt) return fnts
這里需要根據輸出尺寸調整字體大小,避免超出畫布或留白太多。
3. 預處理圖像:
作為數據增強的一種方式,對訓練圖像進行不同程度的預處理,包括模糊,干擾,噪聲等可以增強模型的泛化能力。
這里可以根據自己需要選擇在0-7個預處理模式中自行選擇,只需要更改循環范圍即可。
# 數據增強 for mode in range(0, 8): aug = augmentation(img, mode, size)
def augmentation(img, mode, size): # 不能直接在原始image上改動 image = img.copy() '''添加隨機模糊和噪聲''' # 高斯模糊 if mode == 0: # 模糊后二值化,虛化邊緣 if mode == 1: # 橫線干擾 if mode == 2: # 豎線 if mode == 3: # 十字線 if mode == 4: # 左右運動模糊 if mode == 5: # 上下運動模糊 if mode == 6: # 高斯噪聲 if mode == 7:
(3)使用說明
現在config文件中設置字體文件路徑和輸出路徑:
# coding=utf-8 # 圖像保存路徑 IMAGE_PATH = './outputs' # 字體文件路徑 FONT_PATH = './fonts'
字體文件路徑中存放ttf字體文件,如下:
最后運行draw_chara.py即可在outputs文件夾中得到輸出圖像。