使用深度學習對狗狗品種進行分類——常被弄混的居然是這兩種?

2021-02-18 大數據應用

原作者:Kirill Panarin

譯者:胡雯思

來源:medium.com

<https://towardsdatascience.com/dog-breed-classification-hands-on-approach-b5e4f88c333e>

幾天前,我發現了由Kaggle主辦的一個「狗狗品種識別」挑戰賽。 這個比賽的目標是建立一個模型,使能夠通過「觀察」狗狗的圖像來對狗進行品種分類。 我開始思考一些可行的建模方法以及這些模型可能實現的準確度。 據我所知,利用像TensorFlow這樣的流行機器學習框架、開源數據集以及用於圖像識別的預訓練模型,可以很好地完成這個任務,而不需要花費太多的時間和資源。 我將再次分享我使用TensorFlow構建狗狗品種分類器的端到端流程。

小編建議:

以下內容請配合作者在GitHub的repo觀看<https://github.com/stormy-ua/dog-breeds-classification>

一個好的訓練數據集能幫助我們向建立穩健模型邁出重要的一步。 我們手頭擁有的數據是史丹福大學的狗狗數據集,包含120個品種的狗的共20K張圖像。 數據集中的每個圖像都被標註了一種狗的品種。 但是正如我們注意到,僅僅120個不同品種共20K個圖像(相當於每個品種約200個圖像)是不足以用來訓練深度神經網絡的。 儘管卷積神經網絡(CNN)是目前用於圖像分類的最好的機器學習模型,在這種情況下,沒有足夠的訓練樣例來訓練它,我們是無法從這個數據集中通過機器學習得到足夠的通用模型來識別不同的犬種。這很有可能導致模型對少量訓練樣例的過度擬合,因此測試集的準確性會很低。 針對這種情況,我們有兩種可行的方法來減輕訓練樣例過少帶來的不足:

將狗狗數據集與另一個更大的圖像數據集(比如ImageNet),並用這些合併後的樣例來訓練一個CNN。

取一個已經預先用更大數據集訓練好的深度神經網絡模型,在其中附加一個額外的「分類標頭」,即額外的幾個帶有Softmax層的完全連接層 。

第一種方法有兩大缺點:需要我們進行分析的數據量比原始數據集要大得多,對這個新的大數據集的訓練需要佔用更多的時間和資源。 

第二種方法似乎更有可能實現,模型的訓練需要用原始數據集進行,並且由於只有幾個完全連接層的「分類標頭」,模型的訓練將不需要佔用大量時間和資源。

以上這種將有帶「分類標頭」的預訓練模型附加到較小的數據集上的方法,我們稱為轉移學習。

簡而言之,利用大數據集訓練的深層神經網絡的底層層級可以捕獲一個圖像的低級圖元(例如輪廓和簡單形狀),它學到的這些知識對於所有圖像是通用的並且可以被「轉移」到任何圖像識別問題中。

假設一個圖像被輸入到Inception模型中。 Inception模型的輸出經過幾個完全連接(FC)層,最後經由softmax輸出該圖像屬於每一個類別的概率。 只有FC層代表「分類標頭」必須接受訓練。 而初始模型在已經預定義的模型參數下保持凍結。

下一步是下載狗狗數據集,並通過Google Inception模型進行預訓練。 從repo的根目錄處執行setup/setup.sh腳本命令將幫助我們下載所有內容,提取並放入適當的目錄。 一旦下載並提取狗狗數據集,我們將會得到一組包含圖像和注釋的文件夾。 TensorFlow有一個漂亮的數據集API,可以更好地幫助我們處理TF記錄數據格式問題。 這個想法是把所有的訓練樣例和他們的注釋一起保存在一個文件中,所有的例子都以protobuf序列化的形式存儲。 TensorFlow數據集API可以高效地處理這種數據格式,並在訓練過程中儘可能多地加載所需的示例,同時使用最少的磁碟I / O操作和內存要求。 有一個python腳本,可以將原始的狗狗數據集轉換為TF記錄文件,準備用於訓練:

這個命令必須從repo的根目錄執行。數據集轉換可能需要約1小時。每個圖像都被輸入到Inception模型中,並且輸出的圖像將與其他圖像和其他注釋一起存儲。 這簡化了訓練,因為我們不需要在訓練期間為每個例子計算初始輸出,而是已經預先計算好以便使用。 TF記錄文件的結果將在data/stanford.tfrecords中。 setup.sh腳本還會下載並提取TensorFlow圖形的Google Inception模型並將其凍結。 凍結意味著模型中所有的變量都被替換為常量並嵌入到圖形本身中,因此不需要將檢查點文件與圖形一起攜帶,就可以將模型加載到TensorFlow會話中並開始使用它。 Inception模型可用於frozen/inception/classify_image_graph_def.pb.

下一步是實際執行培訓。 首給模型起一個獨一無二的名字。 其次應該配置這些層級中完整連接的層數和單元數量。 這些都可以在src/common/consts.py模塊中配置。

默認情況下一般有2個完全連接的層級分別為1024單元和120單元。輸入層有2048個單位,與Inception模型最後一層的單位數相等。

我們可以實用src/training/train.py中的代碼進行培訓。 學習速度,時代數量和每批量大小可以在腳本中配置:

此外,我們可以啟動TensorBoard對訓練進行監控:

這裡有三個可用的度量標準:

成本,測試集上的錯誤以及訓練集上的錯誤。 

默認情況下,錯誤率是按照訓練集中有3000個例子來計算的。我用了以下的超參數訓練模型:

小批量大小= 64

學習率= 0.0001

時代數= 5000

以下是我在TensorBoard獲得的這三個指標的數字:

執行5K個時期需要約1小時。 訓練結束後,指標具有以下值:

成本= 0.1

測試錯誤= 2.7%

訓練錯誤= 2.5%

在測試和訓練集中,這兩個錯誤都相當低。 由於訓練集上的誤差與測試集上的誤差大致相同,因此訓練集沒有明顯的過度訓練現象。

一旦模型被訓練好,其優化參數就存儲在./checkpoints目錄中的檢查點文件中。 為了有效地重新使用該模型進行推斷分析,將其作為一個凍結的TensorFlow圖,再將參數嵌入到圖本身中是非常好的。 這可以使用src/freeze/freezy.py來完成:

將Inception模型和「分類標頭」模型加載到同一個TensorFlow會話中,並將它們組合到一個單一的計算圖中,以便將來自Inception模型的輸出直接輸入到「分類標頭」模型的輸入中。 綁定完成後,腳本會將文件系統中圖形中的複合模型序列化。 此時,由於在訓練期間計算的模型參數仍然位於檢查點文件中,所以圖表還沒有被凍結。

使用TensorFlow freeze_graph函數凍結上一步生成的圖形。 它實際上從檢查點文件中取出模型參數並將它們注入到圖形變量中。 圖形變量輪流轉換為常量。 生成的文件將轉到帶有模型名稱的./frozen目錄。

一旦凍結的模型準備好,我們就可以對任意圖像進行分類了。 src/inference/classify.py腳本能夠對存儲在文件系統上的狗圖像進行分類,或者可以將其用作HTTP資源。 在幕後,它加載凍結圖並將圖像輸入到該圖中。 這裡有兩個例子說明如何推理「Airedale Terrier」(萬能㹴)和「Shih-Tzu」(西施犬、獅子狗):

如果你只是想了解推理分析是如何進行的,有一個docker container <https://hub.docker.com/r/kirillpanarin/dog_breed_classification/> 包含了所有的代碼和冷凍模型包裝。 它使用Python筆記本做推斷。 它實際上擁有所有的設置,甚至在docker container本身進行培訓。 可以使用以下命令啟動:

一旦container開始導航到瀏覽器<http://localhost:8888/notebooks/Inference.ipynb>,你將能夠進行你自己的圖像分類。

我提議我們應該仔細研究機器學習模型未能正確進行分類的例子。 

腳本src/analysis/training_perf_analysis.py能夠為所有訓練實例生成具有預測和實際品種的CSV文件

通過從training_confusion.csv加載數據,可以繪製混淆矩陣:

在這裡對如此多品種進行詳細的分析是困難的。 讓我們試著找出30個錯誤分類的品種(Confusion.ipynb提供了一個如何做到這一點的例子):

可以看出,這對「Silky Terrier / Yorkshire Terrier」(絲毛梗/約克夏梗)在錯誤分類數量方面領先。如果我們看看這兩種狗的樣子,就能夠理解這是為什麼了:

如果你認為自己是一個愛狗人士,你可以問問你的模型你是什麼品種的狗 : ) 

在我的情況下,我得到了以下答案:

正如我們所看到的,即使你沒有足夠的訓練圖像和/或計算資源,如果你有預訓練好的深度神經網絡和像TensorFlow一樣的現代機器學習庫,你也可以訓練出穩健的圖像分類器。

往期精彩回顧

點擊「閱讀原文」查看數據應用學院核心課程

相關焦點

  • 【白毛狗狗的品種圖片】13個超萌白色狗狗品種介紹
    有些人對白色有莫名其妙的偏愛,我就有一位朋友她本來就很害怕狗,但有天她遇上了一隻白色狗狗—西摩犬,她就情有獨鍾愛上白色狗了。為了所有偏愛白色狗狗的人,我就整合了以下各種最受歡迎的白色狗品種,大家可以看看呀!西高地白梗起源於蘇格蘭,AKC分類為㹴犬,因為體毛都是白色所以被聞名為白梗。
  • 狗狗分類都在這裡了!
    溫順可愛的狗狗是我們人類的好朋友,隨時忠誠地守護和陪伴著我們,給我們帶來無數的歡樂和笑聲。那麼,關於我們的可愛朋友你又了解多少呢?狗狗的分類和最受人喜愛的狗狗你知道嗎?如果你還不是很清楚的話,那就請跟著我們一起來走近它們吧!世界各民族都有養狗的習慣。據統計,目前全世界的家犬品種已經達到450多個。
  • 狗有大、中、小型之分,那麼貓怎麼分類呢?大致有兩種方法
    不過對於體型的分類這一概念在貓咪的身上卻很少見到,可能很多人對於自己養的貓咪到底屬於什麼體型也沒想去了解過,只對比較典型的幾個貓咪品種所熟悉,比如貓中「巨人」緬因貓以及體型相對較大的布偶貓。其實貓咪也是可以按照體型來進行分類的,不過貓咪體型的分類和狗狗的可能還是有點兒區別的,不妨就一起來看看到底怎麼個分類法。
  • 【搜Fun生活】最聰明的10個品種狗狗排行榜!
    是依照狗狗們的兩種素質:1.能快速學習新的指令,2.百分之95他們都可以正確的完成這些指令,甚至表演的更好喔!來看看有哪10種狗狗上了排行榜吧!» 10. Australian Cattle Dog中文名叫:拉不拉多獵犬,小編偏心偏愛他,因為小編的狗狗也是拉不拉多啦!拉不拉多已經蟬聯23年美國最受歡迎品種,相信大家在街上時不時都可以看到他們。他們最常被人們訓練來成為導盲犬以及搜救犬,是個辛苦的工作犬呢!
  • 不同品種狗狗的交配小知識
    在汪星世界中,狗狗們也會有看的「對眼」的時候,每次活動結束時,鏟屎官也不難發現,自己的狗狗和另外某一隻狗狗玩的特別開心。面對這樣的情況,作為寵主,可能便會有所疑慮,畢竟涉及到品種交配的問題,所以,今天我們就來聊聊不同品種的狗狗交配到底要不要擔心。其實,在我國,由於養狗文化歷時較短,還未選育出自己的狗狗品種就被西方的寵物狗佔領了市場。
  • 「深度學習」運用多通道亞結構圖進行分子性質預測
    隨著人工智慧技術的發展,深度學習方法在藥物分子設計中的應用愈發廣泛。分子性質的預測在藥物發現過程中起著很大作用。為了對分子性質進行預測,首先需要對分子進行表徵。應用深度學習對分子進行表徵有多種途徑,例如SMILES將分子編碼成一個字符串序列,根據成環結構斷開的位置不同,同一分子可能得到不同的SMILES。
  • 盤點兒時動漫中的狗狗品種,你還記得幾個?
    兒童的時候,可能動畫片可以說是我們的樂趣,是我們喜歡的娛樂消遣方式,今天小編帶大家回憶童年,盤點兒時那些動漫中的一些狗狗品種,你還記得幾個呢?
  • 使用tensorflow進行音樂類型的分類
    但這並不是一個很好的劃分,因為可能是一些藝人想利用一個特定流派的流行趨勢。更好的選擇是依靠自動音樂類型分類。與我的兩位合作者張偉信(Wilson Cheung)和顧長樂(Joy Gu)一起,我們試圖比較不同的音樂樣本分類方法。特別是,我們評估了標準機器學習和深度學習方法的性能。我們發現特徵工程是至關重要的,而領域知識可以真正提高性能。
  • 80種狗狗智商排名 狗狗品種大全及圖片
    現在的人越來越多的喜歡養寵物了,而狗狗卻大家非常喜歡的一種寵物,狗狗的品種非常的多,每個人會根據自己的喜歡選擇狗狗的品種,今天愛狗族有福利了,小編為大家帶來了狗狗智商排名以及狗狗品種大全圖片
  • 全世界十大類狗狗——最聰明的是它們
    其實狗年時我曾有心多八一些狗狗,但現在雞年都快過完了,我還沒有動手,看來我對狗狗真的不是很感冒——其實原因也在於狗狗的品種實在太多了,我覺得就算我一整年每天寫一篇都寫不完
  • 睡蓮品種分類之花色篇
    睡蓮花色品種如何分類?從基礎科學角度來講,這是一個嚴肅的話題。從應用的角度來講,則未必一定要求十分嚴謹。
  • 世界上最小的狗狗品種
    喜歡小狗狗麼
  • 最齊全的狗狗品種介紹及圖片 看了就認識所有的狗狗了
    愛狗狗的你們是否對狗狗的品種多了解呢?
  • 了解狗狗品種特質,再也不用擔心買不到適合的狗狗了
    很多準備買狗狗的人都會有一個困惑,就是不知道該買哪種狗狗好一些。有時候我們也會聽一些朋友的意見,但是選回來的狗狗到底適不適合自己呢,卻很難說。
  • 最致命的狗狗品種,全球禁養的戰鬥犬種
    今天,嘟嘟為你帶來了最致命的狗狗品種,世界上許多國家甚至還禁止了他們的人民飼養這些品種!10. 卡斯羅犬它的行為習性,因狗或狼的血統而異,其偏向狼的特徵,使這種動物不太可能進行保護性攻擊,但因為它們仍存在著強大的獵物慾望,這使它們在其他小型寵物,甚至可能是年幼的孩子面前,成為真正危險的對象。它們重達55公斤,擁有狼一般的力量和智慧。
  • 導盲犬是什麼品種的狗狗?主要有這3種
    導盲犬,顧名思義就是經過嚴格訓練的可以幫助盲人生活的犬種,說的通俗一些,導盲犬就相當於人類的眼睛,狗狗擁有很好的記憶力,經過一段時間的生活,狗狗可以對主人的作息規律
  • 致狗狗失明的白內障很常見,特別是這幾個品種的狗狗!
    1、什麼是白內障;2、正常核硬化症常常被誤以為是白內障,兩者有什麼區別;3、導致白內障的原因;4、哪些品種的狗狗容易患白內障;5、怎麼知道自己的狗狗患上了白內障;6、白內障要如何治療;7、白內障不治療會怎麼樣。白內障簡單來說就是一種眼睛晶狀體發生渾濁的疾病。
  • 深度學習用於多模態語義學習簡述
    谷歌的前任研究主管皮特·諾文(Perter Norvig)博士曾在2010年《自然》雜誌上發表文章《2020願景》(2020 Visions),指出今後10年(2010-2020),文本、圖像、視頻等數據以及用戶交互信息和各種傳感器信息將混合在一起,從搜索角度看,搜尋引擎對檢索結果進行的是內容綜合而非數據羅列,這也將是谷歌今後面臨的巨大挑戰。
  • 光學精密工程 | 實例特徵深度鏈式學習全景分割網絡
    該模塊將不同類別實例分割掩膜映射到其對應通道,使用卷積結構進行特徵提取得到空間排序得分圖,解決實例間存在遮擋的問題。該算法對實例分割結果中目標進行了空間上的排序,由於Mask RCNN結構上的缺陷導致識別目標數量有限,使得排序模塊實用性不高。
  • 狗狗品種大全(六)
    【性 格】 威爾斯柯基犬的皮毛非常好打理,只需每周進行簡單梳理。宜動宜靜,威爾斯柯基犬是一種精力充沛的小型工作犬,它在室外活動中表現出的速度、耐力和運動技巧不得不讓人想起它的祖先確實是用來牧牛的。在家庭生活中它可以表現得異常理智,成年後很少在家中上躥下跳、翻箱倒櫃,當然這是與主人的教育有著密不可分的關係的。天資聰穎。都說眼睛是心靈的窗口,如果你與一隻威爾斯柯基犬的目光對視,就不會對它的高智商有任何懷疑了。