OCR深度實踐系列:數據生成

轉載:https://mp.weixin.qq.com/s?__biz=MzI5MjYzNzAyMw==&mid=2247484187&idx=1&sn=549b68ec989792ad5e2fb9179af55598&chksm=ec7f132bdb089a3d2f96ebecc780a6e756cdf26cb4e8a5bc4951c029e0c4dfb83c40cdc927ff&scene=21#wechat_redirect

(一)圖像預處理這篇爲OCR深度實踐系列的第二篇:數據生成。
深度學習依賴大量的數據,然而在真實的業務場景中無法獲取足夠多且真實的打標數據,因此人們希望通過圖像增強、語義理解、生成對抗網絡等技術生成高質量的數據。基於深度學習的OCR系統一般分爲文字檢測和文字識別兩個階段,數據生成也需要針對這兩個階段分別敘述並輔以實戰進行演示。本項目完整代碼:https://github.com/Vincent131499/Chinese-OCR3/tree/master/data_generation

1.文字檢測數據的生成

1.1 SynthText方法

文字檢測數據生成方法主要基於Synthetic Data for Text Localisation in Natural Images提出的方法SynthText,介紹瞭如何生成自然場景下的文字圖像。SynthText方法的主要流程包括:1)蒐集業務相關的背景圖片、文字語料和字體。其中背景圖片是無文字的。2)計算得到圖片的語義與深度信息。論文代碼中使用gPb-UCM方法得到圖片的語義信息。在CV領域中的“語義信息”並不是指的是NLP中的上下文語義,而是各種語義區域;“深度信息”可以簡單理解爲圖片與相機的距離。3)獲取符合條件的候選區域。具體操作分爲兩步:step1:根據語義信息進行篩選,對每個分割片區進行遍歷,利用OpenCV中的minAreaRect方法獲取包含分割區內所有像素點的最小矩形區域。然後根據矩形的寬和高過濾掉寬高較小的區域。step2:根據深度信息進行二次過濾,篩選出比較平整的區域。4)對篩選出的候選區域進行圖像變換,原圖中的分割區域都是帶有一定角度的,爲了方便以後將單詞或句子填充到相應的分割區域中,需要預先對每個分割區域做旋轉變換。具體做法是:先利用OpenCV的findContours()獲取輪廓,將輪廓轉換爲3D形式,再將旋轉後的區域平鋪到平面上,對平面的區域進行旋轉,使得minAreaRect()包圍的矩形區域角度爲0,隨後利用OpenCV的findHomography()對旋轉後分割區域的矩陣進行矩陣變換。5)對變換後的區域進行填充。隨機選擇字體、文字內容、添加特效等,生成相應的文字圖片,然後複製到相應的區域中。

1.2 實戰演示

該項目位於Chinese-OCR3/data_generation/SynthText目錄下。一般而言:開源的數據集已經足夠用於文字檢測項目,所以生成更多應用在文字識別階段,這裏只是作爲演示使用。此處給出SynthText 自然場景圖像數據集(地址還未上,等下載完放到網盤),由80萬個圖像組成,大約有 800 萬個合成單詞實例。每個文本實例都使用其文本字符串,字級和字符級邊界框進行註釋。安裝依賴:

pip install -r requirements.txt

生成數據:

python gen.py --viz

• dset.h5: 裏面有5張圖片,可以下載其他圖片• data/fonts: 一些字體• data/newsgroup: 一些語料• data/models/colors_new.cp: Color模型• data/models:模型相關• 生成的結果在results目錄下可視化預覽生成結果:

python visualize_results.py

以下放出一張示例的生成圖片:

圖片

2.文字識別數據的生成

深度學習系統中,在檢測出目標之後,往往還需要使用分類器對檢測區域進行識別。深度學習依賴大量的數據才能得到令人滿意的識別效果。在實際的業務場景中,首先需要根據具體的業務分析需要的背景、字體、顏色、形變以及語料等信息。具體識別數據的生成流程如下所示:

圖片

目前常用流行的識別數據生成方法可大致分爲三類:GAN生成法、基於特徵變換的圖像增強、基於深度學習的圖像增強。

2.1 基於GAN生成數據

在很多場景下,真實數據往往非常稀缺和敏感,例如身份證數據、銀行卡數據、車牌數據這些涉及個人信息的數據往往很難獲取,而且很容易違反法律規定。藉助GAN(Generative Adversarial Network,生成對抗網絡)可以在一定程度上緩解上述問題。目前GAN的應用場景基本上覆蓋了AI的所有領域,例如圖像和音頻的生成、圖像風格遷移、圖像修復(去噪和去馬賽克)、NLP中的文本生成等。生成對抗網絡,顧名思義,就是在生成模型的基礎上引入對抗博弈的思想。假設我們有一個圖像生成模型Generator,它的目標是生成一張比較真實的圖像,與此同時,我們還有一個圖像判別模型Discriminator,它的目標是正確的判別一張圖像是生成的還是真實的。具體流程如下:• 1)生成模型Generator生成一批圖像。• 2)判別模型Discriminator學習區分生成圖像和真實圖像。• 3)生成模型根據判別模型反饋結果來改進生成模型,迭代生成新圖像。• 4)判別模型繼續學習區分生成圖像和真實圖像。直到二者收斂,此時生成模型和判別模型都能達到比較好的效果。上述的博弈類似《射鵰英雄傳》中周伯通的左右互搏術,能循環提升生成模型和判別模型的能力。另外,在生成模型中採用神經網絡作爲主幹/backbone,則稱之爲生成對抗網絡。GAN模型結構如下圖所示。

圖片

在這裏以改進的pix2pix經典模型爲例進行實戰演示。此項目位於Chinese-OCR3/data_generation/pytorch-CycleGAN-and-pix2pix目錄下。這裏使用在facades數據集預訓練好的pix2pix模型進行演示。具體分爲3步:step1:下載預訓練模型

bash ./scripts/download_pix2pix_model.shfacades_label2photo

step2:下載facades數據集

bash ./datasets/download_pix2pix_dataset.sh facades

step3:生成結果

python test.py --dataroot ./datasets/facades/ --direction BtoA --model pix2pix --name facades_label2photo_pretrained

生成圖片如下示例:

圖片

圖片

 

2.2 基於特徵變換的圖像增強

這類方法是對現有的數據進行圖像增廣進而擴充數據量。在文字識別的訓練中,由於文字的特殊性,能夠選擇的增強方法有限,主要有以下4種類型:• 1)模糊。• 2)對比度變化。• 3)拉伸。• 4)旋轉。在這裏分別針對這4種手段進行實戰演示,該項目位於Chinese-OCR3/data_generation/augment目錄下。輸入圖片:

圖片

核心代碼如下:

#旋轉def rotate(img, angle, center=None, scale=1.0):    # get the dimension of the img    (h, w) = img.shape[:2]
if center is None: center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, scale) rotated_img = cv2.warpAffine( img, M, (w, h), borderMode=cv2.BORDER_REPLICATE)
return rotated_img
#拉伸(放大-縮小)def resize(img, width=None, height=None, inter=cv2.INTER_AREA): # get the dimension of the img
dm = None
(h, w) = img.shape[:2]
if width is None and height is None: return img
if width: r = width / float(w) dm = (width, int(h * r)) else: r = height / float(h) dm = (int(w * r), height)
resized_img = cv2.resize(img, dm, interpolation=inter)
return resized_img
# 對比度變化def adjust_brightness_contrast(img, brightness=0., contrast=0.): """ Adjust the brightness or contrast of image """ beta = 0 return cv2.addWeighted(img, 1 + float(contrast) / 100., img, beta, float(brightness))
# 模糊def blur(img, typ="gaussian", kernal=(2, 2)): """ Blur the image :params: typ: "gaussian" or "median" """ if typ == "gaussian": return cv2.GaussianBlur(img, kernal, 0, None, 0) elif typ == "median": return cv2.blur(img, kernal) else: return img

效果如下所示:旋轉-傾斜一定角度:

圖片

拉伸-放大:

圖片

拉伸-縮小:

圖片

對比度-增強:

圖片

對比度-降低:

圖片

模糊:

圖片

2.3 基於深度學習的圖像增強

這類方法也是對現有的數據進行圖像增廣進而擴充數據量。深度學習方法是“Synthetic Data and Artificial Neural Networks for Natural Scene Text Recognition”這篇論文提出的合成自然場景文本的方法,適用於文字識別。具體的文本生成過程分爲六步:1)字體渲染。2)描邊、加陰影、着色。3)基礎着色。4)仿射投影扭曲。模擬3D環境。5)自然數據混合。6)加噪聲。此處給出兩個資源:1)Imgaughttps://github.com/aleju/imgaug主要用於物體檢測的增強。2)Augmentorhttps://github.com/mdbloice/Augmentor做一些更復雜的仿射扭曲變換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章