一. 前言
以下代碼只可用于私服,不可商用,代碼完全開(kāi)源,因?yàn)樽约旱难芯糠较蛞彩巧疃葘W(xué)習(xí)方向,而且平時(shí)閑的時(shí)候還喜歡玩會(huì)cf火線等槍戰(zhàn),就想著找一個(gè)大模型做一個(gè)對(duì)游戲敵人的識(shí)別的功能,一切實(shí)現(xiàn)之后就想把自己的心得寫出來(lái),我打算分倆個(gè)教程分別細(xì)述整個(gè)學(xué)習(xí)以及操作的過(guò)程,教程一主要包括了yolov5的基本使用,制作并訓(xùn)練自己的數(shù)據(jù)集,第二個(gè)教程包括對(duì)yolov5添加或修改部分代碼以達(dá)到實(shí)現(xiàn)完整功能的目的
提示:看這篇文章需要會(huì)一些虛擬環(huán)境的基礎(chǔ)操作以及python的基本操作,如果對(duì)虛擬環(huán)境不了解,對(duì)cudnn和cuda不了解可以看下面這篇文章? ==》https://blog.csdn.net/calmdownn/article/details/130609866
二. 制作數(shù)據(jù)集
2.1?下載labelImg 和 所需配置庫(kù)
進(jìn)入aconda虛擬環(huán)境中之后下載下面三個(gè)庫(kù)文件
pip install PyQt5 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
?
pip install pyqt5-tools -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
?
pip install lxml -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
labelImg : 到github上將labelImg壓縮包下載下來(lái),我用的是1.8.1的版本? ==》labelImg下載地址
2.2 進(jìn)入虛擬環(huán)境編譯resources.py文件之后啟動(dòng)labelImg
進(jìn)入虛擬環(huán)境之后切換到(cd)下載之后的labelImg文件夾目錄,執(zhí)行以下命令將qt文件轉(zhuǎn)化為.py
pyrcc5 -o resources.py resources.qrc
(我的python版本是3.8),最后運(yùn)行l(wèi)abelImg.py的python文件,打開(kāi)labelImg
python labelImg.py
注意:可能會(huì)爆出以下錯(cuò)誤,提示在libs文件中找不到resources文件
解決方法:將resources.py文件轉(zhuǎn)移到libs文件夾中
打開(kāi)之后如下:
點(diǎn)擊PascalVoc按鈕,將其切換成yolo格式,open就是打開(kāi)你原始圖片的文件夾,open dir 就是打開(kāi)你的目標(biāo)圖片文件夾(推薦這個(gè)),change save Dir就是改變你的保存路徑
?下面是它的快捷鍵:
2.3 使用labelImg
添加原圖片,按w進(jìn)行拉框,拉框之后為其命名即可
?我這里是畫了一個(gè)頭和一個(gè)身子
?全部畫完之后按住 ctrl + s 進(jìn)行保存,你就能在原先設(shè)置的存儲(chǔ)路徑中看見(jiàn)一個(gè).txt的文件了
打開(kāi)txt文件之后如下,0和1分別代表頭部類和身體類,四個(gè)數(shù)值分別代表你畫框的左上角坐標(biāo)和右下角坐標(biāo)
到這制作數(shù)據(jù)集的步驟就結(jié)束了,下面開(kāi)始下載并使用yolov5模型
三. yolov5的下載與使用
3.1 官網(wǎng)下載yolov5
進(jìn)入github,選擇版本然后下載,我下載的版本是7.0版本 ==》yolov5下載地址
?下載完打開(kāi)如下:
3.2 配置yolov5的所需虛擬環(huán)境
基本的虛擬環(huán)境創(chuàng)建
注意事項(xiàng):
1).確定你的顯卡驅(qū)動(dòng)版本,下載對(duì)應(yīng)的cuda和cudnn,是為了能夠使用gpu版本的pytorch,比如我的電腦顯卡是1060,所對(duì)應(yīng)的cuda和cudnn版本分別就是10.2和7.6.5版本
顯卡與cuda和cudnn的對(duì)應(yīng)關(guān)系以及虛擬環(huán)境的知識(shí)可以看下面這篇文章 == 》Anaconda/jupyter notebook安裝使用tensorflow-gpu_jupyter notebook安裝tensorflow_calmdownn的博客-CSDN博客
2).注意pytorch的版本,yolov5的官網(wǎng)有聲明,至少pytorch要大于1.7.0版本,所以我下載的是1.8.1版本
conda install cudatoolkit=10.2 -c? https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/
conda install cudnn=7.6.5 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/
conda install pytorch==1.8.1 torchvision==0.9.1 torchaudio==0.8.1 cudatoolkit=10.2 -c pytorch
pytorch對(duì)應(yīng)的工具包下載地址 == 》https://pytorch.org/get-started/previous-versions/
比如你要下載1.8.1版本的gpu的pytorch,就可以 ctrl + f 全局搜索,找到linux和windows的下載,然后找準(zhǔn)你對(duì)應(yīng)的cuda版本下載就可以了
建議:最好先看看官網(wǎng)支持的cuda有什么版本,然后根據(jù)你的顯卡再去選擇cuda會(huì)更省力一些
3)測(cè)試pytorch的gpu版本是否可以使用
進(jìn)入虛擬環(huán)境,運(yùn)行python之后,導(dǎo)入import,執(zhí)行下面語(yǔ)句判斷gpu版本是否可用,如果結(jié)果為true就代表成功了
print(torch.cuda.is_available())
4)其他包的安裝
剩余其他工具包的安裝就比較簡(jiǎn)單了,一鍵自動(dòng)安裝即可,命令如下
注意:使用這個(gè)命令的前提還是要進(jìn)入虛擬環(huán)境之后,通過(guò)cd切換到y(tǒng)olov5文件目錄下才能執(zhí)行
pip install -r requirements.txt
?下面就是requirements.txt的位置和內(nèi)容
3.3 測(cè)試yolov5運(yùn)行
1) 下載yolov5s.pt文件,放進(jìn)根目錄中,網(wǎng)址 ==》?https://github.com/ultralytics/yolov5/releases
進(jìn)入網(wǎng)站往下翻,看到assets配置,點(diǎn)擊展開(kāi)全部assets,找到y(tǒng)olov5s.pt文件下載下來(lái)
將yolov5s.pt文件放入根目錄下面
2) 打開(kāi)pycharm或者其他的編輯軟件導(dǎo)入yolov5這個(gè)文件夾,這里只用pycharm舉例了,將pycharm切換到你創(chuàng)建的虛擬環(huán)境,如果沒(méi)有的自己add添加一下自己的虛擬環(huán)境,如果不會(huì)的查一下,這里就不多說(shuō)了
3) 更改參數(shù)
打開(kāi)detect.py的文件,在根目錄下可以找到
找到下面畫紅線的幾行參數(shù),yolov5-7.0版本在212行開(kāi)始,將你們的代碼圖片中畫紅線的地方改成同樣的代碼,我簡(jiǎn)單說(shuō)下一些屬性的功能
weights :? 代表權(quán)重,yolov5s.pt也就是官方已經(jīng)訓(xùn)練好的權(quán)重,經(jīng)過(guò)很多數(shù)據(jù)集鍛煉出來(lái)的,有一些基本的類識(shí)別功能,我們以后就是在這個(gè)權(quán)重上繼續(xù)訓(xùn)練的,也就是站在巨人的肩膀前進(jìn)
source :? 代表來(lái)源,這個(gè)來(lái)源可以是圖片,視頻,屏幕等,這里測(cè)試用的就是yolov5里面自帶的照片,大家可以照著路徑找一下這個(gè)圖片
data :? 代表數(shù)據(jù)配置文件,.yaml文件里面包含了訓(xùn)練集,實(shí)驗(yàn)集,測(cè)試集路徑,還包含了識(shí)別的所有類別名稱集合,無(wú)論是訓(xùn)練還是測(cè)試都會(huì)用到
device :? 設(shè)備名稱,如果你只有一個(gè)顯卡默認(rèn)改為0即可,如果你有多個(gè)顯卡可以寫成 0,1,2這個(gè)形式
view-img,save-txt 等,這些都是一些不太重要的屬性,也就是是否彈出預(yù)測(cè)圖片,是否生成txt文件等等
4) 運(yùn)行
上面都準(zhǔn)備好之后就可以運(yùn)行detect.py文件了
運(yùn)行成功之后提示如下,運(yùn)行之后的結(jié)果圖片會(huì)自動(dòng)保存到runs\detect\exp文件夾之下
3.4 利用yolov5測(cè)試自己的數(shù)據(jù)
1) 構(gòu)建自己的數(shù)據(jù)文件目錄
創(chuàng)建一個(gè)mydata文件夾,mydata文件夾下面有倆個(gè)子文件夾,分為images,labels,里面又分為三個(gè)文件夾,測(cè)試集,訓(xùn)練集,驗(yàn)證集,images文件保存的就是原圖片,labels文件保存的是.txt文件,里面有類別和坐標(biāo),忘了的看2.3,我們要將數(shù)據(jù)分成三類,我寫了一個(gè)小腳本用來(lái)將所有的數(shù)據(jù)集分類
下面就是我寫的數(shù)據(jù)集分類腳本部分:
使用方式:只需要更改source_folder_jpg(你的所有圖片地址),source_folder_txt(l圖片對(duì)應(yīng)的.txt文件地址),destination_folder(你想要生成的目標(biāo)文件夾地址)?,split_ratio_val(驗(yàn)證集的比例),split_radio_test(測(cè)試集的比例)
運(yùn)行之前文件夾圖片如下:
運(yùn)行之后文件夾圖片如下:
mydata文件夾就已經(jīng)包含了yolov5數(shù)據(jù)集的整體格式了,直接將它移動(dòng)到data根目錄下就行了,忘了放到什么位置的看3.4的第一步就知道了
腳本代碼:
import os
import shutil
import random
def random_split_files(source_folder_jpg,source_folder_txt,destination_folder,split_val=0.3,split_test=0.3):
# yolov5的文件夾格式
mydata_folder = os.path.join(destination_folder, 'mydata') # mydata文件夾
images_folder = os.path.join(mydata_folder,'images') # images文件夾
labels_folder = os.path.join(mydata_folder, 'labels') # lables文件夾
img_train_folder = os.path.join(images_folder,'train') # img_train文件夾
img_val_folder = os.path.join(images_folder, 'val') # img_val文件夾
img_test_folder = os.path.join(images_folder,'test') # img_test文件夾
lbs_train_folder = os.path.join(labels_folder, 'train') # label_train文件夾
lbs_val_folder = os.path.join(labels_folder, 'val') # label_val文件夾
lbs_test_folder = os.path.join(labels_folder, 'test') # label_test文件夾
# 放入列表中
folder_list = []
folder_list.append(img_train_folder)
folder_list.append(img_val_folder)
folder_list.append(img_test_folder)
folder_list.append(lbs_train_folder)
folder_list.append(lbs_val_folder)
folder_list.append(lbs_test_folder)
# 判斷文件夾是否存在
for forder_name in folder_list:
if os.path.exists(forder_name) == False:
os.makedirs(forder_name)
pass
# 打開(kāi)數(shù)據(jù)集的照片以及txt文件
files_jpg = os.listdir(source_folder_jpg)
files_txt = os.listdir(source_folder_txt)
# 打亂照片順序
random.shuffle(files_jpg)
# 三數(shù)據(jù)數(shù)量
num_files_val = int(len(files_jpg) * split_val)
num_files_test = int(len(files_jpg) * split_test)
num_files_train = int(len(files_jpg) - num_files_test - num_files_val)
# 判斷數(shù)量是否符合
if num_files_train <= 0:
print("驗(yàn)證集和和測(cè)試集數(shù)量比例不對(duì)!")
return
files_train = files_jpg[:num_files_train]
files_val = files_jpg[num_files_train:num_files_train + num_files_val]
files_test = files_jpg[num_files_train + num_files_val:]
for filename_train in files_train:
# print(filename)
filename_txt = filename_train.replace(".jpg",".txt")
source_path_jpg = os.path.join(source_folder_jpg, filename_train)
source_path_txt = os.path.join(source_folder_txt, filename_txt)
destination_path_jpg = os.path.join(img_train_folder, filename_train)
destination_path_txt = os.path.join(lbs_train_folder, filename_txt)
shutil.copy(source_path_jpg, destination_path_jpg)
shutil.copy(source_path_txt, destination_path_txt)
print("訓(xùn)練集jpg,txt文件傳送完畢")
for filename_val in files_val:
filename_txt = filename_val.replace(".jpg", ".txt")
source_path_jpg = os.path.join(source_folder_jpg, filename_val)
source_path_txt = os.path.join(source_folder_txt, filename_txt)
destination_path_jpg = os.path.join(img_val_folder, filename_val)
destination_path_txt = os.path.join(lbs_val_folder, filename_txt)
shutil.copy(source_path_jpg, destination_path_jpg)
shutil.copy(source_path_txt, destination_path_txt)
print("驗(yàn)證集jpg,txt文件傳送完畢")
for filename_test in files_test:
filename_txt = filename_test.replace(".jpg", ".txt")
source_path_jpg = os.path.join(source_folder_jpg, filename_test)
source_path_txt = os.path.join(source_folder_txt, filename_txt)
destination_path_jpg = os.path.join(img_test_folder, filename_test)
destination_path_txt = os.path.join(lbs_test_folder, filename_txt)
shutil.copy(source_path_jpg, destination_path_jpg)
shutil.copy(source_path_txt, destination_path_txt)
print("測(cè)試集jpg,txt文件傳送完畢")
if __name__ == "__main__":
source_folder_jpg = "D:\lableimg1.8\csdn\dataset_pic" # 原圖片地址
source_folder_txt = "D:\lableimg1.8\csdn\dataset_txt" # 原圖片txt地址
destination_folder = "D:\lableimg1.8\csdn" # 目標(biāo)地址
split_ratio_val = 0.2 # 驗(yàn)證集分割比例
split_ratio_test = 0.2 # 測(cè)試集分割比例
random_split_files(source_folder_jpg, source_folder_txt, destination_folder, split_ratio_val,split_ratio_test)
2) 創(chuàng)建自己的.yaml文件
在data根目錄下新建一個(gè).yaml文件,我的就是crossFire.yaml了,里面包含了訓(xùn)練集,測(cè)試集,驗(yàn)證集的地址,如果和我一樣結(jié)構(gòu)就不用改了,如果不一樣自行改就行了,這個(gè)文件里面還包含了訓(xùn)練的類別
?
train: data/mydata/images/train # train images (relative to 'path') 128 images
val: data/mydata/images/val # val images (relative to 'path') 128 images
test: data/mydata/images/test # test images (optional)
names:
0: body
1: head
3) train.py文件配置
注意:下面畫紅線的都是需要改的,其他屬性可以和我一樣,主要是batch-size,epoch,workers,最好根據(jù)自己電腦情況來(lái)改變
屬性介紹:
weights:權(quán)重,我們正常就用yolov5s.pt就行了,和上面detect.py預(yù)測(cè)文件一樣
cfg:我們用的模型的配置文件,因?yàn)槲覀冇玫膟olov5s,所以這里就用yolov5s.yaml文件,在models文件的根目錄下就能看見(jiàn)
data:數(shù)據(jù)集的配置文件,和上面detect.py預(yù)測(cè)文件一樣,上面自己創(chuàng)建的.yaml文件
epochs:迭代次數(shù),這里建議300-600次之間較好,多了可能會(huì)高方差過(guò)擬合,少了可能會(huì)高偏差欠擬合
batch-size:塊訓(xùn)練大小,這個(gè)數(shù)量大小根據(jù)顯卡情況來(lái)定就行,比如我的1060 3G顯存每次只能設(shè)定為8,如果大于8我的顯存就會(huì)爆,會(huì)提示out of memory,這里建議2倍遞增即可,比如選擇 2/4/8/16/32/64 等
batch-size擴(kuò)展(可以不用看): batch-size其實(shí)就是將一大塊訓(xùn)練的數(shù)據(jù)集隨機(jī)分成多個(gè)小塊去進(jìn)行訓(xùn)練,這樣模型可以根據(jù)每一塊訓(xùn)練結(jié)束后的loss損失值去調(diào)整權(quán)重,更好的適應(yīng)下一塊的訓(xùn)練,這樣在圖像上表現(xiàn)出來(lái)的就是Loss會(huì)穩(wěn)步上升,比不用batch-size更加穩(wěn)定,而且更加節(jié)省內(nèi)存資源,總體循環(huán)次數(shù)會(huì)多出batch-size - 1次
device:選擇顯卡,如果你只有一張顯卡默認(rèn)0就行了,如果你有多張,就可以寫成0,1,2等
workers: 數(shù)據(jù)預(yù)處理時(shí)候所用的cpu線程數(shù)量,如果電腦不太行,就默認(rèn)0就可以了,我的1060 3G就只設(shè)置的為0,多線程也比較吃顯存,因?yàn)橛?xùn)練的時(shí)候gpu吃的比較多,所以cpu做一些比如預(yù)處理的操作之后會(huì)等待gpu的操作完成再繼續(xù),所以用多線程就會(huì)把cpu利用的更充分一點(diǎn),我租服務(wù)器的時(shí)候workers設(shè)置的就為8,3080ti顯卡12G
4) 運(yùn)行train.py文件
上面都準(zhǔn)備好就可以運(yùn)行了,運(yùn)行圖片如下:
3.5 訓(xùn)練結(jié)果使用
1)?訓(xùn)練結(jié)果儲(chǔ)存位置:
訓(xùn)練結(jié)束之后可以在runs/train/exp(exp1就代表第一次訓(xùn)練文件夾,exp2代表第二次)/weights下找到best.pt,和last.pt文件,best.pt文件就代表訓(xùn)練過(guò)程中取某一次循環(huán)中l(wèi)oss代價(jià)函數(shù)最低的一次權(quán)重,也就是效果最好的一次,last.pt文件就是最后一次循環(huán)的權(quán)重文件
2) 利用best.pt文件進(jìn)行預(yù)測(cè)操作
對(duì)沒(méi)錯(cuò),你費(fèi)勁千辛萬(wàn)苦就是為了得到這個(gè)best.pt文件,將detect.py文件中的權(quán)重路徑換成你訓(xùn)練得到的best.pt文件路徑(更改weights屬性,忘了的看3.3的第三小步,detect.py文件配置那塊),source屬性換成你想要預(yù)測(cè)的照片/視頻的地址,data屬性換成你自己寫的.yaml文件,下面地方都可以根據(jù)情況更改
3) 預(yù)測(cè)
預(yù)測(cè)之后的存儲(chǔ)地址就在runs/detect/exp(第幾次預(yù)測(cè)后面就是數(shù)字幾),如果你想更改存儲(chǔ)的地址可以找到project屬性進(jìn)行更改,目錄結(jié)構(gòu)如下:
下面這張圖片就是我隨便從訓(xùn)練集里選出來(lái)的一張圖片,咱們看看效果
?結(jié)果圖如下:
四. 材料與總結(jié)
4.1 材料
如果想要敵我數(shù)據(jù)集或者整個(gè)項(xiàng)目的可以郵箱聯(lián)系我(874302104@qq.com),因?yàn)榘俣仍粕蟼鞔箜?xiàng)目需要vip才可,大概有16000千張不同人物不同地點(diǎn)標(biāo)注好的敵我標(biāo)注文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-679497.html
4.2 總結(jié)
yolov5的基礎(chǔ)到這就結(jié)束了,下一篇我將講述如何進(jìn)行時(shí)時(shí)監(jiān)控屏幕以及自動(dòng)進(jìn)行瞄準(zhǔn),如果有什么困難和不懂的也可以郵箱聯(lián)系我哦!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-679497.html
到了這里,關(guān)于yolov5識(shí)別cf火線敵人(FPS類的AI瞄準(zhǔn))詳細(xì)教程一的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!