史上最詳細yolov5環境配置搭建+配置所需文件


yolov5的配置過程總體來說還算簡單,但是網上大部分博客都沒有仔細介紹具體步驟,本文將從最細節的層面記錄windows10系統下的yolov5環境配置的全過程,以及yolov5使用的一些細節,以及如何制作和訓練自己的數據集

注:yolov5官網代碼更新速度較快,相關依賴環境如pytorch,apex等也會采用更新的版本。博主上傳了8月配置成功的工程文件,如需要老版本代碼可以自行下載或從官網下載。若配置遇到困難可以參考評論區的一些回答,若還未解決,歡迎評論區留言或私信,博主將盡力解決。

@

yolov5介紹

先來介紹一下yolov5
在這里插入圖片描述
yolov5的特點之一就是權重文件非常之小,可以搭載在配置更低的移動設備上
在這里插入圖片描述
而且yolov5的速度較yolov4更快,准確度更高
在這里插入圖片描述
此博客還包括一些在學習過程中從其他大佬那整理的資料,包括:

資料

一、基礎部分:

1.深入淺出Yolo系列之Yolov3&Yolov4&Yolov5核心基礎知識完整講解
2.深入淺出Yolo系列之Yolov5核心基礎知識完整講解
3.從V1到V4,讓你讀懂YOLO原理

二、代碼部分:

4.YOLOv5代碼詳解(yolov5l.yaml部分)
5.YOLOv5代碼詳解(common.py部分)
6.YOLOv5代碼詳解(test.py部分)
7.YOLOv5代碼詳解(train.py部分)

三、優秀的實際應用:

8.實時吸煙目標檢測

環境配置所需資源

使用到的工具有
1.anaconda,pycharm
2.cuda10.2+cudnn-10.2-windows10-x64-v7.6.5.32+pytorch1.5.1-gpu+。。。。。。。。
ps(對於本文使用的舊版代碼pytorch只要大於等於1.5.1即可,新版代碼需與官網要求相同--1.6.0+,本文將在之后說明安裝步驟)

所需資源:
本博客免費提供所有win10的cuda和cudnn,百度雲,提取碼:78il
以及anaconda和pycharm的安裝包百度雲,提取碼:95q7
以及權重文件百度雲,提取碼:9pfg
以及GitHub官方yolov5源碼百度雲(官網源碼已更新,建議下載此源碼),提取碼:tyn6
以及官方提供的coco測試數據集百度雲,提取碼:ny9j

配置正式開始

第一步-下載源碼

本文采用的是yolov5官網提供的pytorch框架下的源碼(官方代碼為最新修改,建議使用本文提供的的代碼版本--7月31日更新,可從上文百度雲鏈接中下載),點擊紅色區域即可下載源碼壓縮包
在這里插入圖片描述將其解壓到一個不帶中文字符的文件夾下(如果帶有中文字符,會使OpenCV的cv2.imread()函數讀取不了待檢測圖片或視頻)

第二步-安裝anaconda與pycharm

兩個開發工具從官網均可下載。
anaconda是一個管理用於python開發的包含不同庫的虛擬環境的平台,可以高效的管理和創建適用於多個不同項目的project interpreter。安裝完成自帶一個根環境,路徑在conda的安裝目錄下。進入后可以在環境管理頁面創建新環境,新環境的路徑在安裝目錄下的envs中存儲,在pycharm中設置interpreter時需要找到所需環境的存儲位置,interpreter設置選擇conda enviroment,填寫python.exe的路徑即可完成編譯環境與項目的綁定。之后進行虛擬環境設置,安裝新的庫的時候只需打開cmd,輸入activate 環境名,即可進入環境目錄,之后pip安裝所需庫即可。

首先從官網上下載anaconda-py3.7-64版本,勾選這兩項方便環境配置,如果安裝時沒有勾選這兩項建議重新安裝,並!重!啟!,涉及到環境變量的改動都建議在修改后重啟
在這里插入圖片描述
等待anaconda安裝完進入environment界面,點擊create,將新環境命名為yolov5test,python版本選擇python3.7,點擊ok,等待自動生成初始環境,之后即可關閉anaconda。
ps(如果出現anaconda卡load application的情況,可以參考Anaconda創建新的python環境使用cmd創建新環境與操作包的安裝)
在這里插入圖片描述

完成anaconda安裝后,從官網下載pycharm,解壓安裝完成后創建工程,路徑選擇到之前解壓源碼的無中文字符路徑,注意!!!!,創建完成后此處有紅框標記的文件即為路徑正確(也可先創建再解壓到工程文件中)
在這里插入圖片描述
之后進入pycharm中選擇工程所需的interpreter
在這里插入圖片描述

第三步-安裝cuda10.2和cudnn-10.2-windows10-x64-v7.6.5.32

在這里插入圖片描述
因為本次使用pytorch1.5.1(如果使用最新版的官網代碼,請按照requirement.txt中的環境要求安裝,將pytorch升級為1.6即可),對應的cuda為10.1(其實cuda≥10.1即可,只需將cudnn與cuda版本對應上就行),ps(本人之前使用tf=1.14+cuda10.0進行深度學習開發,但是pytorch1.5.1需要安裝新的cuda,故安裝cuda10.2。下面給出這種情況的解決方法)
第一步:下載雙擊運行,選自定義
在這里插入圖片描述
第二步:不要選擇visual studio integration,否則無法安裝
在這里插入圖片描述
等待安裝完成--約2分鍾,期間若有GeForce experience失敗則重復上述步驟即可

第三步:更改環境變量
進入環境變量編輯頁面,此時已經將cuda10.2安裝到默認的NVIDIA cumputing toolkit路徑下,需要將系統的環境變量修改為cuda10.2,把10.0的變量去掉。同一台電腦可以擁有多個不同版本的cuda,如果需要用低版本的cuda,只需要將系統環境變量修改為低版本,將高版本的刪除即可。
在這里插入圖片描述
新建環境變量
在這里插入圖片描述

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\CUPTI\lib64
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\bin\win64
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\common\lib\x64

此時應該有如下兩個變量,如果以前安裝的有殘存的cuda10.0的路徑,刪除即可
在這里插入圖片描述
第四步:安裝cudnn
將cudnn解壓后,將其中的所有內容復制到以下路徑中,ps(默認路徑,可以直接用)

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2

第五步:驗證
打開cmd,輸入nvcc -V驗證cuda是否安裝成功,出現如下界面即為成功在這里插入圖片描述

第四步-安裝pytorch1.5.1以及其他庫

以管理員身份進入cmd,輸入activate yolov5test進入環境目錄下,輸入

pip install torch===1.5.1 torchvision===0.6.1 -f https://download.pytorch.org/whl/torch_stable.html -i https://pypi.douban.com/simple

使用豆瓣源安裝,很多是使用清華源,但是清華源安裝時容易超時而導致安裝失敗,有條件的可以FQ直接安裝,效果非常好。
安裝完成后再pycharm中創建文件,輸入驗證pytorch安裝是否成功

import torch
print(torch.cuda.is_available())
print(torch.__version__)

出現以下結果即為安裝成功
在這里插入圖片描述
其他庫的安裝建議根據requirement.txt文件逐個安裝。。。清華源太容易崩了
下面給出requirement.txt的內容

# pip install -U -r requirements.txt
Cython
numpy>=1.18.5
opencv-python
torch>=1.5.1
matplotlib
pillow
tensorboard
PyYAML>=5.3
torchvision>=0.6
scipy
tqdm
# pycocotools>=2.0

# Nvidia Apex (optional) for mixed precision training --------------------------
# git clone https://github.com/NVIDIA/apex && cd apex && pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" . --user && cd .. && rm -rf apex

# Conda commands (in place of pip) ---------------------------------------------
# conda update -yn base -c defaults conda
# conda install -yc anaconda numpy opencv matplotlib tqdm pillow ipython
# conda install -yc conda-forge scikit-image pycocotools tensorboard
# conda install -yc spyder-ide spyder-line-profiler
# conda install -yc pytorch pytorch torchvision
# conda install -yc conda-forge protobuf numpy && pip install onnx==1.6.0  # https://github.com/onnx/onnx#linux-and-macos

可以根據下面的指令,依次輸入以下命令安裝相應的庫:

pip install Cython
pip install numpy
pip install opencv-python
pip install matplotlib
pip install pillow
pip install tensorboard
pip install PyYAML
pip install torchvision
pip install scipy
pip install tqdm

第五步-下載權重文件

下載的權重文件放入項目文件夾中!!!!注意是項目文件夾,而不是weights文件夾!!!!!!
在這里插入圖片描述

第六步-實際測試

打開項目文件夾,找到inference,這里images存儲測試數據,output存儲測試結果,同樣,測試數據名稱不能帶有中文字符
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
基本測試需要運行detect.py,pycharm中運行結果如下
在這里插入圖片描述
說明:測試數據可以是圖片或視頻,也可以是本機攝像頭。
使用方法為在detect文件最后找到

d_argument('--source', type=str, default='0', help='source')  # file/folder, 0 for webcam

默認值改成0即可
本人使用i7-8750+1050Ti跑手機錄像30~50FPS,效果還可以

ps:如果出現頁面文件太小,無法完成操作,這樣的錯誤是因為虛擬內存不足(虛擬內存定義參考操作系統的虛擬內存),參考修改頁面文件即可解決

第七步(可選操作)-安裝apex

官網地址

介紹:
這個存儲庫包含nvidia維護的實用程序,以簡化Pytorch中的混合精度和分布式培訓。這里的一些代碼將包括在上游Pytorch最終。Apex的目的是盡可能快地為用戶提供最新的實用程序。

Windows support is experimental, and Linux is recommended.
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" . may work if you were able to build Pytorch from source on your system. pip install -v --no-cache-dir . (without CUDA/C++ extensions) is more likely to work. If you installed Pytorch in a Conda environment, make sure to install Apex in that same environment.

1.從官網上下載源碼,降里面的內容解壓到yolov5工程文件夾下
2.打開pycharm的terminal界面,輸入

pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext"

但是感覺貌似不太對。。輸入會報

ERROR: You must give at least one requirement to install (see "pip help install")

可以嘗試在terminal中輸入

python setup.py install --cpp_ext --cuda_ext

等待1-2分鍾即可完成安裝

第八步-訓練自制數據集

1.coco128數據集

訓練數據集需要下載coco數據集,解壓到與工程文件並列的位置,運行train.py
注:如果使用自制訓練集訓練自己的網絡模型且GPU不太給力,可以調小網絡參數和訓練規模。(因為coco128數據集只有128張圖片,且標記的種類較多,所以訓練出來的網絡最終效果不太理想,只是用來測試是否可以訓練)

2.coco2017數據集

因為數據集較大,且標注為json格式。。。。(聽說要轉xml再轉txt才能訓練yolov5?),顧再研究研究,有大佬知道的可以評論去補充一波
感謝Thanks♪(・ω・)ノ

coco2017標注為json格式
在這里插入圖片描述
目標檢測只需要用到instances_train2017.json和instances_val2017.json兩個標注文件,一個是訓練集的標注,一個是驗證集的標注

在此給出已經完成轉換的兩種格式的壓縮包xml,txt
在這里插入圖片描述
在這里插入圖片描述

並給出將json->xml->txt格式標注的源碼

json2xml.py

# 使用時僅需修改21、22、24行路徑文件
import os
import time
import json
import pandas as pd
from tqdm import tqdm
from pycocotools.coco import COCO


def trans_id(category_id):
    names = []
    namesid = []
    for i in range(0, len(cats)):
        names.append(cats[i]['name'])
        namesid.append(cats[i]['id'])
    index = namesid.index(category_id)
    return index


root = 'coco2017'  # 你下載的 COCO 數據集所在目錄
dataType = 'train2017'
anno = '{}/annotations/instances_{}.json'.format(root, dataType)
xml_dir = '{}/xml/{}_xml'.format(root, dataType)

coco = COCO(anno)  # 讀文件
cats = coco.loadCats(coco.getCatIds())  # 這里loadCats就是coco提供的接口,獲取類別

# Create anno dir
dttm = time.strftime("%Y%m%d%H%M%S", time.localtime())
if os.path.exists(xml_dir):
    os.rename(xml_dir, xml_dir + dttm)
os.mkdir(xml_dir)

with open(anno, 'r') as load_f:
    f = json.load(load_f)

imgs = f['images']

df_cate = pd.DataFrame(f['categories'])
df_cate_sort = df_cate.sort_values(["id"], ascending=True)
categories = list(df_cate_sort['name'])
print('categories = ', categories)
df_anno = pd.DataFrame(f['annotations'])

for i in tqdm(range(len(imgs))):
    xml_content = []
    file_name = imgs[i]['file_name']
    height = imgs[i]['height']
    img_id = imgs[i]['id']
    width = imgs[i]['width']

    xml_content.append("<annotation>")
    xml_content.append("	<folder>VOC2007</folder>")
    xml_content.append("	<filename>" + file_name + "</filename>")
    xml_content.append("	<size>")
    xml_content.append("		<width>" + str(width) + "</width>")
    xml_content.append("		<height>" + str(height) + "</height>")
    xml_content.append("	</size>")
    xml_content.append("	<segmented>0</segmented>")
    # 通過img_id找到annotations
    annos = df_anno[df_anno["image_id"].isin([img_id])]

    for index, row in annos.iterrows():
        bbox = row["bbox"]
        category_id = row["category_id"]
        cate_name = categories[trans_id(category_id)]

        # add new object
        xml_content.append("	<object>")
        xml_content.append("		<name>" + cate_name + "</name>")
        xml_content.append("		<pose>Unspecified</pose>")
        xml_content.append("		<truncated>0</truncated>")
        xml_content.append("		<difficult>0</difficult>")
        xml_content.append("		<bndbox>")
        xml_content.append("			<xmin>" + str(int(bbox[0])) + "</xmin>")
        xml_content.append("			<ymin>" + str(int(bbox[1])) + "</ymin>")
        xml_content.append("			<xmax>" + str(int(bbox[0] + bbox[2])) + "</xmax>")
        xml_content.append("			<ymax>" + str(int(bbox[1] + bbox[3])) + "</ymax>")
        xml_content.append("		</bndbox>")
        xml_content.append("	</object>")
    xml_content.append("</annotation>")

    x = xml_content
    xml_content = [x[i] for i in range(0, len(x)) if x[i] != "\n"]
    ### list存入文件
    xml_path = os.path.join(xml_dir, file_name.replace('.jpg', '.xml'))
    with open(xml_path, 'w+', encoding="utf8") as f:
        f.write('\n'.join(xml_content))
    xml_content[:] = []

xml2txt.py

import os.path
import xml.etree.ElementTree as ET

class_names = ['lip']

xmlpath = 'F:\\share\\標注\\xml\\' # xml文件的位置
txtpath = 'F:\\share\\標注\\txt\\' # 導出txt的位置

files=[]

for root, dirs, files in os.walk(xmlpath):
    None

number = len(files)
i = 0
while i < number:

    name = files[i][0:-4]
    xml_name = name + ".xml"
    txt_name = name + ".txt"
    xml_file_name = xmlpath + xml_name
    txt_file_name = txtpath + txt_name

    xml_file = open(xml_file_name)
    tree = ET.parse(xml_file)
    root = tree.getroot()
    filename = root.find('filename').text

    image_name = root.find('filename').text
    w = int(root.find('size').find('width').text)
    h = int(root.find('size').find('height').text)

    f_txt = open(txt_file_name, 'w+')
    content = ""

    first = True

    for obj in root.iter('object'):

        name = obj.find('name').text
        class_num = class_names.index(name)

        xmlbox = obj.find('bndbox')

        x1 = int(xmlbox.find('xmin').text)
        x2 = int(xmlbox.find('xmax').text)
        y1 = int(xmlbox.find('ymin').text)
        y2 = int(xmlbox.find('ymax').text)

        if first:
            content += str(class_num) + " " + \
                       str((x1+x2)/2/w) + " " + str((y1+y2)/2/h) + " " + \
                       str((x2-x1)/w) + " " + str((y2-y1)/h)
            first=False
        else:
            content += "\n" + \
                       str(class_num) + " " + \
                       str((x1 + x2) / 2 / w) + " " + str((y1 + y2) / 2 / h) + " " + \
                       str((x2 - x1) / w) + " " + str((y2 - y1) / h)

    print(str(i/(number - 1) * 100) + "%\n")
    f_txt.write(content)
    f_txt.close()
    xml_file.close()
    i += 1

print("done!")

3.真正的自制數據集

使用各種目標檢測的標注工具都行,我用的LabelImg
在這里插入圖片描述

可以下載源碼安裝,也可以直接pip安裝

安裝方法參考:
https://blog.csdn.net/qq_34809033/article/details/80589868?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

使用方法參考:
https://zhuanlan.zhihu.com/p/90834296
https://blog.csdn.net/python_pycharm/article/details/85338801

4.虛假的自制數據集

嘗試訓練了coco128數據集,但是效果不理想。
可以采用了pygame繪圖自制數據集訓練的方法。

1.生成隨機數據集的代碼如下

import math
import random
import pygame
pygame.init()

windowSize = [640, 640]
screen = pygame.display.set_mode(windowSize)
clock = pygame.time.Clock()

color = pygame.color.Color('#57B0F6')
black = pygame.color.Color('#000000')

count = 0
done = False
fileNo = 0

round = 1

while not done and round<1000:
    screen.fill(black)

    x = 100 + random.randint(0, 400)
    y = 100 + random.randint(0, 400)
    pygame.draw.ellipse(screen, color, [x, y, 100, 100])

    pygame.display.flip()

    zero=""
    if round>=1 and round<=9:
        zero="00000000000"
    if round>=10 and round<=99:
        zero="0000000000"
    if round>=100 and round<=999:
        zero="000000000"
    pygame.image.save(screen, "images\\" + zero + str(round) + ".jpg") #這句話保存圖片

    f=open("labels\\" + zero +str(round)+".txt",'w+')
    f.write("0 "+str((x+50)/640)+" "+str((y+50)/640)+" 0.15625 0.15625")
    f.close()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    round+=1
pygame.quit()

通過pygame在黑色背景下繪制一個藍色圓形圖案,並根據yolov5標記的導入規則--每張圖片一個txt文件,每一行表示一個object。第一個數表示種類在yaml中定義的下標(只有一個就寫0),第二三個數表示矩形框中心的橫縱坐標(位於正中間,則都為0.5),第四五個數表示矩形的寬高(若矩寬高都為圖片的一半,則都為0.5)

在這里插入圖片描述
images文件夾
在這里插入圖片描述
在這里插入圖片描述

labels文件夾
在這里插入圖片描述
在這里插入圖片描述
共隨機生成1000張圖片,位置均隨機,並生成對應的標注。

2.創建yaml文件

在yolov5的工程文件中找到data文件夾,創建circle.yaml文件,將下面的代碼輸進去

train: ../creat_image/images/ #改為自己的訓練文件的路徑
val: ../creat_image/images/ #改為自己的測試文件的路徑

# number of classes
nc: 1

# class names
names: ['circle']

3.更改train.py的設置

訓練屬性設置說明

    # 存儲模型結構的配置文件
    parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='model.yaml path')

    # 存儲訓練、測試的數據的文件 coco128.yaml->circle.yaml
    parser.add_argument('--data', type=str, default='data/circle.yaml', help='data.yaml path')

    #
    parser.add_argument('--hyp', type=str, default='', help='hyp.yaml path (optional)')

    # 指的就是訓練過程中整個數據集將被迭代多少次,顯卡不行你就調小點
    parser.add_argument('--epochs', type=int, default=100)

    # batch-size:一次看完多少張圖片才進行權重更新,梯度下降的mini-batch,顯卡不行你就調小點。
    parser.add_argument('--batch-size', type=int, default=30, help="Total batch size for all gpus.")

    # 輸入圖片寬高,顯卡不行你就調小點。-------必須是32的倍數,輸入250會自動調整成256
    parser.add_argument('--img-size', nargs='+', type=int, default=[320, 320], help='train,test sizes')

    # 進行矩形訓練
    parser.add_argument('--rect', action='store_true', help='rectangular training')

    # 恢復最近保存的模型開始訓練
    parser.add_argument('--resume', nargs='?', const='get_last', default=False,
                        help='resume from given path/to/last.pt, or most recent run if blank.')

    # 僅保存最終checkpoint
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')

    # 僅測試最后的epoch
    parser.add_argument('--notest', action='store_true', help='only test final epoch')

    #
    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')

    # 進化超參數
    parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')

    # gsutil bucket
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')

    # 緩存圖像以加快訓練速度
    parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')

    # 權重文件路徑,用於遷移訓練,可以以官方提供的幾個訓練好的模型為基礎進行訓練
    # default='' ----> default='yolov5s.pt'
    parser.add_argument('--weights', type=str, default='', help='initial weights path')

    # 重命名results.txt to results_name.txt
    parser.add_argument('--name', default='', help='renames results.txt to results_name.txt if supplied')

    # cuda device, i.e. 0 or 0,1,2,3 or cpu
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')

    # 多尺度訓練,img-size +/- 50%
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')

    # 單類別的訓練集
    parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset')

打開train.py,找到后面位置的這個語句,將default改為自己的circle.yaml的路徑

parser.add_argument('--data', type=str, default='data/circle.yaml', help='data.yaml path')

本人使用1050Ti+i7-8750的筆記本電腦,采用320,320圖片輸入,訓練100輪次,訓練時間大約1.5小時

完成訓練后會在yolov5文件夾的run下保存有訓練模型以及訓練參數的圖表

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
使用detect.py檢測訓練結果需要更改模型路徑,改為run/exp.../weights/best.py(完成訓練后會提示生成的權重文件在哪)
之后與前文步驟類似,將從數據集中挑幾張圖片輸入,運行即可得到輸出
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM