# RGB2IR image translation(for face images)
[toc]
## introduction
為什麼會開始這個project呢?
現在的人臉辨識普遍都是用RGB圖片來做training以及testing, 漸漸有一些RGB-D(depth)等額外的資源來增加判斷能力
而我的教授認為RGB再加上IR(infrared 紅外線)圖片可能會是未來的趨勢, 但現有的IR dataset很少, 都還是以RGB dataset為主
所以他認為如果能有一個能把RGB人臉轉成IR人臉的model, 就能自己生成IR dataset, 不用額外去找RGB-IR pair的dataset
最後我跟採用pix2pix以及cycleGAN這兩個知名的model來進行training
---
### pix2pix
+ https://arxiv.org/pdf/1611.07004.pdf
透過U-net架構的generator以及patchGAN的discriminator所形成的GAN, 而兩個domain(RGB, IR)的data必須是pairwise
---
### cycleGAN
+ https://arxiv.org/pdf/1703.10593.pdf
透過兩個domain的cycle consistency loss, 藉由在domain之間的重建來學習, 兩個domain(RGB, IR)的data不用是pairwise(但在我的training中還是使用pairwise data)
---
## experiment
### pix2pix
+ https://machinelearningmastery.com/how-to-develop-a-pix2pix-gan-for-image-to-image-translation/
code是使用這篇文章提供的, 非常感謝Jason大大
#### batch size
在前期train出來得到一堆模模糊糊的照片後, 開始在網路上找很多文章, 後來看到 https://arxiv.org/pdf/2101.09793.pdf 這篇paper中提到他們也是要將人臉圖片做轉換, 只是是轉換成卡通樣式的人臉, 他們提到batch size設成1對於產生出來的圖片效果最好, 後續也有看過其他paper提到這件事, 有興趣的朋友可以再去內文看看
+ 結論: batch size = 1
#### patch size
在pix2pix中最主要的嘗試是在於discriminator也就是patchGAN的patch大小的選擇上
在pix2pix原文中提到patch size是70 * 70, 他們的實驗發現這個size效果最好, 但他們主要是測試在街景上, 對於人臉則會產生artifact, 也是苦惱我很久的問題
後來經過百般測試後, patch size = 14 * 14的效果最好, 而且我總共train了100個epoch, 第80個epoch的model weight產生圖片的MSE反而是最低的
+ 結論: patch size = 14 * 14, 100 epoch中採用第80個epoch的model weight
+ 我猜patch size = 7 * 7的效果應該也不錯, 但在一次比較中, 14 * 14的效果比7 * 7好, 我後面就沒有再去試7 * 7, 而且7 * 7要花更多時間train
### cycleGAN
+ https://machinelearningmastery.com/cyclegan-tutorial-with-keras/
code是來自這個文章, 一樣出自Jason大大
這邊主要是學長在做, 後來他休學了, 我只負責在他的參數設置下重新train一次(跟pix2pix相同的data)
我看了一下他的code, 參數等等的設置基本上都跟原本一樣, patch size也沒有調整
所以這部分沒有什麼能夠分享的
---
## challenge(focus on pix2pix)
這是一段漫長的過程, 前前後後大概4個多月, 最大的原因是這是我第一個不是課堂上的training, 在實際戰場上的經驗非常少
一開始根本連paper內容都沒有徹底看過一次, 就只知道把data丟進去開始硬train一發, train出來被教授退件了好幾次, 過程真的很挫折, 覺得教授在搞, 這東西根本沒搞頭, 別再鬧了
但現在回過頭看, 真的是怪自己沒有好好先仔細讀paper, 了解整個架構跟每個細節
現在來談談幾個我在過程中的想法
1. 增加data量
一開始很菜, 覺得出來的圖片quality很糟, 一定是因為data量太少(後來用到30000張發現結果還是很糟, 直接沒招)
以為只要提高data的量, 一定萬事都ok
但後來就算只用7000張一樣能得到不錯的效果
+ 
+ 用了30680張training data得到的結果
2. batch size = 1
這點在上面experiment有提到, 因為我後來都用batch size = 1, 所以沒有什麼對照組能說明在同樣情況下batch size大一點會怎麼樣
我自己覺得這個點幫助沒有很大, 反而還讓training時間拉長, 但人家都有實驗證明效果比較好了, 我就沒有花時間再去找自己麻煩了
+ 
+ batch size = 1
3. patch size
這點絕對是最關鍵的, 一開始跑出來的圖片, 臉都會有artifact(白色斑點), 我根本不知道從何下手, 網路上也都沒有類似的例子
一直到我好好把pix2pix的paper看完, 才發現有可能是discriminator的patch size太大了
原文的training圖片是街景, size是1024 * 2048(Cityscapes Dataset), 跟我所使用的差別太大了
我所使用的是256 * 256的人臉(cropped)圖片, 所以patch size一定要用不同的大小
人臉對於五官等細節要求更大, 所以往小一點的size去試會是一個比較好的方向
最後我選擇了patch size = 14 * 14得到最低的MSE
+ patch size = 7 * 7(MSE = 46.36)
+ 
+ patch size = 10 * 10(MSE = 46.11)
+ 
+ patch size = 14 * 14(MSE = 44.43)
+ 
+ patch size = 30 * 30(MSE = 48.06)
+ 
4. training data的選擇
在好幾次的meeting, 教授都有問我, 為什麼generate出來的圖片比groundtruth還要暗
我就想說, 我哪知道啊, 啊就比較暗啊, 我又沒調整什麼東西
這邊就要感謝學長的幫忙, 我後來提出這個問題跟他討論, 才發現是在dataset中, 後面幾個資料夾的圖片整體都偏暗(因為IR圖片有些比較暗), 以前我只是隨便選最後幾個資料夾來做training data, 想說只要跟test data不一樣就好
後來才發現這樣會讓model產生的圖片顏色都偏暗
所以知道這件事之後, 我就重新挑了training data, 讓亮的暗的、有眼鏡的沒眼鏡的、男的女的、有笑的沒笑的盡量包含進來, 來增加model的generalizability
下圖左邊為pix2pix結果, 右邊為cycleGAN結果
+ 
+ 最後最好的結果(MSE = 24.89)
+ 最後有幾點補充
1. 如果training data相同的話, pix2pix會比較有效率, cycleGAN要花更多時間來train (10 epochs: 6hr, 10 epochs: 45hr) (resolution: 256 * 256)
2. 女生頭髮的變化比較大, model比較難產生high quality的圖片
## thoughts
在這4個月過程中, 真的學到很多東西
曾經我覺得幹嘛做這個, 又不是跟我畢業題目相關, 而且其他碩一都不用做(因為只有我是face team), 為什麼要搞我
也覺得很挫折, 當時也有兩門很重的課, 常常壓力大到流淚, 覺得幹嘛讀碩士(雖然我現在還是這樣覺得, 看看之後會不會改觀)
但真的在快要到尾聲的時候我才發現, 這過程中真的了解了很多細節
做研究不再是一個可以很快有答案的東西, 想要很快有答案, 那就自己認真去找
同時, 經驗也同樣重要, 如果今天我有經驗, 那我猜大概1個月就可以結束了吧, 但多出來的這3個月我認為花得很值得, 這當中的歷程真的只有自己走過才能體會
也很謝謝學長跟我討論, 他其實是西非人, 跟他討論訓練英文也蠻不錯的, 他也是一直鼓勵我, 有什麼問題他都會願意討論, 就算他休學了我找他問問題他還是會回我
總之, 謝謝這個project, 讓我碩一上很痛苦, 但現在回想起來蠻好的
2021/11~2022/3