---
# System prepended metadata

title: ITRI 2023 summer internship

---

# 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