深度學習(三)----算法崗面試題


● 神經網絡為啥用交叉熵。

參考回答:

通過神經網絡解決多分類問題時,最常用的一種方式就是在最后一層設置n個輸出節點,無論在淺層神經網絡還是在CNN中都是如此,比如,在AlexNet中最后的輸出層有1000個節點,而即便是ResNet取消了全連接層,也會在最后有一個1000個節點的輸出層。

一般情況下,最后一個輸出層的節點個數與分類任務的目標數相等。假設最后的節點數為N,那么對於每一個樣例,神經網絡可以得到一個N維的數組作為輸出結果,數組中每一個維度會對應一個類別。在最理想的情況下,如果一個樣本屬於k,那么這個類別所對應的的輸出節點的輸出值應該為1,而其他節點的輸出都為0,即[0,0,1,0,….0,0],這個數組也就是樣本的Label,是神經網絡最期望的輸出結果,交叉熵就是用來判定實際的輸出與期望的輸出的接近程度。

● 注意力公式

參考回答:

Soft attention、global attention、動態attention

Hard attention

靜態attention“半軟半硬”的attention (local attention)

 

強制前向attention

● 論文flow情況

參考回答:

談談自己投稿的論文,論文投稿級別,論文內容,用到的方法,對比方法等

● Flappy.Bird開發者,怎么利用DNQ方法強化學習你的游戲AI

參考回答:

強化學習是機器學習里面的一個分支。它強調如何基於環境而行動,以取得最大化的預期收益。其靈感來源於心理學中的行為主義理論,既有機體如何在環境給予的獎勵或者懲罰的刺激下,逐步形成對刺激的預期,產生能夠最大利益的習慣性行為。結構簡圖如下:

因為強化學習考慮到了自主個體、環境、獎勵等因素,所以很多人包括強化學習的研究者Richard Sutton 都認為它是人工智能中最高層的模型,其它深度學習、機器學習模型都是它的子系統。在圍棋界先后打敗世界冠軍的李世乭和柯潔額alphaGo就使用了強化學習模型,也正是這兩次比賽,把人工智能這個概念傳遞給了大眾。使用的是卷積神經網絡結構。

● LeNet-5結構

參考回答:

輸入層:32∗3232∗32的圖片,也就是相當於10241024個神經元

C1層:選取66個特征卷積核,大小為5∗55∗5(不包含偏置),得到66個特征圖,每個特征圖的大小為32−5+1=2832−5+1=28,也就是神經元的個數由10241024減小到了28∗28=78428∗28=784。

輸入層與C1層之間的參數:6∗(5∗5+1)6∗(5∗5+1),對於卷積層C1,每個像素都與前一層的5∗55∗5個像素和11個bias有連接,有6∗(5∗5+1)∗(28∗28)6∗(5∗5+1)∗(28∗28)個連接

S2層:池化,是一個下采樣層(為什么是下采樣?利用圖像局部相關性的原理,對圖像進行子抽樣,可以減少數據處理量同時保留有用信息),有66個14∗1414∗14的特征圖,特征圖中的每個單元與C1中相對應特征圖的2∗22∗2鄰域相連接。S2S2層每個單元對應C1C1中44個求和,乘以一個可訓練參數,再加上一個可訓練偏置。

C1與S2之間的參數:每一個2∗22∗2求和,然后乘以一個參數,加上一個偏置,共計2∗6=122∗6=12個參數。S2S2中的每個像素都與C1C1中的2∗22∗2個像素和11個偏置相連接,所以有6∗5∗14∗14=58806∗5∗14∗14=5880個連接

C3層:選取卷積核大小為5∗55∗5,得到新的圖片大小為10∗1010∗10我們知道S2包含:6張14∗146張14∗14大小的圖片,我們希望這一層得到的結果是:16張10∗1016張10∗10的圖片。這1616張圖片的每一張,是通過S2S2的66張圖片進行加權組合得到的,具體是怎么組合的呢?

S2與C3之間的組合

前66個feature map與S2S2層相連的33個feature map相連接,后面66個feature map與S2層相連的4個S2層相連的4個feature map相連接,后面33個feature map與S2S2層部分不相連的44個feature map相連接,最后一個與S2S2層的所有feature map相連。卷積核大小依然為5∗55∗5,總共有6∗(3∗5∗5+1)6∗(3∗5∗5+1)+6∗(4∗5∗5+1)6∗(4∗5∗5+1)+3∗(4∗5∗5+1)3∗(4∗5∗5+1)+1∗(6∗5∗5+1)=15161∗(6∗5∗5+1)=1516個參數。而圖像大小為10∗1010∗10,所以共有151600151600個連接。

S4層

池化,窗口大小為2∗22∗2,有1616個特征圖,總共有3232個參數

C3與S4之間的參數

16∗(25∗4+25)=200016∗(25∗4+25)=2000個連接

C5層

總共120120個feature map,每個feature map與S4S4層所有的feature map相連接,卷積核大小是5∗55∗5,而S4S4層的feature map的大小也是5∗55∗5,所以C5C5的feature map就變成了1個點,共計有120(25∗16+1)=48120120(25∗16+1)=48120個參數。

F6層

全連接

F6F6相當於MLP中的隱含層,有8484個節點,所以有84∗(120+1)=1016484∗(120+1)=10164個參數。F6F6層采用了正切函數。

輸出層

采用了RBF函數,即徑向歐式距離函數
 

● 推導LSTM正向傳播和單向傳播過程

參考回答:

前向推導過程:

反向推導過程:

 

● LSTM原理,與GRU區別

參考回答:

LSTM算法全稱為Long short-term memory,是一種特定形式的RNN(Recurrent neural network,循環神經網絡),而RNN是一系列能夠處理序列數據的神經網絡的總稱。

RNN在處理長期依賴(時間序列上距離較遠的節點)時會遇到巨大的困難,因為計算距離較遠的節點之間的聯系時會涉及雅可比矩陣的多次相乘,這會帶來梯度消失(經常發生)或者梯度膨脹(較少發生)的問題,這樣的現象被許多學者觀察到並獨立研究。為了解決該問題,研究人員提出LSTM。

LSTM是門限RNN,其單一節點的結構如下圖1所示。LSTM的巧妙之處在於通過增加輸入門限,遺忘門限和輸出門限,使得自循環的權重是變化的,這樣一來在模型參數固定的情況下,不同時刻的積分尺度可以動態改變,從而避免了梯度消失或者梯度膨脹的問題。

圖1 LSTM的CELL示意圖

根據LSTM網絡的結構,每個LSTM單元的計算公式如下圖2所示,其中Ft表示遺忘門限,It表示輸入門限,Ct表示前一時刻cell狀態、Ct表示cell狀態(這里就是循環發生的地方),Ot表示輸出門限,Ht表示當前單元的輸出,Ht-1表示前一時刻單元的輸出。

圖2 LSTM計算公式

與GRU區別:1)GRU和LSTM的性能在很多任務上不分伯仲。2)GRU 參數更少因此更容易收斂,但是數據集很大的情況下,LSTM表達性能更好。3)從結構上來說,GRU只有兩個門(update和reset),LSTM有三個門(forget,input,output),GRU直接將hidden state 傳給下一個單元,而LSTM則用memory cell 把hidden state 包裝起來。
 

● DNN的梯度更新方式

參考回答:

1)批量梯度下降法BGD

批量梯度下降法(Batch Gradient Descent,簡稱BGD)是梯度下降法最原始的形式,它的具體思路是在更新每一參數時都使用所有的樣本來進行更新,其數學形式如下:

(1) 對上述的能量函數求偏導:

(2) 由於是最小化風險函數,所以按照每個參數的梯度負方向來更新每個:

2)隨機梯度下降法SGD

由於批量梯度下降法在更新每一個參數時,都需要所有的訓練樣本,所以訓練過程會隨着樣本數量的加大而變得異常的緩慢。隨機梯度下降法(Stochastic Gradient Descent,簡稱SGD)正是為了解決批量梯度下降法這一弊端而提出的。

將上面的能量函數寫為如下形式:

利用每個樣本的損失函數對求偏導得到對應的梯度,來更新:

3)小批量梯度下降法MBGD

有上述的兩種梯度下降法可以看出,其各自均有優缺點,那么能不能在兩種方法的性能之間取得一個折衷呢?即,算法的訓練過程比較快,而且也要保證最終參數訓練的准確率,而這正是小批量梯度下降法(Mini-batch Gradient Descent,簡稱MBGD)的初衷。

● CNN為什么比DNN在圖像識別上更好

參考回答:

DNN的輸入是向量形式,並未考慮到平面的結構信息,在圖像和NLP領域這一結構信息尤為重要,例如識別圖像中的數字,同一數字與所在位置無關(換句話說任一位置的權重都應相同),CNN的輸入可以是tensor,例如二維矩陣,通過filter獲得局部特征,較好的保留了平面結構信息。

● 現場用collabedit寫代碼,一個怪異的歸並算法。。。之前沒遇到過,直接把歸並寫出來,但是說復雜度太高,優化了三遍還不行,最后說出用小頂堆解決了。。。

參考回答:

歸並算法:
1
2
#include <iostream>
using namespace std;

//將有二個有序數列a[first...mid]和a[mid...last]合並。

void __merge(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void __merge_sort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
__merge_sort(a, first, mid, temp);
__merge_sort(a, mid + 1, last, temp);
__merge(a, first, mid, last, temp);
}
}
bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
{
return false;
}
else
{
__merge_sort(a, 0, n - 1, p);
delete[] p;
return true;
}
}
int main()
{
const int LEN = 10;
int a[LEN] = { 23, 40, 45, 19, 12, 16, 90, 39, 87, 71 };
cout<<"Before the merge sort, the Array is:"<<endl;
for(int i = 0; i < LEN; ++i)
{
cout<<a[i]<<" ";
}
cout<<endl;
cout<<endl;
MergeSort(a, LEN);
cout<<"After the merge sort, the Array is:"<<endl;
for(int i = 0; i < LEN; ++i)
{
cout<<a[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}

小頂堆:

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Arrays;
public class SmallHeap {
public  static int[] topN(int[] arr, int n) {
int[] list = new int[n];
System.arraycopy(arr,  0 , list,  0 , n);
for (int i =  0 ; i < n; i++) {
int t = i;
while (t !=  0 && list[parent(t)] > list[t]) {
swap(list, t, t = parent(t));
}
}
for (int i = n, len = arr.length; i < len; i++) {
if (arr[i] >= list[ 0 ]) {

// 置換棧頂

list[0] = arr[i];

// 調整棧頂

int t = 0;
while((left(t)<n&&list[t]>list[left(t)])||(right(t)<n&& list[t]>list[right(t)])) {
if (right(t) < n && list[right(t)] < list[left(t)]) {
swap(list, t, t = right(t));
} else {
swap(list, t, t = left(t));
}
}
}
}
return list;
}
private static void swap(int[] list, int i, int j) {
int tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}
private static int parent(int i) {
return (i - 1) / 2;
}
private static int left(int i) {
return 2 * i + 1;
}
private static int right(int i) {
return 2 * i + 2;
}
public static void main(String[] args) {
int[] arr = new int[]{56, 30, 71, 18, 29, 93, 44, 75, 20, 65, 68, 34};

System.out.println("原始數組: ");

System.out.println(Arrays.toString(arr));

System.out.println("調整后數組: ");

System.out.println(Arrays.toString(SmallHeap.topN(arr, 5)));

}

}

● LSTM和Naive RNN的區別

參考回答:

RNN和LSTM內部結構的不同:

RNN

LSTM

由上面兩幅圖可以觀察到,LSTM結構更為復雜,在RNN中,將過去的輸出和當前的輸入concatenate到一起,通過tanh來控制兩者的輸出,它只考慮最近時刻的狀態。在RNN中有兩個輸入和一個輸出。

而LSTM為了能記住長期的狀態,在RNN的基礎上增加了一路輸入和一路輸出,增加的這一路就是細胞狀態,也就是途中最上面的一條通路。事實上整個LSTM分成了三個部分:

1)哪些細胞狀態應該被遺忘

2)哪些新的狀態應該被加入

3)根據當前的狀態和現在的輸入,輸出應該是什么

下面來分別討論:

1)哪些細胞狀態應該被遺忘

這部分功能是通過sigmoid函數實現的,也就是最左邊的通路。根據輸入和上一時刻的輸出來決定當前細胞狀態是否有需要被遺忘的內容。舉個例子,如果之前細胞狀態中有主語,而輸入中又有了主語,那么原來存在的主語就應該被遺忘。concatenate的輸入和上一時刻的輸出經過sigmoid函數后,越接近於0被遺忘的越多,越接近於1被遺忘的越少。

2)哪些新的狀態應該被加入

繼續上面的例子,新進來的主語自然就是應該被加入到細胞狀態的內容,同理也是靠sigmoid函數來決定應該記住哪些內容。但是值得一提的是,需要被記住的內容並不是直接concatenate的輸入和上一時刻的輸出,還要經過tanh,這點應該也是和RNN保持一致。並且需要注意,此處的sigmoid和前一步的sigmoid層的w和b不同,是分別訓練的層。細胞狀態在忘記了該忘記的,記住了該記住的之后,就可以作為下一時刻的細胞狀態輸入了。

3)根據當前的狀態和現在的輸入,輸出應該是什么

這是最右側的通路,也是通過sigmoid函數做門,對第二步求得的狀態做tanh后的結果過濾,從而得到最終的預測結果。事實上,LSTM就是在RNN的基礎上,增加了對過去狀態的過濾,從而可以選擇哪些狀態對當前更有影響,而不是簡單的選擇最近的狀態。
 

● 神經網絡為啥用交叉熵。

參考回答:

通過神經網絡解決多分類問題時,最常用的一種方式就是在最后一層設置n個輸出節點,無論在淺層神經網絡還是在CNN中都是如此,比如,在AlexNet中最后的輸出層有1000個節點,而即便是ResNet取消了全連接層,也會在最后有一個1000個節點的輸出層。

一般情況下,最后一個輸出層的節點個數與分類任務的目標數相等。假設最后的節點數為N,那么對於每一個樣例,神經網絡可以得到一個N維的數組作為輸出結果,數組中每一個維度會對應一個類別。在最理想的情況下,如果一個樣本屬於k,那么這個類別所對應的的輸出節點的輸出值應該為1,而其他節點的輸出都為0,即[0,0,1,0,….0,0],這個數組也就是樣本的Label,是神經網絡最期望的輸出結果,交叉熵就是用來判定實際的輸出與期望的輸出的接近程度。

● 注意力公式

參考回答:

Soft attention、global attention、動態attention

Hard attention

“半軟半硬”的attention (local attention)

靜態attention

強制前向attention

 

● Inception Score 評價指標介紹

參考回答:

定義:

推導出上式的意義:

故要使得生成圖像的inception score高,就需要

1.最大化H(y);也就是對於輸入的樣本,通過inception_v3模型后的類別要均衡,衡量模式坍塌。

2.最小化H(y|x);說明對於輸入的樣本,通過inception_v3模型后預測某類別的置信度要高,衡量圖片生成的質量。

● 使用的 CNN 模型權重之間有關聯嗎?

參考回答:

權重之間有關聯。CNN是權重共享,減少了參數的數量。

簡單來說就是用一個卷積核來和一個圖像來進行卷積,記住是同一個卷積核,不改變卷積核的值。這樣可以減少權值參數。共享就是一個圖片對卷積核是共同享有的。對於一個100*100像素的圖像,如果我們用一個神經元來對圖像進行操作,這個神經元大小就是100*100=10000,單如果我們使用10*10的卷積核,我們雖然需要計算多次,但我們需要的參數只有10*10=100個,加上一個偏向b,一共只需要101個參數。我們取得圖像大小還是100*100。如果我們取得圖像比較大,它的參數將會更加多。我們通過10*10的卷積核對圖像進行特征提取,這樣我們就得到一個Feature Map。

一個卷積核只能提取一個特征,所以我們需要多幾個卷積核,假設我們有6個卷積核,我們就會得到6個Feature Map,將這6個Feature Map組成一起就是一個神經元。這6個Feature Map我們需要101*6=606個參數。這個值和10000比還是比較小的。如果像之前的神經網絡, 兩兩相連, 需要 28x28 = 784 輸入層, 加上第一個隱藏層30個神經元, 則需要784x30再加上30個b, 總共23,550個參數! 多了40倍的參數。

5、百度實習:1)模型壓縮方法;2)CPM 模型壓縮用了哪些方法;3)壓縮效果(體積、指標、部署);4)Kaggle 比賽,比賽背景,怎么進行數據清洗,類別平衡,相近類別重分類,最終成績是多少,覺得跟前幾名差距在哪,有沒有嘗試過集成的方法;5)人臉項目,大概流程,GPU 加速的地方,兩個網絡的訓練過程,級聯網絡的 inference 過程,能同時檢測多個人臉嗎?多尺度縮放怎么處理,resize 自己寫?只是檢測嗎,有沒有識別?或者其他

● CycleGAN 原理介紹一下

參考回答:

CycleGAN其實就是一個A→B單向GAN加上一個B→A單向GAN。兩個GAN共享兩個生成器,然后各自帶一個判別器,所以加起來總共有兩個判別器和兩個生成器。一個單向GAN有兩個loss,而CycleGAN加起來總共有四個loss。CycleGAN論文的原版原理圖和公式如下,其實理解了單向GAN那么CycleGAN已經很好理解。

下面放一張網友們自制的CycleGAN示意圖,比論文原版的更加直觀,出處見水印。

 

● 訓練 GAN 的時候有沒有遇到什么問題

參考回答:

遇到GAN訓練不穩定問題。通過Wasserstein GAN來解決這個問題。WGAN前作分析了Ian Goodfellow提出的原始GAN兩種形式各自的問題,第一種形式等價在最優判別器下等價於最小化生成分布與真實分布之間的JS散度,由於隨機生成分布很難與真實分布有不可忽略的重疊以及JS散度的突變特性,使得生成器面臨梯度消失的問題;第二種形式在最優判別器下等價於既要最小化生成分布與真實分布直接的KL散度,又要最大化其JS散度,相互矛盾,導致梯度不穩定,而且KL散度的不對稱性使得生成器寧可喪失多樣性也不願喪失准確性,導致collapse mode現象。

WGAN前作針對分布重疊問題提出了一個過渡解決方案,通過對生成樣本和真實樣本加噪聲使得兩個分布產生重疊,理論上可以解決訓練不穩定的問題,可以放心訓練判別器到接近最優,但是未能提供一個指示訓練進程的可靠指標,也未做實驗驗證。

WGAN本作引入了Wasserstein距離,由於它相對KL散度與JS散度具有優越的平滑特性,理論上可以解決梯度消失問題。接着通過數學變換將Wasserstein距離寫成可求解的形式,利用一個參數數值范圍受限的判別器神經網絡來最大化這個形式,就可以近似Wasserstein距離。在此近似最優判別器下優化生成器使得Wasserstein距離縮小,就能有效拉近生成分布與真實分布。WGAN既解決了訓練不穩定的問題,也提供了一個可靠的訓練進程指標,而且該指標確實與生成樣本的質量高度相關。

● CPM 模型壓縮怎么做的?有壓過 OpenPose 嗎?

參考回答:

預測和圖像特征計算模塊可以被深度網絡架構來取代,其中圖像和組織特征的表達可以從數據中直接學習。卷積架構讓全局可導,因此可以CPM所有階段聯合訓練。CPM可以描述為在PM隱含空間模型框架下的卷積架構。

1)用局部圖線索來進行關鍵定位

第一階段只用局部圖線索來預測部件信任度。figure 2c展示用本地圖信息的部件檢測的深度網絡。先序哦是局部的因為第一階段感知野只是輸出像素附近的一小塊。我們用5層卷機網絡組成的結構(尾部是量個1x`1卷積層的全卷積架構)。實踐中,為了得到一定精度,我們把圖片標准化為368x368,感受野是160x160.網絡可以看成讓深度網絡在圖像上滑動,並將160x160中局部圖像線索回歸至代表了各個部件在各個位置的score的P+1大小輸出向量。

2)基於空間環境信息的級聯預測

對於性狀穩定的頭和肩膀,檢測效果很好,然而人體骨架的連接處准確率就很低,因為形狀差異很大。部件周圍的信任映射,雖然有噪聲,但是很有價值。figure 3中,當檢測右手肘時,右肩膀的信任映射達到高峰,可以成為一個很強的線索。后續階段的預測器(gt)可以用圖位置z附近含有噪聲的信任映射里的空間組織信息(fai),並且利用“部件的幾何設定都是恆定的”這一事實來提高改善預測。

第二個階段,分類器g2接收特征x2和前一階段fai的輸入。前一階段不同部件的位置z附近的空間區域產生信任映射,特征方程是把信任映射出的特點編碼。CPM不用顯式方程來計算環境特征,而是定義含有前一階段信任度的fai作為預測機的感受野。

這個網絡的設計為了在第二階段輸出層得到一個足夠大的感知野,可以學習復雜和長距離的部件關系。通過應用遷移階段的輸出層特征(而不是用圖模型的顯式方程),后續卷積層自由結合最有預測力的特征,來形成環境信息。第一階段的信任映射來自用小感知野來檢驗局部圖像的網絡。第二階段,我們設計了一個極大擴充的等價感知野。大感知野可以用兩種方法實現:犧牲准確度的池化,增加參數為代價的加大卷積核大小,或者冒着可能讓反傳消失風險增加網絡層數。我們選擇增加卷積層,在8x降維熱力圖上達到大感知野,讓我們盡可能減少參數數量。8步網絡更容易獲得大感知野,它和4步網絡表現一樣好(在高精確度區域也是)。我們也在PM之后圖像特征上映射上重復了類似架構,讓空間組織依賴圖像而且允許錯誤關聯。

我們發現,感受野變大,准確性也變大。通過一系列實驗,figure 4的准確度隨着感受野的變化曲線,改變感受野只通過改變結構而不是增加參數。准確度隨着感受野變大而變大,在250像素飽和,這也大概是歸一化物體的大小。這說明,網絡確實讓遠距離物體關系編碼,並且這是有益的。我們最好的數據集中,我們把圖像歸一化為368x368,基於第一級信任映射的第二級感知野輸出是31x31,這和原始圖片的400x400像素等價,其半徑可以覆蓋任何部件。當階段增多,有效感知野就會變大。我們有6個階段。

3)用CPM學習

這個深度架構可以有許多層。訓練這個網可能讓梯度消失,就是反向傳播在中間層會減弱。pm級聯預測框架有一個自然的解決這個問題的方法。我們不斷激勵這個網絡,通過在每個階段t的輸出定義一個損失函數,讓預測的和實際信任映射的距離最小化。部件p理想的信任映射是bp,通過把p部件的最可能點設定在ground truth位置。

壓縮過OpenPose,效果還可以。

● 用過哪些 Optimizer,效果如何

參考回答:

1)SGD;2)Momentum;3)Nesterov;4)Adagrad;5)Adadelta;6)RMSprop;7)Adam;8)Adamax;9)Nadam。(1)對於稀疏數據,盡量使用學習率可自適應的算法,不用手動調節,而且最好采用默認參數。(2)SGD通常訓練時間最長,但是在好的初始化和學習率調度方案下,結果往往更可靠。但SGD容易困在鞍點,這個缺點也不能忽略。(3)如果在意收斂的速度,並且需要訓練比較深比較復雜的網絡時,推薦使用學習率自適應的優化方法。(4)Adagrad,Adadelta和RMSprop是比較相近的算法,表現都差不多。(5)在能使用帶動量的RMSprop或者Adam的地方,使用Nadam往往能取得更好的效果。

● 圖像基礎:傳統圖像處理方法知道哪些,圖像對比度增強說一下

參考回答:

數字圖像處理常用方法:

1)圖像變換:由於圖像陣列很大,直接在空間域中進行處理,涉及計算量很大。因此,往往采用各種圖像變換的方法,如傅立葉變換、沃爾什變換、離散余弦變換等間接處理技術,將空間域的處理轉換為變換域處理,不僅可減少計算量,而且可獲得更有效的處理(如傅立葉變換可在頻域中進行數字濾波處理)。目前新興研究的小波變換在時域和頻域中都具有良好的局部化特性,它在圖像處理中也有着廣泛而有效的應用。

2)圖像編碼壓縮:圖像編碼壓縮技術可減少描述圖像的數據量(即比特數),以便節省圖像傳輸、處理時間和減少所占用的存儲器容量。壓縮可以在不失真的前提下獲得,也可以在允許的失真條件下進行。編碼是壓縮技術中最重要的方法,它在圖像處理技術中是發展最早且比較成熟的技術。

3)圖像增強和復原:圖像增強和復原的目的是為了提高圖像的質量,如去除噪聲,提高圖像的清晰度等。圖像增強不考慮圖像降質的原因,突出圖像中所感興趣的部分。如強化圖像高頻分量,可使圖像中物體輪廓清晰,細節明顯;如強化低頻分量可減少圖像中噪聲影響。圖像復原要求對圖像降質的原因有一定的了解,一般講應根據降質過程建立“降質模型”,再采用某種濾波方法,恢復或重建原來的圖像。

4)圖像分割:圖像分割是數字圖像處理中的關鍵技術之一。圖像分割是將圖像中有意義的特征部分提取出來,其有意義的特征有圖像中的邊緣、區域等,這是進一步進行圖像識別、分析和理解的基礎。雖然目前已研究出不少邊緣提取、區域分割的方法,但還沒有一種普遍適用於各種圖像的有效方法。因此,對圖像分割的研究還在不斷深入之中,是目前圖像處理中研究的熱點之一。

5)圖像描述:圖像描述是圖像識別和理解的必要前提。作為最簡單的二值圖像可采用其幾何特性描述物體的特性,一般圖像的描述方法采用二維形狀描述,它有邊界描述和區域描述兩類方法。對於特殊的紋理圖像可采用二維紋理特征描述。隨着圖像處理研究的深入發展,已經開始進行三維物體描述的研究,提出了體積描述、表面描述、廣義圓柱體描述等方法。

6)圖像分類(識別):圖像分類(識別)屬於模式識別的范疇,其主要內容是圖像經過某些預處理(增強、復原、壓縮)后,進行圖像分割和特征提取,從而進行判決分類。圖像分類常采用經典的模式識別方法,有統計模式分類和句法(結構)模式分類,近年來新發展起來的模糊模式識別和人工神經網絡模式分類在圖像識別中也越來越受到重視。

全局對比度增強

1. 直方圖均衡化 Histogram Equalization

算法:

1)根據圖像灰度計算灰度概率密度函數PDF

2)計算累積概率分布函數CDF

3)將CDF歸一化到原圖灰度取值范圍,如[0,255]。

4)之后CDF四舍五入取整,得到灰度轉換函數sk=T(rk)

5)將CDF作為轉換函數,將灰度為rk的點轉換為sk灰度

2. 直方圖匹配 Histogram Matching

算法:

1)根據圖像計算概率密度分布pr(r);

2)根據pr(r)計算累計分布函數sk=T(rk);

3)根據給定的目標分布pz(z)計算累計分布函數G(zq);

4)對於每一個k,找到一個q,使得G(zq)約等於sk;

5)將原圖中灰度為k的點變為灰度q;

局部對比度增強

1. 鄰域直方圖均衡:將全局直方圖均衡的思想應用於鄰域直方圖處理中。

2. 鄰域直方圖匹配:將全局直方圖匹配的思想應用於鄰域直方圖處理中。

3. 鄰域統計方法

算法

1)初始化:增強常數E,灰度下閾值k0,標准差下閾值k1,標准差上閾值k2,窗口半寬s;

2)計算圖像灰度均值MG和灰度標准差σG;

3)對於每一個像素,計算鄰域(大小為2∗step+1的方塊)內灰度均值ML和標准差σL;

4)如果ML<=k0∗MGML<=k0∗MG並且k1∗σG<=σL<=k2∗σG,將像素灰度乘以E。

● 介紹一下圖像的高頻、低頻部分,知道哪些圖像補全的方法

參考回答:

圖像的頻率:灰度值變化劇烈程度的指標,是灰度在平面空間上的梯度。

(1)什么是低頻?

低頻就是顏色緩慢地變化,也就是灰度緩慢地變化,就代表着那是連續漸變的一塊區域,這部分就是低頻. 對於一幅圖像來說,除去高頻的就是低頻了,也就是邊緣以內的內容為低頻,而邊緣內的內容就是圖像的大部分信息,即圖像的大致概貌和輪廓,是圖像的近似信息。

(2)什么是高頻?

反過來, 高頻就是頻率變化快.圖像中什么時候灰度變化快?就是相鄰區域之間灰度相差很大,這就是變化得快.圖像中,一個影像與背景的邊緣部位,通常會有明顯的差別,也就是說變化那條邊線那里,灰度變化很快,也即是變化頻率高的部位.因此,圖像邊緣的灰度值變化快,就對應着頻率高,即高頻顯示圖像邊緣。圖像的細節處也是屬於灰度值急劇變化的區域,正是因為灰度值的急劇變化,才會出現細節。

另外噪聲(即噪點)也是這樣,在一個像素所在的位置,之所以是噪點,就是因為它與正常的點顏色不一樣了,也就是說該像素點灰度值明顯不一樣了,,也就是灰度有快速地變化了,所以是高頻部分,因此有噪聲在高頻這么一說。

圖像補全的方法:

Region Filling and Object Removal by Exemplar-Based Image Inpainting

算法的流程大致如下:

1)對待補全區域邊界的像素依次計算補全的優先度(priority),這個優先度主要考慮2個因素。一個是周圍像素可信度高的位置要優先補,另一個是位於圖像梯度變化劇烈的位置要優先補。綜合二者得到所有優先度之后,挑選優先度最高的像素來補

2)對於上一步找到的待補全像素,考慮它周圍的一個小patch(比如3*3)。在圖像已知部分搜索所有的patch,找到最相似的patch

3)用找到的best match來補全未知部分,並更新相關數值

但是我們也不難發現這個方法存在的問題:如果圖像已知部分找不到相似的patch,那算法將無法進行;這個方法只適用於補全背景以低頻信息和重復性紋理為主的圖像;搜索相似的patch計算復雜度非常高,算法運行效率低。

Scene Completion Using Millions of Photographs

算法的大致流程如下:

1)從Flickr上下載兩百萬圖片構建數據庫,以”landscape””city””park”等關鍵詞搜索戶外場景的圖片。

2)對於一張待補全圖像,從數據庫中挑選200個場景最相似的圖片,這里使用gist scene descriptor和圖像下采樣到4*4作為匹配的特征向量。

3)將補全區域邊界外80個pixel的區域作為context。對於每一張匹配的圖像,搜索所有的平移空間和3個尺度的scale空間,根據context部分的匹配誤差,選擇最佳的補全位置;之后利用graph-cut算法求解最佳的融合邊界。

4)利用標准的泊松融合處理融合邊界。

5)將前幾步的匹配cost和graph-cut的cost加起來,返回cost最小的20的結果供用戶挑選。

Context Encoders: Feature Learning by Inpainting

文章提出的網絡結構如下,包括3個部分:Encoder, Channel-wise fully-connected layer, Decoder。Encoder的結構直接借鑒了AlexNet前5層的卷積層結構,具體結構如下。輸入的crop尺寸是227Í227,卷積之后得到的feature map結構是256層6 Í 6。所有的weight都隨機初始化。

Channel-wise fully-connected layer是對普通fc層的一種改進。之所以加入fc層是為了使feature map每一層的信息可以在內部交流。但傳統的fc層參數太多,因此作者提出可以在fc中去掉feature map層間的信息交流,從而減少參數規模。在fc之后會接一個stride為1的卷積層,來實現層間的信息交流。

Decoder的目的是將壓縮的feature map一步步放大,恢復到原始圖片的尺寸。文章提出采用5個up-convolutional層,每層后接一個RELU。上采樣的結構如下。

● 百度實習:模型壓縮的大方向。CPM 模型怎么壓縮的,做了哪些工作?

參考回答:

預測和圖像特征計算模塊可以被深度網絡架構來取代,其中圖像和組織特征的表達可以從數據中直接學習。卷積架構讓全局可導,因此可以CPM所有階段聯合訓練。CPM可以描述為在PM隱含空間模型框架下的卷積架構。

1)用局部圖線索來進行關鍵定位

第一階段只用局部圖線索來預測部件信任度。figure 2c展示用本地圖信息的部件檢測的深度網絡。先序哦是局部的因為第一階段感知野只是輸出像素附近的一小塊。我們用5層卷機網絡組成的結構(尾部是量個1x`1卷積層的全卷積架構)。實踐中,為了得到一定精度,我們把圖片標准化為368x368,感受野是160x160.網絡可以看成讓深度網絡在圖像上滑動,並將160x160中局部圖像線索回歸至代表了各個部件在各個位置的score的P+1大小輸出向量。

2)基於空間環境信息的級聯預測

對於性狀穩定的頭和肩膀,檢測效果很好,然而人體骨架的連接處准確率就很低,因為形狀差異很大。部件周圍的信任映射,雖然有噪聲,但是很有價值。figure 3中,當檢測右手肘時,右肩膀的信任映射達到高峰,可以成為一個很強的線索。后續階段的預測器(gt)可以用圖位置z附近含有噪聲的信任映射里的空間組織信息(fai),並且利用“部件的幾何設定都是恆定的”這一事實來提高改善預測。

第二個階段,分類器g2接收特征x2和前一階段fai的輸入。前一階段不同部件的位置z附近的空間區域產生信任映射,特征方程是把信任映射出的特點編碼。CPM不用顯式方程來計算環境特征,而是定義含有前一階段信任度的fai作為預測機的感受野。

這個網絡的設計為了在第二階段輸出層得到一個足夠大的感知野,可以學習復雜和長距離的部件關系。通過應用遷移階段的輸出層特征(而不是用圖模型的顯式方程),后續卷積層自由結合最有預測力的特征,來形成環境信息。第一階段的信任映射來自用小感知野來檢驗局部圖像的網絡。第二階段,我們設計了一個極大擴充的等價感知野。大感知野可以用兩種方法實現:犧牲准確度的池化,增加參數為代價的加大卷積核大小,或者冒着可能讓反傳消失風險增加網絡層數。我們選擇增加卷積層,在8x降維熱力圖上達到大感知野,讓我們盡可能減少參數數量。8步網絡更容易獲得大感知野,它和4步網絡表現一樣好(在高精確度區域也是)。我們也在PM之后圖像特征上映射上重復了類似架構,讓空間組織依賴圖像而且允許錯誤關聯。

我們發現,感受野變大,准確性也變大。通過一系列實驗,figure 4的准確度隨着感受野的變化曲線,改變感受野只通過改變結構而不是增加參數。准確度隨着感受野變大而變大,在250像素飽和,這也大概是歸一化物體的大小。這說明,網絡確實讓遠距離物體關系編碼,並且這是有益的。我們最好的數據集中,我們把圖像歸一化為368x368,基於第一級信任映射的第二級感知野輸出是31x31,這和原始圖片的400x400像素等價,其半徑可以覆蓋任何部件。當階段增多,有效感知野就會變大。我們有6個階段。

3)用CPM學習

這個深度架構可以有許多層。訓練這個網可能讓梯度消失,就是反向傳播在中間層會減弱。pm級聯預測框架有一個自然的解決這個問題的方法。我們不斷激勵這個網絡,通過在每個階段t的輸出定義一個損失函數,讓預測的和實際信任映射的距離最小化。部件p理想的信任映射是bp,通過把p部件的最可能點設定在ground truth位置。

● Depthwise 卷積實際速度與理論速度差距較大,解釋原因。

參考回答:

首先,caffe原先的gpu實現group convolution很糟糕,用for循環每次算一個卷積,速度極慢。第二,cudnn7.0及之后直接支持group convolution,但本人實測,速度比github上幾個直接寫cuda kernel計算的dw convolution速度慢。例如對於n=128, c=512, h=32, w=32, group=512的卷積跑100次,cudnn 7.0里的group convolution需要4秒多,而DepthwiseConvolution大概只需要1秒。

分析了一下dw convolution與普通convolution的理論計算復雜度,舉例如下:

卷積1:普通卷積,輸入為64*64*256,輸出為64*64*256,卷積核大小為3*3。參數為3*3*256*256=590K,計算量為64*64*256*3*3*256=2.42G,計算過程的工作集內存總量(輸入輸出數據+參數)為64*64*256*2 + 3*3*256*256 = 2.69M。

卷積2:dw卷積,輸入為64*64*256,輸出為64*64*256,卷積核大小為3*3。參數為3*3*256=2.3K個,計算量為64*64*256*3*3=9.44M,計算過程的工作集內存總量為64*64*256*2 + 3*3*256=2.10M。

卷積3:普通卷積,輸入為64*64*16,輸出為64*64*16,卷積核大小為3*3。參數為3*3*16*16=2.3K個,計算量為64*64*16*3*3*16=9.44M,計算過程的工作集內存總量為64*64*16*2 + 3*3*16*16=133K。

可以看到卷積2肯定比卷積1快,因為計算量下降到1/256了,但卷積2實際上無法達到卷積1的256倍速度(我記得我測得結果大概是快10倍左右),因為工作集內存大小並沒有顯著降低。卷積2也無法達到卷積3的速度,因為雖然FLOPS相同,但工作集內存大小相差了很多倍,因此單位數據的計算密度小很多,很難充分利用GPU上的計算單元。

● RetinaNet 的大致結構畫一下

參考回答:

● RetinaNet為什么比SSD效果好

參考回答:

SSD 在訓練期間重新采樣目標類和背景類的比率,這樣它就不會被圖像背景淹沒。RetinaNet采用另一種方法來減少訓練良好的類的損失。因此,只要該模型能夠很好地檢測背景,就可以減少其損失並重新增強對目標類的訓練。所以RetinaNet比SSD 效果好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM