yolov5實戰之皮卡丘檢測

2021-02-16 老司機的視覺屋

前言

從接觸深度學習開始一直都做的是人臉識別,基本上也一直都在用mxnet. 記得之前在剛接觸的時候看到博客中寫到,深度學習分三個層次,第一個層次是分類,第二個層次是檢測,第三個層次是分割。人臉識別算是分類問題,也就是一直在第一個層次···一直都想有機會了解下第二個層次,奈何精力有限,工作中也沒有實際的項目需要。最近正好有個不急的檢測項目,趁此機會入門檢測吧。工作中聽同事提到yolov5效果不錯,而且文檔指導也比較豐富,因此選擇從此入手,順便也熟悉下pytorch。本文就以訓練一個簡單的皮卡丘檢測作為入門吧,也激發下對檢測的學習興趣,暫時不涉及網絡,anchor等細節的理解,只以訓練完為目標。

環境準備

安裝torch這些就不說了,本次訓練基於yolov5官方項目:https://github.com/ultralytics/yolov5 clone後,pip install -r requirements.txt安裝各項依賴 基本的目錄結構如下:data: 訓練數據和數據配置文件以及訓練配置 models: 模型配置文件 utils: 數據讀取、nms等各種訓練測試中用到的腳本 weight: train.py: 訓練腳本 test.py:測試腳本 detect.py: 運行腳本  

數據集準備

https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data 根據官方指導,按需要的格式準備數據集:1. 一個圖片文件對應一個同名的.txt label文件 2. label文件中每一行表示一個目標,格式為:class x_center y_center box_width box_height, 其中數值都是歸一化的。類別從0開始 3. 按類似目錄方式防止數據,yolov5通過將圖片路徑中最後一個images換成labels去尋找對應的標籤

coco/images/000000109622.jpg # image
coco/labels/000000109622.txt # label

本文中用的數據來源於 目標檢測數據集(皮卡丘) 中,但原文是mxnet用的rec格式,因此需要轉換成yolo格式。我已經轉好了:連結: 百度網盤數據集 提取碼: rek1 下載後解壓即可得到符合格式要求的數據。數據示例:

訓練前的配置

修改或新建dataset.yaml

在data目錄下,我們可以看到一個coco.yaml,內容如下: 

# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
# /parent_folder
# /coco128
# /yolov5


# download command/URL (optional)
# download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ./data/coco128/images/train2017/ # 訓練集圖片路徑
val: ./data/coco128/images/train2017/ # 驗證集圖片路徑

# number of classes,類別數
nc: 80

# class names,類別名
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
'hair drier', 'toothbrush']

仿照這個格式,建立皮卡丘數據集的配置文件:

# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
# /parent_folder
# /coco128
# /yolov5


# download command/URL (optional)
# download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ./data/pikachu/images/train/ # 128 images
val: ./data/pikachu/images/val/ # 128 images

# number of classes
nc: 1

# class names
names: ['pikachu']

訓練參數配置

訓練參數配置在data/hyp.finetune.yaml和hyp.scratch.yaml中,前者是finetune用的,後者是從頭訓練的。這次我們直接用hyp.finetune.yaml,先不做修改。

模型配置

模型配置在models/yolov5s.yaml中。目前也不做修改。 

開始訓練

訓練使用train.py腳本,主要參數有: 

--weights 預訓練權重,「」表示從頭訓
--cfg 模型配置文件路徑
--data 數據配置文件路徑
--hyp 訓練參數配置文件路徑
--epochs 訓練的epoch數
--batch-size
--img-size 網絡的輸入大小
--noautoanchor 是否自動計算anchor
--device 設備號
--workers dataloader線程數

還有很多其他參數,不過暫時用不上就先不管了,執行以下命令可開始訓練,腳本會自動去下載yolov5s的預訓練權重進行訓練。 

python train.py --weights yolov5.pt --data data/pikachu.yaml --hyp data/hyp.finetune.yaml --epochs 40 --img-size 320 --device 0 --batch-size 512

可視化

yolov5裡面有兩種可視化方式,一種是tensorboard, 一種是wandb。其中wandb有兩種使用方式,一種是到https://wandb.ai/home註冊一個帳號,在線使用。註冊後新建項目,名字叫yolov5,然後本地安裝配置wandb, 按提示輸入必要的信息(API Key):  

pip install wandb
wandb login

那麼訓練時就可以在自己的項目中看到如下畫面,還是挺不錯的,功能挺豐富:

不過這個網站挺卡的,好在wandb也有本地使用方式。 

安裝docker後
wandb local

參考:https://docs.wandb.ai/self-hosted/local 然後就可以本地訪問了。 

測試

有兩個腳本和測試有關,test.py是用來跑測試集測性能的,detect.py是用來測試文件夾或攝像頭的。 

python detect.py --source data/images --weights yolov5s.pt --conf-thres 0.25

在run/detect下即可找到圖像畫有目標框的圖像(也可以在執行detect.py的時候指定--view-img選項,即可顯示圖像):

結語

至此就訓練出了一個簡單的檢測模型呢,雖然很簡單,不過基本流程通了。在走通流程後就要繼續了解實現的細節,如何調參等等了。可以從了解網絡結構開始,可參考 [https://zhuanlan.zhihu.com/p/343195876](https://zhuanlan.zhihu.com/p/343195876  

註:如果數據集連結過期了,關注 老司機的視覺屋,回復pikachu即可獲取連結

相關焦點

  • 深度學習第31講:目標檢測算法經典論文研讀之 yolo v2/yolo 9000
    其實 yolo 9000 的檢測網絡主體還是 yolo v2,只是對檢測圖像數據進行了融合,使得檢測網絡能夠檢測超過 9000 種物體,因而叫 yolo 9000。所以就檢測算法而言,我們的核心仍然是 yolo v2。
  • PP-YOLO超越YOLOv4-目標檢測的進步
    https://blog.roboflow.ai/training-yolov4-on-a-custom-dataset/然後,就在幾個月前,YOLOv5被發布了。YOLOv5採用了Darknet(基於C)的訓練環境,並將網絡轉換為Pytorch。
  • YOLO v5 實現目標檢測(參考數據集&自製數據集)
    博主之前並無目標檢測方向的相關基礎知識,因此在將其化為己用之前也趟了不少坑,這裡特此記錄為博客以備後用,同時將其微薄經驗分享給大家,希望讀者能夠有所收穫並對錯誤之處批評指正。1.2、背景介紹/yolov5s.pt這行命令其實就是進行模型的測試/推斷了,測試的圖片就是前面講的inference目錄下的圖片,使用的權重數據就是剛才下載的yolov5s.pt,而推斷後的輸出圖片存放在inference/output/中。
  • YOLOv5在建築工地中安全帽佩戴檢測的應用(已開源+數據集)
    該項目使用了YOLOv5s、YOLOv5m、YOLOv5l來訓練安全帽佩戴檢測數據集,代碼和權重均已開源!安全帽佩戴檢測數據集也是開源的(共含7581 張圖像)!項目教程也相當詳細,推薦入門練手學習!而且有意思的是,該項目和數據集的兩位作者均是中國人,點讚!
  • 深入淺出的Yolov5核心基礎知識完整講解
    四種網絡結構的不同點2.3.1 四種結構的參數2.3.2 Yolov5網絡結構2.3.3 Yolov5四種網絡的深度2.3.4 Yolov5四種網絡的寬度3 Yolov5相關論文及代碼4 小目標分割檢測5 後語1 Yolov5
  • 一文看懂YOLOv5(含網絡結構)
    5 後語1 Yolov5四種網絡模型Yolov5官方代碼中,給出的目標檢測網絡中一共有4個版本,分別是Yolov5s、Yolov5m、Yolov5l、Yolov5x四個模型。而yolov5m的Focus結構中的卷積操作使用了48個卷積核,因此Focus結構後的特徵圖變成304*304*48。yolov5l,yolov5x也是同樣的原理。b. 第二個卷積操作時,yolov5s使用了64個卷積核,因此得到的特徵圖是152*152*64。而yolov5m使用96個特徵圖,因此得到的特徵圖是152*152*96。yo
  • 深度學習筆記 | 第7講:CNN目標檢測發家史之從R-CNN到yolo
    yolo v1 雖然快,但缺點也明顯:由於一個網格只能預測兩個邊界框,這使得yolo v1 對於密集很小的物體檢測效果並不好,時常在定位上出現較大的偏差,此外 yolo v1 也存在著泛化性能較弱等問題。
  • 目標檢測介紹之---- YOLO V1 到 V4
    R-CNN(參考:目標檢測介紹之--RCNN系列)是另一種模型,它通過一種分割算法將一幅圖像分割成一個個小塊,然後在這些小塊上運行一個分類器。但是,這類方法速度慢、優化困難。       YOLO是第一個提出的實時性目標檢測方法,經過幾代的迭代,在保持實時性的基礎上,性能越好越好。下面大概介紹一下YOLOv1到v4的發展過程。
  • YOLOv5 對決 Faster RCNN,誰贏誰輸?
    YOLOv5 在深度學習社區炒得沸沸揚揚。最近有篇 博文 是如此介紹 YOLOv5 的:它是最先進的目標檢測,FPS 高達 140。
  • YOLOv5的妙用:學習手語,幫助聽力障礙群體
    建模David 選擇使用 YOLOv5 進行建模。將數據集中 90% 的圖像用作訓練數據,10% 的圖像用作驗證集。使用遷移學習和 YOLOv5m 預訓練權重訓練 300 個 epoch。在驗證集上成功創建具備標籤和預測置信度的新邊界框。由於損失值並未出現增長,表明模型未過擬合,因此該模型或許可以訓練更多輪次。
  • 從零開始PyTorch項目:YOLO v3目標檢測實現
    機器之心編譯目標檢測是深度學習近期發展過程中受益最多的領域。隨著技術的進步,人們已經開發出了很多用於目標檢測的算法,包括 YOLO、SSD、Mask RCNN 和 RetinaNet。在本教程中,我們將使用 PyTorch 實現基於 YOLO v3 的目標檢測器,後者是一種快速的目標檢測算法。
  • 目標檢測算法之YOLOv2
    前言昨天介紹了YOLO系列的第一個算法YOLOv1,並詳細分析了YOLOv1的網絡結構以及損失函數等。今天我們將來分析一下YOLO目標檢測算法系列的YOLOv2和YOLO9000。YOLOv2原理YOLOv1作為One-Stage目標檢測算法的開山之作,速度快是它最大的優勢。但我們知道,YOLOv1的定位不夠準,並且召回率低。
  • YOLOV4
    作者 :Alexey Bochkovskiy,Chien-Yao Wang,Hong-Yuan Mark Liao在作者署名的地方已經找不到J.R大神的名字了,但是這個YOLOV4應該還是有YOLO的純正血統的,因為Alexey就是前幾代yolo
  • 【源頭活水】YOLO之外的另一選擇,手機端97FPS的Anchor-Free目標檢測模型NanoDet現已開源~
    地址:https://www.zhihu.com/people/lu-cheng-qi-85華為P30上用NCNN移植跑benchmark,每幀僅需10.23毫秒,比yolov4-tiny快3倍,參數量小6倍,COCO mAP(0.5:0.95)能夠達到20.6 。
  • 深度學習第24講:計算機視覺之目標檢測算法綜述
    yolo v1       yolo v1 算法的核心思想就是將整張圖像作為網絡的輸入,直接在網絡的輸出層輸出目標物體的類別和邊界框的具體位置坐標。yolo v1 將輸入圖像劃分為 S*S 的網格(grid),每個網格預測兩個邊界框,如果目標物體落入相應的網格中,該網格就負責檢測出該目標物體。
  • 1.8M超輕量目標檢測模型NanoDet,比YOLO快,上線兩天Star量超200
    模型性能目前開源的 NanoDet-m 模型在 320x320 輸入解析度的情況下,整個模型的 Flops 只有 0.72B,而 yolov4-tiny 則有 6.96B,小了將近十倍。在這種設置下,320 解析度輸入能夠達到 20.6 的 mAP,比 tiny-yolov3 高 4 分,只比 yolov4-tiny 低 1 個百分點。在將輸入解析度與 YOLO 保持一致,都使用 416 輸入的情況下,NanoDet 與 yolov4-tiny 得分持平。
  • YOLOv4團隊開源最新力作!1774fps、COCO最高精度,分別適合高低端GPU的YOLO
    /ScaledYOLOv4YOLOv4-CSP: https://github.com/WongKinYiu/ScaledYOLOv4/tree/yolov4-cspYOLOv4-tiny: https://github.com/WongKinYiu/ScaledYOLOv4
  • 你的YOLO V4該換了 | YOLO V4原班人馬改進Scaled YOLO V4,已開源(附論文+源碼)
    (在RTX 2080Ti上測試)作者單位:YOLOv4原班人馬1、簡介基於CSP方法的YOLOv4目標檢測方法,可以上下縮放,並且適用於小型和大型網絡,同時保持速度和準確性。基於此本文提出了一種網絡縮放方法,該方法不僅可以修改深度、寬度、解析度,還可以修改網絡的結構。
  • 1.8M超輕量目標檢測模型NanoDet,比YOLO跑得快,上線兩天Star量超200
    在與其他模型進行比較時,項目作者選擇使用 COCO mAP (0.5:0.95) 作為評估指標,兼顧檢測和定位的精度,在 COCO val 5000 張圖片上測試,並且沒有使用 Testing-Time-Augmentation。
  • 目標檢測算法之YOLO
    YOLO作為基於深度學習的第一個one-stage的方法做快可以在TitanX GPU上做到45幀每秒的檢測速度,輕量版的可以做到155幀每秒,快到沒朋友有沒有?相比於R-CNN[5]精確度也有非常大的提升53.5 VS 63.4 mAP,真是做到了多快好省!下面我儘可能講清楚YOLO系列算法的Insight,水平有限,請各位多多拍磚!