主頁 > 軟體設計 > YOLOX自定義資料集訓練(搶先踩坑)

YOLOX自定義資料集訓練(搶先踩坑)

2021-07-25 08:10:13 軟體設計

序言

昨天被YOLOX刷屏了,各大公眾號強推:性能超yolov5!!吊打一切yolo!!看麻了我,標題還能再夸張點嘛?出于對前沿技術的渴望,還是要去學習學習,論文中改進了很多地方,這里就不再介紹,刷屏的文章中都已經介紹了,直接來看下作者給的性能對比圖:
在這里插入圖片描述
左邊是大模型的性能對比,右邊是各自輕量型模型的對比,可以看到越靠近左上角性能越優,此外作者還一次性開源了tensorrt、ncnn、openvino、onnx部署代碼,可謂業界良心,從訓練到部署一條龍服務,

習慣了yolo格式訓練方式的我,在踩了無數的坑后,決定寫一篇訓練教程文章,記錄自己踩坑的程序,也給后來人做參考,

話說在前頭,坑是真的多,給我整麻了,要訓練的同學做好debug的心理準備,
在這里插入圖片描述

YOLOX官方倉庫

一、配置環境

訓練之前,按照官方的環境配一下,先介紹我的硬體情況:

  • ubuntu18
  • rtx 3070
  • cuda 11.1

因為要裝的東西很多,我這里直接創建了一個conda虛擬環境,避免和我之前的環境產生沖突:

conda create -n yolox python=3.7    # 創建環境

source activate yolox             # 激活環境

然后按照官方給的安裝示例,配置必須的包:

git clone git@github.com:Megvii-BaseDetection/YOLOX.git
cd YOLOX
pip3 install -U pip 
pip3 install -r requirements.txt              # 在requirements.txt 里我把torch注釋掉了
python3 setup.py develop

我這里獨自pip install安裝的pytorch,版本是1.8,因為默認requirements.txt安裝的話是安裝最新版的1.9,而我在跑代碼的時候因為1.9版本的問題報錯了,張量cuda加載不上,如果你遇到同樣的問題的話建議獨自安裝1.8版本的torch,

然后安裝nvidia混合精度庫apex:

git clone https://github.com/NVIDIA/apex
cd apex
pip3 install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

在安裝apex的時候遇到了新問題,我的電腦cuda版本是11.1,而我安裝的pytorch cuda版本是cuda 11.0 的,所以編譯沒通過,解決辦法是安裝cuda 11.1的torch版本,這兩個版本要同步,torch離線包的網站有對應的whl檔案,下載下來重新安裝即可,如果這一步沒報錯的話,可以直接跳過這段話,
在這里插入圖片描述
在這里插入圖片描述

再然后安裝pycocotools,我這一步比較順利,直接通過:

pip3 install cython; pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'

二、demo測驗

環境配置完后,來運行一下demo測驗,看看環境是否安裝成功,在hub中將權重檔案下載下來:
在這里插入圖片描述
有點大,耐心等待,下載下來后我在YOLOX主目錄中創建了一個weights檔案夾,用于存放這些權重檔案,然后直接運行:

python tools/demo.py image -n yolox-s -c /path/to/your/yolox_s.pth.tar --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result               # 這是官方的示例

python tools/demo.py image -n yolox-s -c weights/yolox_s.pth.tar --path assets/bus.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result           #這是我的

其中:

  • image是推理模式,如果是輸入視頻則為video
  • -n 是模型的名字
  • -c 為權重檔案地址
  • –path是測驗的圖片路徑
  • –conf 置信度閾值
  • –nms nms的iou閾值
  • –tsize 測驗圖片大小
  • –save_result 是否保存推理結果

運行成功示例如下(注意:他這里的demo代碼出錯了也不會報錯,直接跳出終止,所以如果你運行了發現沒有如下的運行結果,可能是程式終止了,需要自己排查,我在這里遇到的問題是img的張量cuda加載不上,后面排查是因為torch1.9的問題,就換了1.8,正如前面所說):
在這里插入圖片描述

推理后的圖片保存在data檔案夾中,效果還不錯的樣子:
在這里插入圖片描述
這步之后環境基本上沒問題了,接下來準備資料開始訓練吧,

三、資料準備和配置修改

官方配置教程

程式中提供了voc和coco兩種格式的資料訓練,我這里用的是voc格式訓練,voc格式的檔案結構如下:

├── data #手動創建data、VOCdevkit、VOC2007、Annotations、JPEGImages、ImageSets、Main這些檔案夾
│   ├── VOCdevkit
│   │   ├── VOC2007
│   │   │   ├── Annotations #把test.txt、trainval.txt對應的xml檔案放在這
│   │   │   ├── JPEGImages #把test.txt、trainval.txt對應的圖片放在這
│   │   │   ├── ImageSets
│   │   │   │   ├── Main
│   │   │   │   │   ├── test.txt 
│   │   │   │   │   ├── trainval.txt

我的初始檔案夾只有兩個,通常標注完后只有這兩個檔案夾:
在這里插入圖片描述
所以新建一個ImageSets檔案,并在其子目錄再新建一個Main檔案,然后運行如下代碼,劃分資料集,得到test.txt和trainval.txt檔案(路徑看著修改):

import os
import random

trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = '/home/cai/data/VOCdevkit/VOC2007/Annotations'
txtsavepath = '/home/cai/data/VOCdevkit/VOC2007/ImageSets'
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftest = open('/home/cai/data/VOCdevkit/VOC2007/ImageSets/test.txt', 'w')
ftrain = open('/home/cai/data/VOCdevkit/VOC2007/ImageSets/trainval.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftest.write(name)
    else:
        ftrain.write(name)

ftrain.close()
ftest.close()

要嚴格按照這個格式制作資料集,因為程式中是按照這個結構讀取,然后修改exps/example/yolox_voc/yolox_voc_s.py檔案三個地方,把你的類別和檔案路徑改過來,
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在我寫這篇文章的時候,這個檔案還有其他三個報錯的地方,如下:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
解決辦法分別在yolox/data/datasets/init.py、yolox/evaluators/init.py兩個檔案中添加:
在這里插入圖片描述
在這里插入圖片描述
然后修改yolox/data/datasets/voc_classes.py,這里加上自己的類別,注釋掉原始類別:
在這里插入圖片描述
修改完過后直接運行如下命令開始訓練:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 16 --fp16 -o -c weights/yolox_s.pth.tar
  • -d 使用多少張顯卡訓練
  • -b 批次大小
  • –fp16 是否開啟半精度訓練

yolox_voc_s.py檔案里的EXP類是繼承于yolox_base.py,有一些引數可以看著修改,運行過后進入如下界面開始訓練,列印了一堆的東西,我只截取了一部分:
在這里插入圖片描述
在這里插入圖片描述
然后你可能會遇到這樣的問題,在迭代第二輪的時候迭代出來的內容為None,這時候需要去yolox/data/data_prefetcher.py檔案下修改:
在這里插入圖片描述
注釋掉后面三行,改為pass,然后繼續訓練,正常訓練后的輸出如下,每兩個輪次評估一次,可以在yolox_voc_s.py中修改self.eval_interval = 2來選擇,這里只用了兩百張左右的圖片訓練,可以看到收斂的速度非常的快,在兩輪后已經有這么高的精度了:
在這里插入圖片描述
緊接著,模型訓練完后保存在data/YOLOX_outputs/yolox_voc_s檔案夾中,只需要best模型即可,因為這個模型保存的是最好的精度:
在這里插入圖片描述

四、模型測驗

緊接著是測驗,同樣是運行之前的demo.py檔案,但是需要修改一下demo.py,匯入VOC_classes,然后修改可視化函式的傳參
在這里插入圖片描述
在這里插入圖片描述

修改exps/default/yolox_s.py檔案
在這里插入圖片描述
修改你的類別數,不加的話會按照默認的coco 80類初始化網路,然后訓練的權值無法加載會中斷程式,這里我把best的權重放到了weights檔案夾下,如果不修改運行后像這樣:
在這里插入圖片描述
不報錯也不提示,坑爹啊
在這里插入圖片描述

不過修改后就可以了,正確運行的界面如下,我們來看下我兩百張圖片訓練出來的效果,用的還是之前筷子的資料集:
在這里插入圖片描述
在這里插入圖片描述

效果感覺也還行吧,和v5s的效果差不多,精度也比較接近,總的來說,yolox也對得起這個名字,畢竟人家不僅開源了訓練代碼,部署的也給你放出來了,卷啊卷啊卷,,,只不過這個代碼,真是一堆的問題,差點給我整吐了,萬幸還是跑出來了,大家遇到問題的話需要耐心除錯,可以先去查yolox的issues,里面可能有你遇到的問題的解決方案,實在沒有的話只能print,

五、最后補充

因為是跑通了之后才寫的文章,有一些細節可能忘記加上去了,踩的坑有點多,遇到的問題也比較多,大部分都是比較容易解決的,我隱約感覺有一些修改的地方忘記寫上去了,如果是用我提供的筷子資料集訓練的話,可能會遇到這樣的問題,因為我的有一些標簽是通程序式生成的(之前的yolov5半標注),所以在xml檔案中沒有這兩個屬性:
在這里插入圖片描述
上面是用labelimg標注的標準xml檔案,下面是程式生成的,沒有pose和truncated屬性:
在這里插入圖片描述
但是在yolox/evaluators/voc_eval.py中,決議xml的時候是有這兩個屬性的,我看了前后的代碼,發現這兩個屬性可有可無,所以如果報錯的話可以將其注釋掉:
在這里插入圖片描述
寫的有點亂,但是大致的訓練程序就是這樣,中間大大小小的問題實在是太多了,記起來的都已經寫出來了,可能會有遺漏,演算法是好演算法,不過這個代碼在易用性上實在是有點不可恭維,希望后續作者能再優化好一些吧,
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289908.html

標籤:其他

上一篇:【OpenCV】高手勿入! 半小時學會基本操作 腐蝕膨脹

下一篇:05-單點登陸系統(SSO)設計及實作

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more