---
# System prepended metadata

title: '[Reference Study] 1. Learning to AutoFocus'
tags: [Reference, Supervised Learning, AutoFocus]

---

# [Reference Study] 1. Learning to AutoFocus

###### tags: `Reference`,`AutoFocus`, `Supervised Learning`  
{%hackmd BJrTq20hE %}

  好久沒有動手寫筆記了,想搜集一些目前 Search 到的 3A 的文章（ 但估計幾乎都會與 AF 相關)。預計十天會寫一篇，共計寫三十篇完成一整年的 3A 學習路程。

  那這次要介紹的文章是 Learning to AutoFocus，由Cornell Tech（康乃爾科技） 以及 Goolge於 2020 在 CVPR （ 全名為 Conference on Computer Vision and Pattern Recognition，是全球在電腦視覺與圖型識別上幾個重要的Conference之一）共同發表的一篇 Mobile Camera 中 AutoFocus 在深度學習上的應用。
  
  ---
  簡單講解一下文獻中提出現行任何AF演算法的提出大致上可以分成三類子問題：
  
  
  1. **Focal Stack**:

      ![image alt](https://i.imgur.com/qIPubIK.png =300x40)
      
      n 實際對焦距離
      k 為 1 ~ n 距離 Focal Index
      I~k~ 為不同距離中獨立的 Focal Image's ROI
      k^*^ 為最佳對焦位置
      
      而 Focal Stack 意指儲存（或者遍歷）**所有對焦位置**影像中選出最佳對焦位置的方法,以 CDAF 來說即是計算整體的 sharpness 程度來辨別 k^*^ 的位置。根據不同的演算法則會有不同的量化標準來辨別 k^*^。
      
      
  2. **Single Slice**:

     ![image alt](https://i.imgur.com/v3m1KbL.png =300x28)
     
     第二類子問題我認為主要關鍵在於如何一次即可得知最終的 k^*^ 是在哪個位置，這種問題的解法不外乎透過 estimated Depth 的方式來達到一次到位。只不過也因為預測距離準度差異，通常這一類為最具挑戰性的子問題。
     
  3. **Multi-Step**

     ![image alt](https://i.imgur.com/m7BXWfw.png =300x150)

     第三類子問題的解法重點在如何透過有限地 Search 來找到最佳對焦點的方法，它綜合了前兩項子問題的特性。以現有手機相機的架構底下CDAF,PDAF皆是針對此子問題所提出的Solution。
     
---


  而基於第三類子問題的延伸，以現有手機相機架構為前提的 AF 演算法普遍會受限於硬體設備上的限制。這裡稍微講述基本的相機對焦原理。
  
  
  ![image alt](https://i.imgur.com/Lx036w9.png)
  
  ![image alt](https://i.imgur.com/m2ygqL0.png =210x50)
  
      where 
      L 光圈大小
      f 焦距
      g 對焦距離
      Z 被觀測點的距離
      

透過減少 g 的距離可以有效地改善影像模糊的問題，通常會建議與Ｚ值相等才會達到最佳的成像效果。而 Dual Pixel Camera 的公式:

   ![image alt](https://i.imgur.com/lKaG0GM.png =210x60)
   
    where
    
    d Disparity
    a constant 

---
 
然而本篇中提出該公式並非完美，還有幾點會影響對焦行為而在此公式裡未考量到的因素。以下為它提出的三個因素

1. **Unrealistic PSF Models.**

    一般 Point Spread Function(PSF) 理想上是呈現 Gaussian PSF 之形狀，然而實際狀況是在 Bokeh 以及類似情況下它會產生disc-shaped 或者 Hexagon-shaped 的 Pattern。這會造成在 Hardware 上出現 side effect。
    
2. **Noise in Low Light Environments.**

    Noise因低光源以及ＡＥ作用下會嚴重影響整體影像品質，尤其在Contrast-based Algorithm 會因為整體對比度之問題導致 Out-of-focus。
    
3. **Focal Breath**

    而針對 Focal Breath 現象主要是 Contrast-based Algorithm 因為對焦過程內產生『呼吸』的情況下容易造成Time Out 進而導致 Out of focus 的問題。
    
4. **Hardware Support**

    嚴格來說因果關係是前三者影響 Algorithm 的決策，進而影響VCM的推進決策。當然 VCM 本身又可以再牽扯其 IC driver 的問題導致 Damping。
    
以我個人觀點來看以及實際專案上遇到的情況，影響 AF algorithm 的因素中第二點會比起第一點和第三點還更為顯著。的確 PSF 可能會造成影像，但實際歸咎於ROI的取樣數導致它誤判。（當然 Pixel 內部的算法我不知道它每個 object 的 patch size 是否跟該文獻中提到的Patch size一致;若是如此 PSF pattern 的確會大幅影響 AF 的準確度問題）。

而 Focal Breath 這因素的判斷實在過於籠統，因為會造成 CAF Hunting 的問題最終要回歸於影像品質本身，這部分有可能是因為 Face, AE converage , Flash 等等因素導致 Focal Breath。與其透過機器學習或者統計方法來避免此狀況的發生倒不如針對為什麼會造成Hunting的問題做探討）


文獻提到
*『 Unknown and uncalibrated PSFs, noise, focal breathing,
and the large uncertainty in how the VCM behaves make it
difficult to manually engineer a reliable solution to the autofocus problem. This suggests a learning-based approach using a modern neural network. 』*

卷積神經模型亦或者深度學習的確可以透過所謂的『黑盒子』來幫忙解決趨勢性的問題同時帶來不求甚解的好處。

從目前來看，本文獻想透過 Dual Pixel Camera 利用 Depth-based 來減輕以及避免 CAF 本身基於影像的演算法負擔與缺陷。


---
**Dataset and Network**

  關於 Dataset 的取樣以及詳細的資料的部分，首先如何從數百（以我目前看過的數字來大多落在400 - 700左右）的LensPostion 數，本文獻總共取了49段（0-48)的Focal Depth 實長 0.102m 到 3.91m，以避免整個神經網路過於龐大。而且實際上來說，Coarse Search 的方式來進行 Training 的確比較好。
  

  該文獻採用MobileNetV2，MoibleNet為Google對於Mobile提出的全新模型。透過DepthWise Separable Convolution, Linear Bottleneck and inverted residual 方式減輕傳統Covolution Layer 龐大計算量的負擔。整個模型特色在於減低過去為了追求更高精準度而增加的參數量，並同時維持更高的準確度。設計原型初衷如同模型名稱般，希望能在輕量型手機也能執行計算的卷積神經模型。
  
  有別於一般Image RGB 3 Channel Training，針對該應用採用了兩種Input來分別探討Full Stack 的 Sub-Problem
  
   1. **128 * 128 * 96 channel**
   
   將 Dual Camera 中 Left Image 以及 Right Image 各49張不同深度的影像透過 Concat 的方式分別放入不同Channel，最終共96 Channel。 
    
   2. **128 * 128 * 48 channel**

   將 Dual Camera 中 Left Image 以及 Right Image 各49張不同深度的影像重疊在同一個 Channel 輸入於模型中。
   
   該模型採用 Regression Problem 以及 Adam Optimizer 來解決，並有別於使用傳統corss-entropy的方式，而選用Kronecker Delta function。 
  
---

**Ｒesult and Performance**

1. Nomral Scene 

![image alt](https://i.imgur.com/cFFwqI2.png)
  
  * 此圖 Baseline 為 Learned Depth 
 
2. Low Light Scene

![image alt](https://i.imgur.com/fG6a4fO.png)

  * 此圖 BaseLine 為 ANCC Disparity with Calibration 


  ![image alt](https://i.imgur.com/4zzn7SF.png)
  
以結果來看，整體來說其MSE 以及 RMSE 皆是整體下降錯誤率。這裡唯一比較Confuse的問題在於Normal Light 以及 Low Light 的 Baseline 是不一致的。然而從數據來看，Learned Depth Method 相較於其他 Baseline 來說是相較優秀的。但本文並沒有特別提到為什麼Low Light 突然採用Performance 較差的方法。

3. Focal Breath
 
![image alt](https://i.imgur.com/Aj9146J.png)

Focal Breath 問題

![image alt](https://i.imgur.com/cY4nzYe.png)


![image alt](https://i.imgur.com/PELkGu0.png)


---

結論

本篇文獻是監督式學習在 AF 上的應用，沒有特別提到有哪些創新的方法。我認為最大的貢獻在於它將 AF 演算法的發展大致分成三個 sub-problem 並且利用卷積神經模型來分別取得泛性地成效。

然而監督式學習最大的致命缺點為基於 Database 的廣泛程度以及整體模型能接受的容量大小。儘管使用MobileNetV2這個輕量型神經模型，當整體Special Case 量開始增加後，總有一天會產生Overfitting的問題。

這個問題並非是能靠廣大的資料量能解決。我的意思是，能接受的網路參數量大小受限於Mobile，監督式學習對於此應用的總有極限（畢竟整個文獻資料集只有51 scene)。

蠻期待該研究在未來是否能靠著更優秀的想法來解決此問題。那到時候 AF 就不需要再倚賴人工Tuning，而是走向自動化、智能化的領域了。


