weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...
作者簡(jiǎn)介
CW,廣東深圳人,畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院,畢業(yè)后就業(yè)于騰訊計(jì)算機(jī)系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實(shí)習(xí)過,實(shí)操過道路交通元素與醫(yī)療病例圖像分割、視頻實(shí)時(shí)人臉檢測(cè)與表情識(shí)別、OCR等項(xiàng)目。目前也有在一些自媒體平臺(tái)上參與外包項(xiàng)目的研發(fā)工作,項(xiàng)目專注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學(xué)習(xí)方向均有)。前言 : EAST: An Efficient and Accurate Scene Text Detector 是用于場(chǎng)景文字識(shí)別(OCR)的算法,五一假期 CW 把這套算法的源碼研讀了一番,并基于 Pytorch 進(jìn)行了復(fù)現(xiàn),如今打算把這期間的學(xué)習(xí)過程記錄下來,本文將對(duì)數(shù)據(jù)處理與標(biāo)簽生成部分的源碼進(jìn)行解析,其它部分會(huì)在后面的文章中記錄。
全文大綱:
1. DataSet 類
2. is_cross_text:判斷裁剪有無“割裂”圖像中的任意文本框
3. get_score_geo:生成 ground truth
4. shrink_poly:將文本框頂點(diǎn)向內(nèi)移動(dòng),使得文本框區(qū)域變小
5. move_points:將頂點(diǎn)向文本框內(nèi)部移動(dòng)
6. find_min_rect_angle:尋找文本框的最小外接矩形,獲得對(duì)應(yīng)的旋轉(zhuǎn)角度
7. cal_error:計(jì)算文本框與外接矩形的擬合誤差
8. rotate_all_pixels:旋轉(zhuǎn)圖像中的所有點(diǎn)
9. 結(jié)語(yǔ)
以下為正文內(nèi)容
01 DataSet 類
在pytorch 中通常會(huì)封裝一個(gè)類來處理數(shù)據(jù)集,這個(gè)類繼承自 torch.utils.data.DataSet,我們需要重載父類的 _len_ 和 _getitem_ 方法。
處理數(shù)據(jù)集的類 (i)處理數(shù)據(jù)集的類 (ii)處理數(shù)據(jù)集的類 (iii)處理數(shù)據(jù)集的這個(gè)類的整體部分如上,接下來就其中的重要部分進(jìn)行解讀,數(shù)據(jù)增強(qiáng)的隨機(jī)縮放和旋轉(zhuǎn)這里就不說了,一起先來看看將圖像大小裁剪至512x512這部分。
crop_img:對(duì)圖像進(jìn)行隨機(jī)起始點(diǎn)的裁剪,裁剪至目標(biāo)大小512x512
若圖像的短邊小于512,則將其放大到512,同時(shí)長(zhǎng)邊等比例放大。
crop_img(i)然后對(duì)圖像中的文本框坐標(biāo)等比例放大。
crop_img(ii)接下來就是搜索裁剪方案,搜索的方法是:在圖像放大后的尺寸比512x512多出來的空間內(nèi)進(jìn)行隨機(jī)搜索起始點(diǎn)坐標(biāo);一個(gè)符合要求的裁剪方案是:裁剪得到的圖像不能“分割”了圖像中的任一文本框。
crop_img(iii)【注】以上注釋講解中的“裁剪每一中”字樣去掉最后,由于圖像在放大后進(jìn)行了裁剪,因此需要將放大后的文本框頂點(diǎn)坐標(biāo)進(jìn)行相應(yīng)的移動(dòng)。
crop_img(iv)下一步,我們來看看具體是如何判斷裁剪方案是否符合要求的。
02 is_cross_text:判斷裁剪有無“割裂”圖像中的任意文本框
is_cross_text(i)生成裁剪后圖像的多邊形區(qū)域以及文本框的多邊形區(qū)域,計(jì)算兩者的重疊區(qū)域面積。
is_cross_text(ii)計(jì)算重疊區(qū)域面積占文本框面積的比例,理想情況下是1,因?yàn)槲覀円笪谋究蛲耆幱诓眉艉髨D像的內(nèi)部。注意,只要圖像中有任意一個(gè)文本框不完全處于裁剪后的圖像內(nèi)部,則該裁剪方案不符合要求!
is_cross_text(iii)03 get_score_geo:生成 ground truth
這部分是核心部分,會(huì)生成3個(gè)map,分別是score map、geo map 以及 ignore map,他們各自的意義已在前面部分解釋。
get_score_geo(i)以下這部分的處理十分有“藝術(shù)”!
首先明確下,這里制作gt生成的map是在下采樣率為1/4的特征圖上的,map中的每一點(diǎn)有兩種情況:在文本框內(nèi)和在文本框外,于是我們要對(duì)在文本框內(nèi)的這些點(diǎn)賦予文本框?qū)?yīng)的屬性(score為1,d 和 angle)。
但是,在這里,作者將我們需要賦值的文本框內(nèi)點(diǎn)的區(qū)域縮小了(將文本框4個(gè)頂點(diǎn)向內(nèi)部移動(dòng)一定距離,得到一個(gè)比文本框面積小的區(qū)域),這么做的原因可能是因?yàn)檫@個(gè)map的尺寸是比輸入圖像小的,如果和原文本框區(qū)域一致,那么放大回去,有可能會(huì)引入文本框邊界以外的點(diǎn),會(huì)引入假正例。
另外,需要注意的是,這里只是將需要賦值的文本框內(nèi)的區(qū)域縮小,但文本框的坐標(biāo)本身是沒有改變的!
get_score_geo(ii)以上還有個(gè)處理技巧,就是將文本框旋轉(zhuǎn)到和水平軸夾角為0的情況(即將斜的框旋轉(zhuǎn)為正的),這樣對(duì)d的計(jì)算更加方便。
接下來對(duì)旋轉(zhuǎn)后圖像每點(diǎn)(包括在文本框外的)都計(jì)算d,d若大于文本框邊長(zhǎng)也代表在文本框外,但是由于我們有mask,因此這部分也會(huì)被置0。
注意,geo那里使用的是'+=',是因?yàn)閳D像中可能有多個(gè)文本框,而這里我們計(jì)算的是一個(gè)文本框。
get_score_geo(iii)在處理每一個(gè)文本框的過程中,記錄了特征圖中哪些位置該忽略(即不屬于文本框內(nèi)部),哪些位置該賦值(即處于文本框內(nèi)部),最后就是將 ignore map 和 score map 分別用這些多邊形填充。
get_score_geo(iv)下一部分,會(huì)對(duì)以上談到的那個(gè)“藝術(shù)”部分進(jìn)行解讀,看具體是如何將文本框頂點(diǎn)進(jìn)行內(nèi)縮的。
04 shrink_poly:將文本框頂點(diǎn)向內(nèi)移動(dòng),使得文本框區(qū)域變小
首先是計(jì)算出文本框每個(gè)頂點(diǎn)的短邊長(zhǎng)度,計(jì)算邊長(zhǎng)就是計(jì)算頂點(diǎn)之間的距離。
shrink_poly(i)然后判斷下文本框兩對(duì)對(duì)邊哪一對(duì)的長(zhǎng)度和更長(zhǎng),先移動(dòng)長(zhǎng)的那一對(duì)邊(2條邊,4個(gè)頂點(diǎn))。
shrink_poly(ii)注意,以上move_points 代表移動(dòng)一條邊,即2個(gè)頂點(diǎn),返回的是移動(dòng)后頂點(diǎn)的坐標(biāo)(包括未移動(dòng)的),接下來看看具體是如何移動(dòng)頂點(diǎn)的。
05 move_points:將頂點(diǎn)向文本框內(nèi)部移動(dòng)
move_points(i)以下是這部分重點(diǎn)。對(duì)于一條邊上的這兩個(gè)頂點(diǎn),分別計(jì)算它們各自短邊0.3倍邊長(zhǎng)相對(duì)于它們組成的這條邊的比例,然后它們的橫縱坐標(biāo)分別按其對(duì)應(yīng)的這個(gè)比例進(jìn)行移動(dòng),兩者移動(dòng)的方向相反,從而使得兩個(gè)頂點(diǎn)會(huì)相互靠近。
move_points(ii)需要注意一點(diǎn),若這兩個(gè)頂點(diǎn)本身距離不超過1,那就不必移動(dòng)了,因?yàn)檫@說明兩者還未相隔超過1個(gè)pixel。
06 find_min_rect_angle:尋找文本框的最小外接矩形,獲得對(duì)應(yīng)的旋轉(zhuǎn)角度
我們知道,場(chǎng)景文字的方向并不都是水平的,因此文本框與水平軸是有一定角度的,那么如何知道這個(gè)角度是多少呢?
此處是通過枚舉的方式,對(duì)于在 [
] 范圍內(nèi)的每個(gè)角度,都將文本框進(jìn)行對(duì)應(yīng)的旋轉(zhuǎn),旋轉(zhuǎn)后記錄對(duì)應(yīng)的外接矩形面積,文本框和前10個(gè)面積最小的外接矩形的擬合誤差,最終選取誤差最小的那個(gè)方案對(duì)應(yīng)的旋轉(zhuǎn)角。
find_min_rect_angle(i)find_min_rect_angle(ii)為了方便理解,CW 特意畫了個(gè)圖(雖然很丑哈哈哈):
文本框旋轉(zhuǎn),與外接矩形的擬合誤差如上圖,v1、v2、v3、v4是文本框4個(gè)頂點(diǎn),文本框與水平軸的真實(shí)夾角是
,假設(shè)我們?cè)诿杜e過程中遇到一角度,然后將文本框進(jìn)行對(duì)應(yīng)旋轉(zhuǎn),旋轉(zhuǎn)后的外接矩形就是上圖右上部分的ABCD,陰影部分就是外接矩形比文本框多出來的面積。
我們可以認(rèn)為,這個(gè)面積越小則外接矩形與文本框越相近,誤差也越小,因此我們選取面積最小的前10個(gè)外接矩形道理就在于此。
理想情況下,我們找到了真實(shí)的角度,這時(shí)候旋轉(zhuǎn)文本框,得到的外接矩形就會(huì)和文本框重合(當(dāng)然,文本框不是直角矩形而是其它多邊形形狀時(shí),不會(huì)重合),如上圖中間部分,這時(shí)候外接矩形的面積最小,擬合誤差最小。
07 cal_error:計(jì)算文本框與外接矩形的擬合誤差
由上一部分我們知道,擬合誤差與外接矩形面積有正相關(guān)關(guān)系,現(xiàn)在就來看看這個(gè)誤差值具體是通過什么來計(jì)算的。
cal_error上圖代碼應(yīng)該交代的很明白了,擬合誤差實(shí)質(zhì)就是文本框與外接矩形4個(gè)頂點(diǎn)之間對(duì)應(yīng)距離之和。
08 rotate_all_pixels:旋轉(zhuǎn)圖像中的所有點(diǎn)
最后來看看圖像中的點(diǎn)是如何旋轉(zhuǎn)的。
rotate_all_pixels(i)rotate_all_pixels(ii)以上的rotate_mat是旋轉(zhuǎn)操作對(duì)應(yīng)的仿射變換矩陣,根據(jù)旋轉(zhuǎn)角即可計(jì)算獲得:
get_rotate_mat09 結(jié)語(yǔ)
數(shù)據(jù)預(yù)處理與標(biāo)簽生成的源碼解析就到此為止了,CW通過代碼了解到,這里面還是有不少trick的,從而感受到作者在其中加入了很多對(duì)生活實(shí)際情況的思考。由此可知,作為技術(shù)工程師,必須多多觀察與思考,在生活中汲取靈感,這樣才能真正創(chuàng)造出實(shí)用有效的東西。
大家有好的想法,歡迎在評(píng)論區(qū)討論交流~
總結(jié)
以上是生活随笔為你收集整理的weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql语句优化总结 mysql_MySQ
- 下一篇: php面向对象异常处理,PHP面向对象编