人臉識(shí)別算法的小改進(jìn)

Deeplearning.ai課程中第4門卷積神經(jīng)網(wǎng)絡(luò)里, 第4周的作業(yè)是做一個(gè)人臉識(shí)別的小應(yīng)用.

這門課的作業(yè)設(shè)計(jì)都有些問(wèn)題. 因?yàn)樾枰臄?shù)據(jù)量很大, 需要的算力也很高, 所以不大可能讓學(xué)生從頭做一個(gè)深度神經(jīng)網(wǎng)絡(luò)然后訓(xùn)練出結(jié)果. 所以作業(yè)基本是兩頭的, 一頭是教如何建立這個(gè)深度神經(jīng)網(wǎng)絡(luò), 一頭是教如何應(yīng)用這個(gè)建好的網(wǎng)絡(luò), 中間的部分就一筆帶過(guò)說(shuō)我們已經(jīng)幫各位訓(xùn)練好了, 大家load就行了.

原有的人臉識(shí)別算法:

人臉識(shí)別的算法是所謂one-shot的方式, 不是直接去分類, 而是判斷兩個(gè)圖片是否是屬于統(tǒng)一類的, 或著說(shuō), 就是計(jì)算兩個(gè)圖片之間的距離.

人臉的照片(96*96像素)先經(jīng)過(guò)一個(gè)深度神經(jīng)網(wǎng)絡(luò)編碼器, 輸出一個(gè)128位的編碼.

FRmodel = faceRecoModel(input_shape=(3, 96, 96))
load_weights_from_FaceNet(FRmodel)

這個(gè)編碼器是已經(jīng)訓(xùn)練好的. 需要的話可以從這里下載到, (具體是那個(gè)文件我還沒(méi)弄清楚. )

有了編碼器, 就可以把任意人臉的照片進(jìn)行編碼, 例如:

database["danielle"] = img_to_encoding("images/danielle.png", FRmodel)

然后就是計(jì)算待測(cè)圖片和目標(biāo)圖片編碼的歐式距離. 一句話而已, 但屬于作業(yè)內(nèi)容, 我不能寫出來(lái).

算出距離以后, 跟一個(gè)閾值(! yu4 zhi2 !)比較一下, 如果距離小于閾值就認(rèn)為兩個(gè)圖片是一個(gè)人的, 于是就"識(shí)別"了.

Andrew Ng老師給出的應(yīng)用樣例是百度的門禁. 人走過(guò)去, 照相, 與ID記錄中保存的照片對(duì)比, 距離小于閾值, 放行.

原算法的問(wèn)題

交付的時(shí)候編碼器應(yīng)該是已經(jīng)完成的, 閾值也就是一個(gè)單一的數(shù), 估計(jì)也是寫死的. 所以這個(gè)人臉識(shí)別的應(yīng)用在交付給用戶應(yīng)用的時(shí)候是固定的. 當(dāng)然這也無(wú)可厚非, 畢竟大多數(shù)軟件是這樣的.

但神經(jīng)網(wǎng)絡(luò)畢竟得到的是個(gè)概率, 閾值也是人為設(shè)定的, 有可能出現(xiàn)一直把老板和掃地僧搞混的情況. 或者類似apple FaceID里的問(wèn)題, 也許親緣系數(shù)很近的親屬是可以互相解鎖的. (10歲男兒解鎖其母的FaceID, wired報(bào)道, 網(wǎng)易報(bào)道 )

(寫到這的時(shí)候我意識(shí)到自己不小心開(kāi)源了一個(gè)可以賺錢的算法, 算了, 開(kāi)了就開(kāi)了吧. 好像丟了一大筆錢 )

  • 理論上, 可以把編碼器重新訓(xùn)練一遍, 比如把老板, 親屬, 掃地僧的照片加入到訓(xùn)練集里再重新修煉.
  • 理論上, 用戶也可以調(diào)整閾值, 提高或者降低特異性敏感性.

但實(shí)際上, 顯然讓用戶重新訓(xùn)練這么大而深的網(wǎng)絡(luò)不現(xiàn)實(shí), 沒(méi)有數(shù)據(jù)集也沒(méi)有那么強(qiáng)的算力. 調(diào)整閾值也可能會(huì)造成其他的連帶問(wèn)題.

綜上, 賦予用戶后期調(diào)整的能力很重要.

并聯(lián)網(wǎng)絡(luò)

之前的神經(jīng)網(wǎng)絡(luò), 全連接也好, 卷積神經(jīng)網(wǎng)絡(luò)也好, 都是串聯(lián)的, 一層接著一層, 直到ResNet出現(xiàn), 在兩層網(wǎng)絡(luò)之間增加了短路的通道. 所謂短路, 就是直接把上一層的計(jì)算結(jié)果送到后面去. 被短路的幾層網(wǎng)絡(luò)只是負(fù)責(zé)訓(xùn)練"殘差".

類似的思想也可以用在這里. 分兩條路徑:

  • 代數(shù)函數(shù)路徑
def dist_path(x1,x2,threshold):
    d = tf.norm((x1-x2),axis=-1)
    # output=1-Activation('sigmoid')(d-threshold)
    output = 0.5 - (tf.sign(d-threshold))/2
    return output

這條路徑上, 還是使用歐式距離來(lái)計(jì)算兩個(gè)輸入圖片x1,x2之間的距離, 然后跟閾值比較. 如果想二值輸出, 就用符號(hào)函數(shù)sign, 如果想得到連續(xù)輸出就用一下sigmoid.

這條路徑就是原來(lái)的計(jì)算方式, 參數(shù)都是寫死的.

  • 修正神經(jīng)網(wǎng)絡(luò)

在這條路徑之外, 我又并聯(lián)了一條神經(jīng)網(wǎng)絡(luò)路徑, 所用的神經(jīng)網(wǎng)絡(luò)其實(shí)要求并不高, 一是大部分的feature已經(jīng)被編碼器模型提取好了, 二是代數(shù)路徑其實(shí)效果已經(jīng)不錯(cuò), 只需要微調(diào)一下. 所以并不一定需要多復(fù)雜的網(wǎng)絡(luò).

def tinker_path(x1,x2): 
    X=tf.concat([x1,x2],axis=-1)
    X = Dense(128, activation='relu', 
              kernel_initializer = 
              RandomNormal(mean=0.0, stddev=0.05))(X)
    X = Dense(128, activation='relu', 
              kernel_initializer = 
              RandomNormal(mean=0.0, stddev=0.05))(X)
    X = Dense(1, activation='tanh', 
              kernel_initializer = 
              RandomNormal(mean=0.0, stddev=0.05))(X)
    return X

這里僅使用了一個(gè)簡(jiǎn)單的全連接網(wǎng)絡(luò)示意, 實(shí)際中可能比這個(gè)層次稍微多一點(diǎn), 但我覺(jué)得沒(méi)必要太深. 卷積網(wǎng)絡(luò)可以考慮, 而且可以考慮把輸入的兩份編碼數(shù)據(jù)交叉排布成一個(gè)類似圖片的東西.

由于并聯(lián)上去的神經(jīng)網(wǎng)絡(luò)是為了修正誤差用的, 所以通常來(lái)說(shuō)它的輸出值應(yīng)該很小, 不影響主路徑的結(jié)果. 所以我在初始化的時(shí)候使用的隨機(jī)初始值是很集中于0附近的. 把標(biāo)準(zhǔn)差stddev改得很小.

  • 合并網(wǎng)絡(luò)

將代數(shù)函數(shù)路徑和修正神經(jīng)網(wǎng)絡(luò)并聯(lián)在一起. 所謂并聯(lián)就是將兩個(gè)網(wǎng)絡(luò)進(jìn)行加權(quán)平均.

def face_tinker(x1,x2,threshold,alpha=[0.7,  0.3]):
    paths=[dist_path(x1,x2,threshold), tinker_path(x1,x2)]
    X=Add()([ a*path for (a,path) in zip(alpha,paths)])
    return X

主要的是代數(shù)函數(shù)路徑, 給的權(quán)重應(yīng)當(dāng)高一點(diǎn), 次要的是修正神經(jīng)網(wǎng)絡(luò)路徑, 給的權(quán)重可以低一些, 但是修正神經(jīng)網(wǎng)絡(luò)要真的能夠改變輸出才行, 如果是[0.9, 0.1]這樣的加權(quán)平均就沒(méi)什么意義了.

完整的代碼在github上

后續(xù)

我對(duì)tensorflow還不是很熟練, 還應(yīng)當(dāng)補(bǔ)充上loss, 訓(xùn)練之類的.

實(shí)際使用中如果兩個(gè)人總是搞混, 可以把各自的照片多拍一些, 固定編碼器的參數(shù), 只去訓(xùn)練修正神經(jīng)網(wǎng)絡(luò), 哪怕過(guò)擬合了也沒(méi)什么關(guān)系, 畢竟是小范圍使用, 不必太過(guò)追求泛化.

唉, 丟了一大筆錢.

并聯(lián)網(wǎng)絡(luò)推廣

在已知代數(shù)函數(shù)上并聯(lián)一個(gè)神經(jīng)網(wǎng)絡(luò)進(jìn)行修正的模式很有意思.

現(xiàn)有的知識(shí)中其實(shí)已經(jīng)有大量的線性擬合或者簡(jiǎn)單的非線性擬合工具, 比如計(jì)算人工晶體度數(shù)的SRK公式, 但是這些公式面對(duì)特殊問(wèn)題的時(shí)候還是會(huì)出問(wèn)題, 比如遇到高度近視或者準(zhǔn)分子激光手術(shù)后的患者.

完全拋棄原有的公式, 使用深度神經(jīng)網(wǎng)絡(luò)重做一個(gè)算法當(dāng)然可以, 但這需要大量的數(shù)據(jù)堆砌, 好像人們以前的經(jīng)驗(yàn)也就浪費(fèi)了.

如果在已知代數(shù)函數(shù)的基礎(chǔ)上并聯(lián)一個(gè)神經(jīng)網(wǎng)絡(luò), 用神經(jīng)網(wǎng)絡(luò)來(lái)修正原有函數(shù), 就好像Taylor展開(kāi)那樣, 一點(diǎn)一點(diǎn)近似, 近似到夠用就可以了.

也許對(duì)數(shù)據(jù)集的大小, 對(duì)訓(xùn)練神經(jīng)網(wǎng)絡(luò)所需要的算力, 要求都會(huì)減低一些吧.

不過(guò), 我估計(jì)肯定有很多人嘗試過(guò)了, 而且失敗了不少. 通常覺(jué)得自己有個(gè)新想法的時(shí)候, 只是因?yàn)槲墨I(xiàn)閱讀得不夠多.

EOF( )

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • 大數(shù)據(jù)預(yù)測(cè) (豆瓣)https://book.douban.com/subject/25841481/ 大數(shù)據(jù)預(yù)測(cè)...
    葡萄喃喃囈語(yǔ)閱讀 333評(píng)論 0 1
  • 什么是ctags呢?wiki上是這樣解釋的: Ctags是一個(gè)用于從程序源代碼樹(shù)產(chǎn)生索引文件(或tag文件),從而...
    tailang閱讀 1,757評(píng)論 0 2
  • 一個(gè)人, 此刻在等公交, 累到不想說(shuō)話, 四十五度抬頭仰望天空, 想找個(gè)答案, 想找個(gè)繼續(xù)前行的理由, 但是天空不...
    吃貨哆啦閱讀 240評(píng)論 0 0
  • 文/邵桂香 一 山間曠野無(wú)人, 夕陽(yáng)老樹(shù)遠(yuǎn)村。 幸有幾根電桿, 努力撐起黃昏。 二 秋風(fēng)真是厲害, 無(wú)手拿著水彩...
    邵桂香閱讀 438評(píng)論 0 3
  • 涅槃之陽(yáng),晨曦升,夕暮落,輪回之循,不換不變。不弋不遲,生亦在此,死亦在此,破紅塵,唯汝滄瀾。
    游吟pote閱讀 82評(píng)論 0 0