# ITRI 2023 summer internship 這一次的實習是在工研院的服科中心做影像辨識實習生,實習期間是7/3到8/31。 期間有做過幾個主題的,算是ML在CV領域的小應用 * [Text Super Resolution](#Text-Super-Resolution) * [Table Structure Recognition](#Table-Structure-Recognition) * [Face Super Resolution](#Face-Super-Resolution) * [Pose Estimation](#Pose-Estimation) * [Table Key Information Extraction](#Table-Key-Information-Extraction) 接下來會在下面分段介紹。這裡是我所有報告用的[投影片][6] ## Text Super Resolution Text SR的目標就是要將模糊的文字變得更清楚,以提高後續的OCR準確率以及其他應用。 簡單的例子如下([圖源][1])。 ![](https://hackmd.io/_uploads/r1N42ogT3.jpg) 這邊有嘗試幾個模型,如下 * [TextZoom](#TextZoom) * [MARCONet](#MARCONet) * ~~DPMN~~ (README寫得不清楚,程式碼一直跑不起來,並且沒有pretrained weight) * ~~TATT~~ (是text prior的模型,且模型只有訓練在英文和數字的資料集) * ~~TPGSR~~ (原因同上) ### TextZoom [Scene Text Image Super-Resolution in the Wild, ECCV 2020][1] 這一篇論文是Text SR領域早期的論文,他的主要貢獻是蒐集了真實環境的low resolution text image。 在此之前的模型大多使用各種down sampling的方法來用high resolution(以下簡稱HR)的圖片來合成low resolution(以下簡稱LR), 但是在現實情況中拍攝到的LR照片通常不會這麼簡單,有些線條的部分會糊在一起, 這會導致先前論文的模型拿來訓練的資料太過簡單,並不能適應於真實世界的任務中。 <div style="text-align:center"> <img src="https://hackmd.io/_uploads/B1yKqqZa3.jpg"/> </div> <br> 這篇論文的作法是利用不同焦距的相機拍攝,然後再切出文字的部分。 ![](https://hackmd.io/_uploads/r1HkA9Wpn.jpg) 這篇論文也有提出TSRN模型 ![](https://hackmd.io/_uploads/rkq8CqZa2.jpg) 其中比較有意思的是,這個模型參考了NLP的概念。傳統的SR只注意圖像細節的修復,僅滿足人類的視覺感知, 但是,text SR是一項特殊的任務,因為它包含高級文本內容,前後字符之間具有一定的關係。 如果其他字符清晰可見,則單個模糊字符不會使人類無法識別整個單詞。所以這個模型引入了SRB, 來對文本行中的信息進行建模,這使得我們能夠在前後字符之間建立關聯性。 模型使用方法寫在[這裡][11]。 結果如下,這是跑在TextZoom自己的測試集上的結果 <div style="text-align:center"> <img src="https://hackmd.io/_uploads/Syo4LCWph.jpg"/> </div> <br> 每張小圖是一個測資,上中下分別為LR、SR、HR,模型的成效還不錯,很多糊在一起的線條都有被分開來。 但是這些是單個英文單字的圖片,下圖才是主管想要拿來測試的圖片(中文表格)。 ![](https://hackmd.io/_uploads/rkjJuC-a2.jpg) 結果如下: 用pretrained的模型跑出來的結果如下 ![](https://hackmd.io/_uploads/B1-e1Jfp3.jpg) 由於成果實在是黑到不行,所以有嘗試了以下幾種方法來調整SR圖片 * CLAHE:可以自動調整圖片的亮度對比度,是opencv的內建函式,但是成果沒有到很好,調整後的圖片出現了像是ringing effect的波紋(上:調整前、下:CLAHE調整後) ![](https://hackmd.io/_uploads/SyNNWyf62.jpg) * UNet:github上有人提供了一個可以自動調整對比度的模型,但是成效不佳 * binarize:設定一個threshold,將每個像素依照亮度值分成黑色或是白色,這裡最大的問題就是要如何去決定這個threshold。 有用過[Otsu演算法](https://zh.wikipedia.org/zh-tw/%E5%A4%A7%E6%B4%A5%E7%AE%97%E6%B3%95),他的概念是將將圖片分成背景跟前景兩群,然後找到一個threshold能最大化兩群間的變異數,最小化兩群內的變異數,但是成效不大好。 ![](https://hackmd.io/_uploads/HyhLIJzan.jpg) 也有嘗試將亮度值從小排到大,再用百分位數當成threshold,但是這樣遇到一個問題,就是不同的圖片應該要選的threshold不大一樣,直接用固定的百分位數當成threshold不能很好的事應在每張圖片上。 後來我將圖片的亮度像素直方圖(統計有幾個像素是哪個亮度)畫出來之後,想到了新的計算方法。 ![](https://hackmd.io/_uploads/Sk7M-xf6n.jpg) 以上三張圖是三個測資的像素質方圖,紅色的線看起來是一個比較適合的threshold,所以我將threshold訂成是**第一個峰值過後的最小值**,這樣做binarize後的結果會比較穩定,在每一張測資上表現的都還不錯。 ![](https://hackmd.io/_uploads/BJKftlGTh.jpg) 最後,是比較用pretrained模型跟自己訓練了300個epoch的模型的結果, ![](https://hackmd.io/_uploads/HJIH2gGp3.jpg) ![](https://hackmd.io/_uploads/Bk6j3ef63.jpg) 可以看出,用pretrained模型跑出來的結果的確是有比較清楚的,而且在二極化後也比較少黑色斑塊 ### MARCONet [Learning Generative Structure Prior for Blind Text Image Super-resolution, CVPR 2023][2] 這一篇論文模型結構圖如下: ![](https://hackmd.io/_uploads/H1AK5lmp3.jpg) 模型會提取出圖片特徵以及字型特徵,接著將圖片中的字串切成字元,預測每一個字元是什麼,再用預測的字元當作索引,去codebook中尋找對應的字元特徵, 最後用字元特徵、字型特徵、圖片特徵去生成SR結果。 MARCONet在論文測試集上面的結果非常傑出,可以把模糊到不行的圖片變成超高清版本,如下,從上到下的順序分別為 <u>LR</u>、<u>LR中字元的bounding box</u>、<u>SR</u>、<u>字元特徵+字型特徵生成的結果</u>。 ![](https://hackmd.io/_uploads/HybDAlX6h.jpg) 但是由於MARCONet的訓練資料中僅有**簡體中文、標點符號、英文和數字**,但是我們的測資是**繁體中文**的表格,所以生成的結果都會傾向於把繁體字辨識成近似的簡體字(甚至不一定是同一個中文字),然後用這個簡體字的特色去生成結果,這就是使用text prior模型的缺點之一,如果字元辨識錯誤的話,最後的結果就會錯的很離譜。解決方法應該是要將模型用繁體中文的資料集重新訓練,但是目前手邊只有幾張測資而已,沒有資料集可以訓練,所以只好作罷。 ![](https://hackmd.io/_uploads/S1MAGWQan.jpg) ![](https://hackmd.io/_uploads/rkP0MbXph.png) 可以看到結果幾乎都被錯誤辨識的簡體字帶歪了 ## Table Structure Recognition 幫忙用[paddleOCR][3]跑表格切割,顧名思義就是以表格的結構,將每一個儲存格的內容提取出來並且做OCR,模型結構如下: ![](https://hackmd.io/_uploads/H1oqsS7a2.jpg) 模型會先預測哪裡有文字、文字的內容是什麼、以及表格的結構,接著再匹配文字框以及表格框,生成excel檔 這張圖片是模型預測的**表格結構**: ![](https://hackmd.io/_uploads/SJz8qYNph.jpg) 可以看到由於照片中的表格不是完全方正的,有因為拍照角度而稍微歪斜,但是看起來模型沒有辦法處理這類的相片,在邊邊的部分的儲存格都抓錯位置了。 這張圖片是模型預測的**文字框**: ![](https://hackmd.io/_uploads/H1pN2tNTh.jpg) 結果稍微比表格結構來的好,但也還是沒辦法真正拿來用。嘗試做過許多處理(二極化、Text SR、加粗)後的結果仍然不理想。也有嘗試過幾個[pretrained weight][4],如下。 * ch_ppocr_server_v2.0_det * ch_PP-OCRv3_det * ch_ppocr_server_v2.0_rec * ch_PP-OCRv3_rec * 主管提供的手寫數字辨識模型 這邊我也有嘗試用傳統電腦視覺的方法來檢測表格的結構,用直向以及橫向的kernel檢測照片中的直線以及橫線,再用`cv2.findContours`找出表格結構的輪廓。結果如下: ![](https://hackmd.io/_uploads/rktgGSJC3.jpg) ![](https://hackmd.io/_uploads/r1T1CCe03.jpg) 可以看到有些儲存格中還有更小的框框,或是有些被其中的手寫文字分割成兩個框框。由於太難用條件來排除這類情況,所以我後來捨棄了這個做法。 ## Face Super Resolution Face SR的目標就是針對人臉部分提高解析度,可以使畫質較差的設備(e.g. 監視器、行車紀錄器) 也可以透過模型獲得清晰的人臉以進行其他應用(e.g. 身分識別等) 這邊有嘗試幾個模型,如下 * ~~ESRGAN~~ (沒有效果) * [SPARNet](#SPARNet) * [CodeFormer](#CodeFormer) ### SPARNet [Learning Spatial Attention for Face Super-Resolution, IEEE 2020][5] SPARNet的部分有寄信跟原作者索取pretrained weight,按照位置將這些檔案放好就可以跑了,要最好的效果的話,要用SPARNet-HD-3D的權重。 但是SPARNet仍然沒有辦法做的很好,尤其是在人臉上有配件時(e.g. 眼鏡、口罩),以及側臉的情況。結果在[投影片][6]中的p.138~p.148可以看到。 ### CodeFormer [Towards Robust Blind Face Restoration with Codebook Lookup Transformer, NIPS 2022][7] CodeFormer幾乎可以在全部情況下都跑得很好,在臉上有配件時也可以處理得不錯,並且不像SPARNet有人臉跟背景融合的問題。結果在[投影片][6]中的p.138~p.148可以看到。這邊也有將模型打包成API,使用方法在[這裡][9]會介紹。 ## Pose Estimation 在即時串流上捕捉骨架姿態,以分析完成了什麼動作。 這邊嘗試了[YOLOv7][8]的模型,使用方法會在別篇介紹。YOLOv7的優點就是它同時也有偵測物體的框框,所以可以用框的大小來判斷物體的遠近。yolov7處理640\*480的影片為15.7fps。總共有寫了4版的程式碼,分別為**圖片**、**影片**、**即時串流(分成有視窗顯示骨架偵測以及沒有視窗顯示)**,即時串流的部分會偵測三種動作: * 研磨咖啡粉 * 敲平咖啡粉 * 手沖咖啡粉 其中完成動作的次數在**有視窗**時,會顯示在視窗的上方,在**沒有視窗**時,會顯示在終端上,使用方法在[這裡][10]會介紹。 其中研磨咖啡粉的動作有研發了好幾版,最後聽從主管的建議,使用肩膀當作左邊及右邊的基準點,這一版的作法是最為簡單並且最可以應付各種突發狀況。 後來花了很多時間在研究要怎麼樣編譯opencv在GPU上,用了好幾個教程,但是後來不是編譯失敗就是依舊沒辦法使用GPU,後來就改成用MPC來處理影片。但是這個部分也是來不及作完,實習就結束了。 ## Table Key Information Extraction Information Extraction可以抓取表格中資訊的關係,這邊使用的是paddleOCR提供的Key Information Extraction模型,測資是之前text SR的表格。環境的架設很麻煩,但是由於最後的成果不大好,後來也沒有繼續研究這個部分,結果如下。 ![](https://hackmd.io/_uploads/By34w9PC2.jpg) [1]: https://arxiv.org/pdf/2005.03341.pdf [2]: https://arxiv.org/pdf/2303.14726.pdf [3]: https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/ppstructure/table/README_ch.md [4]: https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/models_list.md [5]: https://arxiv.org/pdf/2012.01211.pdf [6]: https://docs.google.com/presentation/d/1I8qDbIPtxmI5V5_8EXE9enJsddFAhokE3p2H4VAGj14/edit?usp=sharing [7]: https://arxiv.org/pdf/2206.11253.pdf [8]: https://github.com/WongKinYiu/yolov7/tree/pose [9]: https://hackmd.io/@cindy203cc/SJjRnuNRh [10]: https://hackmd.io/@cindy203cc/S1zM4AI0h [11]: https://hackmd.io/@cindy203cc/SkcaOi-T3