日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...

發(fā)布時(shí)間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者簡(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é)語

以下為正文內(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_mat

09 結(jié)語

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

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

總結(jié)

以上是生活随笔為你收集整理的weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。