今天,人工智能正影響咱們生產、生活的方方面面。10月10日,爲期三天的2018華爲全聯接大會在上海拉開帷幕,這次大會以「+智能,見將來」爲主題,發佈了AI戰略及全球領先的全棧全場景AI解決方案,並推出全球首個覆蓋全場景人工智能的昇騰系列IP和芯片,打造全面領先的AI實力。而咱們做爲Python程序員在人工智能領域的技術與貢獻也是舉重若輕的,下面來了解一下怎麼訓練本身的目標檢測模型。程序員
TensorFlow內包含了一個強大的物體檢測API,咱們能夠利用這API來訓練本身的數據集實現特殊的目標檢測。web
Dat Tran就分享了本身實現可愛的浣熊檢測器的經歷,在文章中做者把檢測器的訓練流程進行了梳理,咱們能夠觸類旁通來訓練其餘在工做項目中須要的檢測器。下面咱們一塊兒來學習一下吧!面試
爲何要作這件事?編程
方便麪君不只可愛,在國外很廣泛的與人們平靜地生活在一塊兒。處於對它的喜好和與浣熊爲鄰的狀況,做者選擇了它做爲檢測器的檢測對象。完成後能夠將攝像安裝在房子周圍,檢測是否有浣熊闖入了你家,你就能及時知道是否來了不速之客了。看來浣熊還真多啊!服務器
建立數據集網絡
機器學習須要數據做爲原料,那麼咱們首先須要作的就是創建起一個可供訓練的數據集,同時咱們須要利用符合Tensorflow的數據格式來保持這些數據及其標籤:機器學習
1. Tensorflow的物體檢測接口主要使用TFRecord文件格式,咱們須要將數據轉換爲這個格式;函數
2.有不少工具能夠完成數據的轉換,不管是相似PASCAL VOC數據集或是Oxford Pet數據集的格式,都有不少成熟的腳原本完成轉換,甚至也能夠本身寫一個腳原本轉換,跟着文檔解釋不會太難;工具
3.在準備輸入數據以前你須要考慮兩件事情:其一,你須要一些浣熊的彩色圖片;其二,你須要在圖中浣熊的位置框座標(xmin,ymin,xmax,ymax)來定位浣熊的位置並進行分類。對於只檢測一種物體來講咱們的任務十分簡單,只須要定義一類就能夠了;性能
4.哪裏去找數據呢?互聯網是最大的資源啦。包括各大搜索引擎的圖片搜索和圖像網站,尋找一些不一樣尺度、位姿、光照下的圖片。做者找了大概兩百張的浣熊圖片來訓練本身的檢測器(數據量有點小,可是來練手仍是能夠的);
5.有了數據之後咱們須要給他們打標籤。分類很簡單都是浣熊,可是咱們須要手動在每一張圖中框出浣熊的位置。一個比較好的打標工具是LabelImg。編譯好後只要要在圖片上輕點鼠標就能夠獲得PASCAL VOC格式的XML文件,再利用一個腳本就能夠轉換成Tensorflow須要的輸入格式了;有時候在Mac上打開jpeg圖像會出現問題,須要將其轉換爲png來解決;
6.最後,將圖像的標籤轉換爲TFRecord格式後,並將起分爲訓練集(~160張)和測試集(~40張)就能夠開始下一步的工做了!
小提示:
1. 還有不少圖像標註工具,包括 FIAT (Fast Image Data Annotation Tool)、BBox-Label-Tool、以及matlab自帶的trainingImageLabeler等等,能夠根據條件和須要自行選擇;
2. 圖像格式轉換一樣也有不少工具,做者推薦了ImageMagick的工具,固然咱們還有ps,美圖的工具,甚至本身寫一個腳本也是一兩分鐘的事;
3. 整個訓練過程當中最耗時的就是數據的標註了,做者表示僅僅一類圖像200張的排序和打標籤就花了他兩個多小時的時間,若是須要大量圖像的話仍是要情人幫忙或者找標註公司,例如CrowdFlower, CrowdAI 和 Amazon’s Mechanical Turk;
4. 對於圖像的選擇,儘可能選擇適中的圖像,要是太大不只運算速度慢還會形成內存溢出,須要調節訓練批量的大小。
訓練模型
輸入數據搞定後咱們就開始訓練模型啦。通常對於物體識別訓練來講有標準的工做流程。首先須要利用一個預訓練模型來做爲訓練的基礎,做者使用了ssd_mobilenet_v1。同時須要將分類改變爲1,並更改模型、訓練數據、標籤數據的路徑。對於學習率、批量大小和其餘超參數先用默認參數來進行訓練。
隨後構建標籤映射就能夠進行訓練了。
小提示:
1. API中有一個數據加強選項data_augmentation_option,這個選項對於較爲單一的訓練數據來講十分有用。
2. 重要!標籤的值須要從1開始標記,0是一個佔位符,在爲每一類分類標籤賦值時須要注意。
作完了這些進一步的準備工做,咱們終於能夠開始訓練了。咱們能夠選擇在本身本地的GPU上訓練網絡,或者在雲服務器上訓練。在雲服務器上可能須要一額外的配置文件。做者使用Google Cloud就須要一個YAML的文件來定義使用機器的參數。
在訓練的過程當中,咱們能夠經過tensorboard 來實時監測模型的訓練狀況一遍在出現異常時及時調整訓練策略。
下圖是做者基於24幅圖的批量大小進行了一個多小時22k次訓練的結果,但在40min左右就出現了很好的收斂結果。
圖中顯示了loss和精度隨訓練的變化狀況。在預訓練模型的幫助下,損失函數降低很快。
同時做者還將訓練過程當中模型表現隨訓練次數的變化呈現了出來:
在通過測試和輕微的調整以後(實現本身的精度),就能夠完成訓練了。
模型的使用
完成訓練以後咱們須要將模型保存下來,一般使用checkpoint的模式來保存。因爲咱們是基於雲端訓練的,須要經過一個腳本將模型導入到本機使用。下面是做者將這個模型放到一個youtube浣熊視頻中的結果:
浣熊出沒
捕捉到浣熊
看完視頻咱們會發現有時會出現漏識別和誤識別。這主要是由於咱們用於訓練的數據集過小了,模型缺少魯棒性和泛化性,須要更多的數據來提升它的性能,而這也是目前人工智能面臨的最大問題。若是對Python編程、網絡爬蟲、機器學習、數據挖掘、web開發、人工智能、面試經驗交流。感興趣能夠加君519970686,羣內會有不按期的發放免費的資料連接,這些資料都是從各個技術網站蒐集、整理出來的,若是你有好的學習資料能夠私聊發我,我會註明出處以後分享給你們。歡迎分享,歡迎評論,歡迎轉發
結語
在跟隨做者完成物體檢測器的訓練後,咱們應該也能夠經過相應的步驟開發本身的檢測器。固然須要提升分類器的表現,就須要更多的數據,數據,數據!
這個一檢測器訓練時間很短並且表現看起來不錯。但對於多類物體的的話,表現是會有些許降低的,同時訓練時間也要增長才能獲得較好的結果。同時咱們須要在心中謹記一個原則,最終的模型必定是速度與精度,效率與效果的平衡。深度學習和其餘的科學同樣都有矛盾與平衡的一面,真正的產品效果其實取決於你傾向天平的哪一方! (原文出處https://www.toutiao.com/i6612915175940948488/)