1. 程式人生 > >YOLOv3 實練(以VOC2007、2012資料集為例)

YOLOv3 實練(以VOC2007、2012資料集為例)

  • 訓練裝置:Lenovo 拯救者;
    GPU:1070ti;
    視訊記憶體:8GB;

  • 第一次訓練:採用預設引數,以預訓練好的darknet53.conv.74.1為預載入權重開始訓練;視訊記憶體,卒;報錯:out of memory;

  • 第二次訓練:更改引數,將batch降低一些試試,從64改成了48,當天執行平穩,於是去辦了點事兒,兩天回來後;視訊記憶體,卒;報錯:out of memory;提示已經訓練了2w來個batch;

  • 第三次訓練
    先看看了引數到底什麼含義(batch,subdivision),具體詳見:https://blog.csdn.net/hrsstudy/article/details/65447947?utm_source=itdadao&utm_medium=referral


    於是增大了subdivision,這樣每次載入視訊記憶體的圖片數減少。並且監控GPU視訊記憶體使用情況(70%左右的佔用率),兩天後,又卒。原因不詳;可能是多尺度?或者是隨機的resizing?引起的?反正沒有辦法,只好,繼續降低batch,或者增大subdivision

  • 第四次訓練:再不訓練出來點啥,沒法交代了,於是bacth用了32,subdivision用了16(沒理解錯的話應該是等效於每次載入兩張圖片);這次,視訊記憶體沒崩。訓練用時大約3天,週三中午1:00左右首次訓練完成。但是,發現有問題,當我用訓練好的引數去預測單張圖片,發現物體框畫的很不錯,但是label標籤不對,比如person會標成bird,原因不詳,多測試了幾張發現,標籤有規律的錯亂。所有person都會標成bird,於是猜測label生成或者index什麼地方有錯誤。然後使用valid命令生成驗證結果,驗證結果存在result資料夾裡,全部都是txt檔案,按照20個類別,每個類別生成一個txt,對照發現,txt生成的label標籤沒問題。不太懂為什麼(回頭翻原始碼看吧)。

  • 第五次訓練:在第四次訓練的過程中,旁邊新機器裝了ubuntu和cuda,兩臺機器同時開始訓練。嘗試調大了batch,batch設定為60(約等於預設選項64),subdivision=20;其他引數未變(尚不知道影響方向)。目前正在訓練中,肉眼可推斷,其收斂速度快於第四次訓練,原因可能主要是batch比較大的原因。其梯度下降方向更加明確。

測試MAP指標

  • 摸索中,參考的方法有:
    最終採用官方測試版本:https://zhuanlan.zhihu.com/p/31852482(目前在裝matlib
    第四次訓練結果如下:
    • aeroplane:AP=0.750
    • bicycle:AP=0.778
    • bird:AP=0.607
    • boat:AP=0.577
    • bottle:AP=0.544
    • bus:AP=0.775
    • car:AP=0.844
    • cat:AP=0.738
    • chair:AP=0.532
    • cow:AP=0.660
    • dining tables:AP=0.683
    • dog:AP=0.704
    • horse:AP=0.794
    • motorbike:AP=0.772
    • person:AP=0.798
    • potted plant:AP=0.443
    • sheep:AP=0.637
    • sofa:AP=0.692
    • train:AP=0.776
    • tvmonitor:AP=0.686
      總迭代次數大於60000次。loss中期下降的比較慢,到45000次左右才相對上比較顯著的下降。
  • 總結:batch比較小;收斂速度變慢。
    第五次訓練結果
    • aeroplane:AP=0.855
    • bicycle:AP=0.855
    • bird:AP=0.756
    • boat:AP=0.700
    • bottle:AP=0.665
    • bus:AP=0.876
    • car:AP=0.877
    • cat:AP=0.894
    • chair:AP=0.643
    • cow:AP=0.835
    • dining tables:AP=0.736
    • dog:AP=0.859
    • horse:AP=0.869
    • motorbike:AP=0.862
    • person:AP=0.833
    • potted plant:AP=0.562
    • sheep:AP=0.753
    • sofa:AP=0.780
    • train:AP=0.864
    • tvmonitor:AP=0.778

平均ap值:0.7926

對比之下,明顯發現AP值高很多,而且整體都高很多,原因有兩方面,一方面是batch的值由32改成60(接近與預設初始值),另一方面是batch增大後,max_batches = 50200不變,所以總的迭代次次數增大將近一倍。
另外就是本次訓練loss下降的非常好看,平滑並且持續穩定的下降,直到batch大於45000才無明顯變化跡象。
總體來說,基本是按照預設引數訓練的效果好很多,(batch改成60,是為了subdivision改成20,能夠被3整除)。第六次訓練更改了學習率和學習率衰減方式。看一看效果。
第六次訓練
在第五次訓練的基礎上調整了學習率,和學習率變化。
具體引數如下:
- learning_rate=0.0015
- policy=steps
- steps=3000,25000,42000
效果上可以說是非常差了,分析原因可能是在3000個batch的時候就將學習率調整為0.00075,太小的學習率使網路無法收斂。(25000次之後損失幾乎無明顯下降)。
結果就不附了。總之就是很差了。
第七次訓練
在第五次訓練的基礎上,去掉了darknet53後面層的bacth normalization層,一方面是,想看一下去掉部分BN層的效果,另外一方面,處於對BN層的不完全理解下,感覺在最後分類的時候,如果對input不進行歸一化(BN做的事情),會不會加大可分離性(引數的間距無BN的約束後,有肯能會更加離散,當然也有可能會方差更小)。
結果最後的AP值為0.794,非常輕微的優於第五次的結果,感覺更像沒什麼區別。

相關推薦

YOLOv3 VOC20072012資料

訓練裝置:Lenovo 拯救者; GPU:1070ti; 視訊記憶體:8GB; 第一次訓練:採用預設引數,以預訓練好的darknet53.conv.74.1為預載入權重開始訓練;視訊記憶體,卒;報錯:out of memory; 第二次訓練:更改引數

FCN語義分割訓練資料siftflow和voc2012資料

截至目前,現已經跑通了siftflow-fcn32s,voc-fcn32s,並製作好了自己的資料集,現在就等大批資料的到來,進而針對資料進行引數fine-tuning,現對我訓練的訓練流程和訓練過程中遇到的問題,做出總結和記錄,從而對以後的學習作鋪墊。 通過這篇分析語義分割

VS 2013 統一修改所有工程的目錄配置 boostopencv3 的安裝

在 vs2013安裝配置C++boost庫 一文中我們介紹了,如何在vs2013環境裡配置安裝boost庫。在配置vs2013時,我們只是介紹瞭如何對當前專案或者某一專案進行boost相關庫等檔案目錄的設定,也即如果再新建一個工程,我們需重新配置工程中的bo

Linux(Centos)下調整分區大小home和根分區

vertical speech col 信息 卸載 記錄 jsb 大小 control 在安裝新系統的時候,有時候沒法預估或者說錯誤的劃分了分區大小,常常會導致我們後面的操作出現極大地不方便,比如某個分區分的太小了,導致 軟件安裝的時候會報安裝空間不夠,這就很麻煩。在

u-boot原始碼目錄分析jz2440 u-boot1.1.6

一、檔案的分析 arm_config.mk。字尾是.mk,是一個Makefile檔案,將來在某個Makefile中會去呼叫它。 Changelog檔案,修改記錄檔案,該檔案記錄了這個uboot專案的版本變遷以及每個版本較上個版本修改的記錄。 config.mk。和arm_

基於GDAL庫,讀取.nc文件海洋表溫數據

調試 cfi 主函數 != mes stdstring 微軟 detail back   對於做海洋數據處理的同學,會經常遇到nc格式的文件,nc文件的格式全稱是NetCDF,具體的詳細解釋請查詢官網【https://www.unidata.ucar.edu/softwar

【資料庫】關於日期的處理greenplum和postgresql和hive

那個啥,本人菜鳥一隻,如果有什麼說錯的地方還請大家批評指出!! 好,開始說正事,日期處理和判斷是十分常見的,本文就自己使用的資料庫,和hive資料倉庫來說說,我使用到的一些日期的處理和判斷,當然技術能力有限,我也很菜,所以如果有說錯或者遺漏的還請大家多多包涵,望能批評指出,也讓我的水平提高提高!

json 資料持久化賬號和使用者名稱的儲存

以賬號和使用者名稱的儲存為例 一、建立公共類使用者,定義使用者類的欄位:如賬號、密碼等 二、建立公共類列表,在列表類內定義一個使用者類型別的列表,定義列表需要匯入名稱空間System.Collections.Generic 三、儲存使用者 1.建立一個註冊方法 2. 判斷輸入框是否為

名人問題 演算法解析與Python 實現 O(n) 複雜度 Leetcode 277. Find the Celebrity

1. 題目描述 Problem Description Leetcode 277. Find the Celebrity Suppose you are at a party with n people (labeled from 0 to n -

矩陣快速冪斐波那契數列

小 M 玩數列 【問題描述】 小 W 發現了一個神奇的數列: () = ( − 1) + ( − 2) { ≥ 3, (1) = 1, (2) = 1} ,這就是著名的 Fibonacci Se

Matlab繪製三維曲面二維高斯函式

  寒假學習了一下Python下的NumPy和pymatlab,感覺不是很容易上手。來學校之後,決定繼續看完數字影象處理一書。還是想按照上學期的模式,邊看邊實現書中的演算法。上學期看的時候,是用C語言實現的,發現寫程式太耗時間了,所以決定還是學習下Matlab吧(寒假莫有學會Python中的那些庫應用。。。)

DDR3詳解Micron MT41J128M8 1Gb DDR3 SDRAM

首先,我們先了解一下記憶體的大體結構工作流程,這樣會比較容量理解這些引數在其中所起到的作用。這部分的講述運用DDR3的簡化時序圖。  DDR3的內部是一個儲存陣列,將資料“填”進去,你可以它想象成一張表格。和表格的檢索原理一樣,先指定一個行(Row),再指定一個列(Co

spark最新原始碼下載並匯入到開發環境下助推高質量程式碼(Scala IDEA for Eclipse和IntelliJ IDEA皆適用spark2.2.0原始碼包圖文詳解

  不多說,直接上乾貨! 前言     其實啊,無論你是初學者還是具備了有一定spark程式設計經驗,都需要對spark原始碼足夠重視起來。   本人,肺腑之己見,想要成為大資料的大牛和頂尖專家,多結合原始碼和操練程式設計。   好一段時間之前,寫過這篇部落格

Servlet容器啟動過程Tomcat中啟動Servlet容器

一、Tomcat的總體結構中的Service模組及Container容器(引入) tomcat啟動server伺服器(包含多個服務模組)對外提供Service服務,Service模組由Container元件連線多個Connector構成。 Service

phpmailer實現簡單的郵件傳送網易郵箱smtp伺服器

1、描述 第一次做到用php做到傳送郵件的功能。 Google了一下,php內建函式裡面有一個mail()函式。但是使用mail的話,會涉及到很多問題,我也沒有仔細研究過,反正都是和smtp協議息息相關。 於是,就去GitHub上開源的檔案傳送封裝好的專案

外部類與內部類之間的訪問程式碼是連結串列資料結構

外部類與內部類之間的訪問 內部類相當於外部類的一個成員,和其它成員處於同一個級別,因此可以在內部類中直接訪問外部類的各個成員(包括私有屬性)。 需要注意的是在外部類中要想訪問內部類的各個成員(這裡也包括內部類的私有屬性)就必須先例項化內部類,然後才能訪問。對

keras實現多個模型融合非keras自帶模型,這裡3個自己的模型

該程式碼可以實現類似圖片的效果,多個模型採用第一個輸入。 圖片來源:https://github.com/keras-team/keras/issues/4205   step 1:重新定義模型(這是我自己的模型,你們可以用你們自己的),與預訓練不一樣,這裡定義模型inp

基於資料探勘的高校個性化學生管理方案研究——A高校資料未發表,使用或引用前請提前告知

基於資料探勘的高校個性化學生管理方案研究——以A高校資料集為例 馬  鑫 摘 要:高校資訊系統中儲存著大量產生頻率非常迅速且型別繁雜的資料,傳統的高校學生管理模式已很難適用於我國現階段高校學生管理。依據資料探勘演算法理論,採用k-prototypes聚類演算法代替傳統的人工貼標

清清楚楚地搭建MongoDB資料庫搭建4.0.4版本的副本

資料的目錄檔案層次設計  我們一般採用多例項的方式,而不是將所有的資料庫儘可能地放在一個例項中。 主要基於以下考慮: 1:不同業務線對應的資料庫放在不同的例項上,部分操作的運維時間容易協調等到。 2:相互獨立,減少相互干擾。不會因為某個業務的激增或某個開發Team的程式碼問題,拖累太多的

設計模式-builder模式微信訊息的路由講解

今天要講一個簡單的模式–builder模式。 你可能會覺得,builder模式有什麼好講的?本來我也這樣覺得,但當我有幸拜讀某位大神通過builder模式寫了一個開發工具包的初始化操作,嗯程式碼的樣子很叼 這位大神是誰呢? 就是這位仁兄啦,是碼雲上一個很火的微