最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

獨家|EAST算法超詳細源碼解析:數(shù)據(jù)預(yù)處理與標簽生成

2020-11-24 18:38 作者:深藍學(xué)院  | 我要投稿

作者簡介

CW,廣東深圳人,畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計算機學(xué)院,畢業(yè)后就業(yè)于騰訊計算機系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實習過,實操過道路交通元素與醫(yī)療病例圖像分割、視頻實時人臉檢測與表情識別、OCR等項目。

目前也有在一些自媒體平臺上參與外包項目的研發(fā)工作,項目專注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學(xué)習方向均有)。

前言

EAST: An Efficient and Accurate Scene Text Detector 是用于場景文字識別(OCR)的算法,五一假期 CW 把這套算法的源碼研讀了一番,并基于 Pytorch 進行了復(fù)現(xiàn),如今打算把這期間的學(xué)習過程記錄下來,本文將對數(shù)據(jù)處理與標簽生成部分的源碼進行解析,其它部分會在后面的文章中記錄。

全文大綱

1. DataSet 類

2. is_cross_text:判斷裁剪有無“割裂”圖像中的任意文本框

3. get_score_geo:生成 ground truth

4. shrink_poly:將文本框頂點向內(nèi)移動,使得文本框區(qū)域變小

5. move_points:將頂點向文本框內(nèi)部移動

6. find_min_rect_angle:尋找文本框的最小外接矩形,獲得對應(yīng)的旋轉(zhuǎn)角度

7. cal_error:計算文本框與外接矩形的擬合誤差

8. rotate_all_pixels:旋轉(zhuǎn)圖像中的所有點

9. 結(jié)語

以下為正文內(nèi)容

? 01 DataSet 類

在pytorch 中通常會封裝一個類來處理數(shù)據(jù)集,這個類繼承自?torch.utils.data.DataSet,我們需要重載父類的?_len_??_getitem_?方法。

處理數(shù)據(jù)集的類 (i)


處理數(shù)據(jù)集的類 (ii)


處理數(shù)據(jù)集的類 (iii)

處理數(shù)據(jù)集的這個類的整體部分如上,接下來就其中的重要部分進行解讀,數(shù)據(jù)增強的隨機縮放和旋轉(zhuǎn)這里就不說了,一起先來看看將圖像大小裁剪至512x512這部分。

crop_img:對圖像進行隨機起始點的裁剪,裁剪至目標大小512x512

crop_img(i)

然后對圖像中的文本框坐標等比例放大。

crop_img(ii)


接下來就是搜索裁剪方案,搜索的方法是:在圖像放大后的尺寸比512x512多出來的空間內(nèi)進行隨機搜索起始點坐標;一個符合要求的裁剪方案是:裁剪得到的圖像不能“分割”了圖像中的任一文本框

crop_img(iii)

【注】以上注釋講解中的“裁剪每一中”字樣去掉

最后,由于圖像在放大后進行了裁剪,因此需要將放大后的文本框頂點坐標進行相應(yīng)的移動。

crop_img(iv)

下一步,我們來看看具體是如何判斷裁剪方案是否符合要求的。

02? is_cross_text:判斷裁剪有無“割裂”圖像中的任意文本框

is_cross_text(i)

生成裁剪后圖像的多邊形區(qū)域以及文本框的多邊形區(qū)域,計算兩者的重疊區(qū)域面積。

is_cross_text(ii)

計算重疊區(qū)域面積占文本框面積的比例,理想情況下是1,因為我們要求文本框完全處于裁剪后圖像的內(nèi)部。注意,只要圖像中有任意一個文本框不完全處于裁剪后的圖像內(nèi)部,則該裁剪方案不符合要求!


is_cross_text(iii)

03??get_score_geo:生成 ground truth

這部分是核心部分,會生成3個map,分別是score map、geo map 以及 ignore map,他們各自的意義已在前面部分解釋。

get_score_geo(i)

以下這部分的處理十分有“藝術(shù)”!

首先明確下,這里制作gt生成的map是在下采樣率為1/4的特征圖上的,map中的每一點有兩種情況:在文本框內(nèi)和在文本框外,于是我們要對在文本框內(nèi)的這些點賦予文本框?qū)?yīng)的屬性(score為1,d 和 angle)。

但是,在這里,作者將我們需要賦值的文本框內(nèi)點的區(qū)域縮小了(將文本框4個頂點向內(nèi)部移動一定距離,得到一個比文本框面積小的區(qū)域),這么做的原因可能是因為這個map的尺寸是比輸入圖像小的,如果和原文本框區(qū)域一致,那么放大回去,有可能會引入文本框邊界以外的點,會引入假正例。

另外,需要注意的是,這里只是將需要賦值的文本框內(nèi)的區(qū)域縮小,但文本框的坐標本身是沒有改變的!

get_score_geo(ii)

以上還有個處理技巧,就是將文本框旋轉(zhuǎn)到和水平軸夾角為0的情況(即將斜的框旋轉(zhuǎn)為正的),這樣對d的計算更加方便。

接下來對旋轉(zhuǎn)后圖像每點(包括在文本框外的)都計算d,d若大于文本框邊長也代表在文本框外,但是由于我們有mask,因此這部分也會被置0。

注意,geo那里使用的是'+=',是因為圖像中可能有多個文本框,而這里我們計算的是一個文本框。

get_score_geo(iii)

在處理每一個文本框的過程中,記錄了特征圖中哪些位置該忽略(即不屬于文本框內(nèi)部),哪些位置該賦值(即處于文本框內(nèi)部),最后就是將 ignore map 和 score map 分別用這些多邊形填充。

get_score_geo(iv)

下一部分,會對以上談到的那個“藝術(shù)”部分進行解讀,看具體是如何將文本框頂點進行內(nèi)縮的。

04??shrink_poly:將文本框頂點向內(nèi)移動,使得文本框區(qū)域變小

首先是計算出文本框每個頂點的短邊長度,計算邊長就是計算頂點之間的距離。

shrink_poly(i)

然后判斷下文本框兩對對邊哪一對的長度和更長,先移動長的那一對邊(2條邊,4個頂點)。

shrink_poly(ii)

注意,以上move_points 代表移動一條邊,即2個頂點,返回的是移動后頂點的坐標(包括未移動的),接下來看看具體是如何移動頂點的。

05??move_points:將頂點向文本框內(nèi)部移動

move_points(i)

以下是這部分重點。對于一條邊上的這兩個頂點,分別計算它們各自短邊0.3倍邊長相對于它們組成的這條邊的比例,然后它們的橫縱坐標分別按其對應(yīng)的這個比例進行移動,兩者移動的方向相反,從而使得兩個頂點會相互靠近。

move_points(ii)

需要注意一點,若這兩個頂點本身距離不超過1,那就不必移動了,因為這說明兩者還未相隔超過1個pixel。

06??find_min_rect_angle:尋找文本框的最小外接矩形,獲得對應(yīng)的旋轉(zhuǎn)角度

我們知道,場景文字的方向并不都是水平的,因此文本框與水平軸是有一定角度的,那么如何知道這個角度是多少呢?

此處是通過枚舉的方式,對于在 [

] 范圍內(nèi)的每個角度,都將文本框進行對應(yīng)的旋轉(zhuǎn),旋轉(zhuǎn)后記錄對應(yīng)的外接矩形面積,文本框和前10個面積最小的外接矩形的擬合誤差,最終選取誤差最小的那個方案對應(yīng)的旋轉(zhuǎn)角。

find_min_rect_angle(i)
find_min_rect_angle(ii)

為了方便理解,CW 特意畫了個圖(雖然很丑哈哈哈):

文本框旋轉(zhuǎn),與外接矩形的擬合誤差

如上圖,v1、v2、v3、v4是文本框4個頂點,文本框與水平軸的真實夾角是,假設(shè)我們在枚舉過程中遇到一角度,然后將文本框進行對應(yīng)旋轉(zhuǎn),旋轉(zhuǎn)后的外接矩形就是上圖右上部分的ABCD,陰影部分就是外接矩形比文本框多出來的面積。

我們可以認為,這個面積越小則外接矩形與文本框越相近,誤差也越小,因此我們選取面積最小的前10個外接矩形道理就在于此。

理想情況下,我們找到了真實的角度,這時候旋轉(zhuǎn)文本框,得到的外接矩形就會和文本框重合(當然,文本框不是直角矩形而是其它多邊形形狀時,不會重合),如上圖中間部分,這時候外接矩形的面積最小,擬合誤差最小。

07??cal_error:計算文本框與外接矩形的擬合誤差

由上一部分我們知道,擬合誤差與外接矩形面積有正相關(guān)關(guān)系,現(xiàn)在就來看看這個誤差值具體是通過什么來計算的。

cal_error

上圖代碼應(yīng)該交代的很明白了,擬合誤差實質(zhì)就是文本框與外接矩形4個頂點之間對應(yīng)距離之和。

08??rotate_all_pixels:旋轉(zhuǎn)圖像中的所有點

最后來看看圖像中的點是如何旋轉(zhuǎn)的。

rotate_all_pixels(i)
rotate_all_pixels(ii)

以上的rotate_mat是旋轉(zhuǎn)操作對應(yīng)的仿射變換矩陣,根據(jù)旋轉(zhuǎn)角即可計算獲得:

get_rotate_mat

09??結(jié)語

數(shù)據(jù)預(yù)處理與標簽生成的源碼解析就到此為止了,CW通過代碼了解到,這里面還是有不少trick的,從而感受到作者在其中加入了很多對生活實際情況的思考。由此可知,作為技術(shù)工程師,必須多多觀察與思考,在生活中汲取靈感,這樣才能真正創(chuàng)造出實用有效的東西。

可添加深藍學(xué)院黎新(微x:csig-igal),領(lǐng)取PDF版論文,領(lǐng)取時請回復(fù)“EAST”。

大家有好的想法,歡迎在評論區(qū)討論交流~

獨家|EAST算法超詳細源碼解析:數(shù)據(jù)預(yù)處理與標簽生成的評論 (共 條)

分享到微博請遵守國家法律
龙口市| 沙雅县| 广平县| 思茅市| 株洲县| 黑河市| 饶河县| 内丘县| 合川市| 务川| 宁海县| 广宗县| 兰西县| 沙湾县| 奉化市| 泗洪县| 清涧县| 新营市| 吉林市| 大田县| 浪卡子县| 巴林右旗| 灵川县| 韶关市| 汉源县| 紫金县| 永兴县| 商城县| 成武县| 高淳县| 古丈县| 辉县市| 汶上县| 富宁县| 金门县| 平昌县| 涿州市| 合作市| 安阳县| 平陆县| 开远市|