專(zhuān)門(mén)做網(wǎng)站代購(gòu)的盈利路子郴州seo
文章目錄
- 1.收集數(shù)據(jù)集
- 1.1 使用開(kāi)源已標(biāo)記數(shù)據(jù)集
- 1.2 爬取網(wǎng)絡(luò)圖像
- 1.3 自己拍攝數(shù)據(jù)集
- 1.4 使用數(shù)據(jù)增強(qiáng)生成數(shù)據(jù)集
- 1.5 使用算法合成圖像
- 2.標(biāo)注數(shù)據(jù)集
- 2.1確認(rèn)標(biāo)注格式
- 2.2 開(kāi)始標(biāo)注
- 3.劃分?jǐn)?shù)據(jù)集
- 4.配置訓(xùn)練環(huán)境
- 4.1獲取代碼
- 4.2安裝環(huán)境
- 5.訓(xùn)練模型
- 5.1新建一個(gè)數(shù)據(jù)集yaml文件
- 5.2預(yù)測(cè)模型
- 5.3訓(xùn)練模型
- 6.驗(yàn)證模型
- 7.導(dǎo)出模型
1.收集數(shù)據(jù)集
隨著深度學(xué)習(xí)技術(shù)在計(jì)算機(jī)視覺(jué)領(lǐng)域的廣泛應(yīng)用,行人檢測(cè)和車(chē)輛檢測(cè)等任務(wù)已成為熱門(mén)研究領(lǐng)域。然而,實(shí)際應(yīng)用中,可用的預(yù)訓(xùn)練模型可能并不適用于所有應(yīng)用場(chǎng)景。
例如,雖然預(yù)先訓(xùn)練的模型可以檢測(cè)出行人,但它無(wú)法區(qū)分“好人”和“壞人”,因?yàn)樗鼪](méi)有接受相關(guān)的訓(xùn)練。因此,我們需要為自定義檢測(cè)模型提供足夠數(shù)量的帶有標(biāo)注信息的圖像數(shù)據(jù),來(lái)訓(xùn)練模型以區(qū)分“好人”和“壞人”
1.1 使用開(kāi)源已標(biāo)記數(shù)據(jù)集
使用開(kāi)源數(shù)據(jù)集是收集數(shù)據(jù)的最簡(jiǎn)便方式之一。例如,ImageNet 是一個(gè)大型圖像數(shù)據(jù)庫(kù),包含超過(guò) 1400 萬(wàn)張圖像,可用于深度學(xué)習(xí)模型的訓(xùn)練。此外,像 COCO 、PASCAL VOC
這樣的數(shù)據(jù)集也經(jīng)常用于目標(biāo)檢測(cè)模型的訓(xùn)練和評(píng)估。但是這些數(shù)據(jù)庫(kù)中的圖像通常來(lái)自不同的領(lǐng)域和應(yīng)用場(chǎng)景,因此可能無(wú)法完全滿(mǎn)足特定研究的需求。
1.2 爬取網(wǎng)絡(luò)圖像
另一種選擇是通過(guò)網(wǎng)絡(luò)搜索圖像,并手動(dòng)選擇要下載的圖像。然而,由于需要收集大量數(shù)據(jù),因此此方法的效率較低。需要注意的是,網(wǎng)絡(luò)上的圖像可能受到版權(quán)保護(hù)。在使用這些圖像之前,務(wù)必檢查圖像的版權(quán)信息。
或者,您可以編寫(xiě)一個(gè)程序來(lái)爬取網(wǎng)絡(luò)并下載所需的圖像。但是這需要對(duì)數(shù)據(jù)進(jìn)行清洗。以確保數(shù)據(jù)質(zhì)量。同樣需要注意檢查每個(gè)圖像的版權(quán)信息。
1.3 自己拍攝數(shù)據(jù)集
對(duì)于一些特定的應(yīng)用場(chǎng)景,如自動(dòng)駕駛和安防監(jiān)控等,需要收集特定場(chǎng)景下的數(shù)據(jù),這時(shí)候就需要進(jìn)行自主拍攝??梢栽趯?shí)際場(chǎng)景中拍攝圖像或視頻,并對(duì)其進(jìn)行標(biāo)注,以獲得適用于特定場(chǎng)景的高質(zhì)量數(shù)據(jù)集。
1.4 使用數(shù)據(jù)增強(qiáng)生成數(shù)據(jù)集
我們知道深度學(xué)習(xí)模型需要大量的數(shù)據(jù)。當(dāng)我們只有一個(gè)小數(shù)據(jù)集時(shí),可能不足以訓(xùn)練一個(gè)好的模型。在這種情況下,我們可以使用數(shù)據(jù)增強(qiáng)來(lái)生成更多訓(xùn)練數(shù)據(jù)。
常見(jiàn)的增強(qiáng)方式就是幾何變換,類(lèi)似翻轉(zhuǎn)、裁剪、旋轉(zhuǎn)和平移這些。
1.5 使用算法合成圖像
最后一種獲取目標(biāo)檢測(cè)數(shù)據(jù)集的方法是使用合成圖像。合成圖像是通過(guò)使用圖像處理軟件(例如 Photoshop)在圖像中添加對(duì)象、更改背景或合成多個(gè)圖像以創(chuàng)建新的圖像。這種方法可以提供一些特殊情況或無(wú)法通過(guò)其他方式獲得的圖像,但是合成圖像通常無(wú)法完全代替真實(shí)場(chǎng)景的數(shù)據(jù),可能會(huì)對(duì)模型的準(zhǔn)確性產(chǎn)生一定的影響
或者我們可以使用生成對(duì)抗網(wǎng)絡(luò) (GAN )來(lái)生成數(shù)據(jù)集,
值得注意的是,收集訓(xùn)練數(shù)據(jù)集只是我們訓(xùn)練自定義檢測(cè)模型的第一步。。。接下來(lái)我們要個(gè)紹如何標(biāo)注數(shù)據(jù)集。當(dāng)然這一步是假設(shè)你的圖片已經(jīng)準(zhǔn)備完成。
本次案例使用我個(gè)人的 月餅數(shù)據(jù)集
鏈接: https://pan.baidu.com/s/1-DwTH6roNDSqW4NyqoA3BQ?pwd=25rt 提取碼: 25rt
2.標(biāo)注數(shù)據(jù)集
為什么要標(biāo)注數(shù)據(jù)集?標(biāo)注好的數(shù)據(jù)集有什么作用呢?答:為了讓計(jì)算機(jī)學(xué)會(huì)正確地識(shí)別物體,我們需要提供大量的標(biāo)注數(shù)據(jù)集,這些數(shù)集包含了圖像或視頻中物體的位置和類(lèi)別信標(biāo)注數(shù)據(jù)集的作用在干,它可以幫助計(jì)算機(jī)學(xué)習(xí)到如何識(shí)別不同種類(lèi)的物體,并且能夠正確地定位它們的位置。通過(guò)標(biāo)注數(shù)據(jù)集我們可以讓計(jì)算機(jī)逐漸學(xué)會(huì)如何識(shí)別和分類(lèi)不同種類(lèi)的物體,例如人、車(chē)、動(dòng)物等等。這些數(shù)據(jù)集可以被用來(lái)訓(xùn)練深度學(xué)習(xí)模型讓模型學(xué)會(huì)如何識(shí)別新的圖像或視頻中的物體。
舉個(gè)簡(jiǎn)單例子:比如說(shuō),我們想要讓計(jì)算機(jī)自動(dòng)識(shí)別圖像中的貓和狗。為了讓計(jì)算機(jī)學(xué)會(huì)如何識(shí)別這兩個(gè)物體,我們需要提供一些圖像樣本,并在這些樣本上標(biāo)注貓和狗的位置。如果我們沒(méi)有標(biāo)注數(shù)據(jù)集,計(jì)算機(jī)就無(wú)法學(xué)習(xí)到如何識(shí)別貓和狗。即使我們給計(jì)算機(jī)提供了大量的圖像,它也無(wú)法準(zhǔn)確地區(qū)分這兩個(gè)物體。但是,如果我們有了標(biāo)注數(shù)據(jù)集,計(jì)算機(jī)就可以通過(guò)學(xué)習(xí)這些數(shù)據(jù)來(lái)理解貓和狗之間的差異,并且可以在新的圖像中準(zhǔn)確地識(shí)別它們。
(當(dāng)然這個(gè)例子指的是監(jiān)督學(xué)習(xí))
2.1確認(rèn)標(biāo)注格式
YOLOv8
所用數(shù)據(jù)集格式與 YOLOv5 YOLOv7
相同,采用格式如下:
<object-class-id> <x> <y> <width> <height>
常用的標(biāo)注工具有很多,比如LabeLImg 、LabeUMe 、VIA
等,但是這些工具都需要安裝使用,我這里給大家介紹一款在線(xiàn)標(biāo)注數(shù)據(jù)集的工具 Make Sense
,打開(kāi)即用,非常的便捷,在標(biāo)注之前,我們來(lái)看一下一般情況下遵循的標(biāo)注規(guī)則:
1.目標(biāo)框必須框住整個(gè)目標(biāo)物體,不能有遺漏和重疊。
2.目標(biāo)框應(yīng)該與目標(biāo)物體盡可能接近,但不能與目標(biāo)物體重合
3.目標(biāo)框的寬度和高度應(yīng)該為正數(shù),不能為零或負(fù)數(shù)。
4.如果一張圖片中有多個(gè)目標(biāo)物體,每個(gè)目標(biāo)物體應(yīng)該用一個(gè)獨(dú)立的目標(biāo)框進(jìn)行標(biāo)注,不允許多個(gè)目標(biāo)共用一個(gè)框.
5.如果目標(biāo)物體的形狀不規(guī)則,可以使用多個(gè)框進(jìn)行標(biāo)注,但必須框住整個(gè)目標(biāo)物體。
6.目標(biāo)框的坐標(biāo)必須在數(shù)據(jù)集中統(tǒng)一。
2.2 開(kāi)始標(biāo)注
確認(rèn)好標(biāo)注格式后我們就可以開(kāi)始標(biāo)注了,進(jìn)入網(wǎng)頁(yè)后點(diǎn)擊 Get started 開(kāi)始使用。
首先點(diǎn)擊 Drop images
然后 ctrl+A
選中整個(gè)數(shù)據(jù)集里面的圖片。
隨后添加標(biāo)簽信息,有幾類(lèi)就添加幾個(gè),因?yàn)槲疫@里只檢測(cè)月餅一類(lèi),所以只添加一個(gè)標(biāo)簽 Moon Cake.
隨后就進(jìn)入了漫長(zhǎng)的標(biāo)注環(huán)節(jié),這里大家一定要認(rèn)真標(biāo)注,不然對(duì)最終模型的影響還是很大的。
標(biāo)注完成后我們點(diǎn)擊 Action -> Export Annotation
導(dǎo)出 yolo
格式的標(biāo)簽文件。
導(dǎo)出之后的標(biāo)簽文件就是這個(gè)樣子的,我們可以隨機(jī)抽查幾個(gè)看看有沒(méi)有問(wèn)題。
3.劃分?jǐn)?shù)據(jù)集
也就是說(shuō),我們現(xiàn)在導(dǎo)出后的圖片和標(biāo)簽是這個(gè)樣子的:
Moon_Cake├─images└─all└─labels└─all
但是 YOLO8
所需要的數(shù)據(jù)集路徑的格式是下面這樣子的(YOLOv8
支持不止這一種格式),我們接下來(lái)要通過(guò)腳本來(lái)來(lái)劃分一下數(shù)據(jù)集。
├── yolov8_dataset└── train└── images (folder including all training images)└── labels (folder including all training labels)└── test└── images (folder including all testing images)└── labels (folder including all testing labels)└── valid└── images (folder including all testing images)└── labels (folder including all testing labels)
具體其實(shí)只要修改路徑就行了,代碼我都做了注釋。
import os
import random
import shutildef copy_files(src_dir, dst_dir, filenames, extension):os.makedirs(dst_dir, exist_ok=True)missing_files = 0for filename in filenames:src_path = os.path.join(src_dir, filename + extension)dst_path = os.path.join(dst_dir, filename + extension)# Check if the file exists before copyingif os.path.exists(src_path):shutil.copy(src_path, dst_path)else:print(f"Warning: File not found for {filename}")missing_files += 1return missing_filesdef split_and_copy_dataset(image_dir, label_dir, output_dir, train_ratio=0.7, valid_ratio=0.15, test_ratio=0.15):# 獲取所有圖像文件的文件名(不包括文件擴(kuò)展名)image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)]# 隨機(jī)打亂文件名列表random.shuffle(image_filenames)# 計(jì)算訓(xùn)練集、驗(yàn)證集和測(cè)試集的數(shù)量total_count = len(image_filenames)train_count = int(total_count * train_ratio)valid_count = int(total_count * valid_ratio)test_count = total_count - train_count - valid_count# 定義輸出文件夾路徑train_image_dir = os.path.join(output_dir, 'train', 'images')train_label_dir = os.path.join(output_dir, 'train', 'labels')valid_image_dir = os.path.join(output_dir, 'valid', 'images')valid_label_dir = os.path.join(output_dir, 'valid', 'labels')test_image_dir = os.path.join(output_dir, 'test', 'images')test_label_dir = os.path.join(output_dir, 'test', 'labels')# 復(fù)制圖像和標(biāo)簽文件到對(duì)應(yīng)的文件夾train_missing_files = copy_files(image_dir, train_image_dir, image_filenames[:train_count], '.jpg')train_missing_files += copy_files(label_dir, train_label_dir, image_filenames[:train_count], '.txt')valid_missing_files = copy_files(image_dir, valid_image_dir, image_filenames[train_count:train_count + valid_count], '.jpg')valid_missing_files += copy_files(label_dir, valid_label_dir, image_filenames[train_count:train_count + valid_count], '.txt')test_missing_files = copy_files(image_dir, test_image_dir, image_filenames[train_count + valid_count:], '.jpg')test_missing_files += copy_files(label_dir, test_label_dir, image_filenames[train_count + valid_count:], '.txt')# Print the count of each datasetprint(f"Train dataset count: {train_count}, Missing files: {train_missing_files}")print(f"Validation dataset count: {valid_count}, Missing files: {valid_missing_files}")print(f"Test dataset count: {test_count}, Missing files: {test_missing_files}")# 使用例子
image_dir = 'datasets/coco128/images/train2017'
label_dir = 'datasets/coco128/labels/train2017'
output_dir = './my_dataset'split_and_copy_dataset(image_dir, label_dir, output_dir)
運(yùn)行完腳本后我們的數(shù)據(jù)集就會(huì)劃分成這個(gè)格式了,現(xiàn)在數(shù)據(jù)準(zhǔn)備工作就徹底完成了,接下來(lái)我們開(kāi)始著手訓(xùn)練模型。
4.配置訓(xùn)練環(huán)境
4.1獲取代碼
git clone https://github.com/ultralytics/ultralytics
針對(duì)網(wǎng)絡(luò)不好的同學(xué),我這里上傳了一份:
鏈接: https://pan.baidu.com/s/1crFGhcmvik-sZJfXY3ixkw?pwd=xma5 提取碼: xma5
4.2安裝環(huán)境
cd ultralytics
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
5.訓(xùn)練模型
5.1新建一個(gè)數(shù)據(jù)集yaml文件
這個(gè)是我新建的,里面寫(xiě)絕對(duì)路徑 (主要是怕出錯(cuò)):
# moncake
train: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\train # train images (relative to 'path') 128 images
val: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\valid # val images (relative to 'path') 128 images
test: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\test # test images (optional)# Classes
names:0: MoonCake
這個(gè)是自帶的,里面寫(xiě)相對(duì)路徑,和我們的寫(xiě)法不同,但是都可以使用,據(jù)我所只還有很多種數(shù)據(jù)集讀取方式:
# coco128
path: ../datasets/coco128 # dataset root dir
train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
names:0: person1: bicycle2: car''''''79: toothbrush
相應(yīng)的數(shù)據(jù)集位置就在這里,我們可以和 coco128
對(duì)比一下,這兩種劃分格式都可以的,這里一定要注意路徑問(wèn)題!
5.2預(yù)測(cè)模型
python
指令推理方式
from ultralytics import YOLO# Load a model
model = YOLO('yolov8n.pt') # load an official model
model = YOLO('path/to/best.pt') # load a custom model# Predict with the model
results = model('https://ultralytics.com/images/bus.jpg') # predict on an image
終端中直接鍵入以下指令就可以實(shí)現(xiàn)對(duì)圖進(jìn)行推理了,推理后如果不指定文件夾,就會(huì)默認(rèn)保存到 runs/detect/predict下。
yolo task=detect mode=predict model=yolov8n.pt source=data/images device=0 save=True
就這張圖來(lái)說(shuō),v8
確實(shí)比v5
牛左上角的標(biāo)志都檢測(cè)出來(lái)了,但是陽(yáng)臺(tái)上的自行車(chē)還是沒(méi)檢測(cè)出來(lái)。
YOLOv8
關(guān)于模型的各種參數(shù)其實(shí)都寫(xiě)到了一起,在ultralytics/yolo/cfg/default.yaml
,這些指令我們就可以實(shí)現(xiàn)各種我們所需的操作。
5.3訓(xùn)練模型
模型訓(xùn)練階段的原理和預(yù)測(cè)步驟一致,都可以直接通過(guò)命令行搞定,關(guān)于這部分參數(shù)依然在ultralytics/yolo/cfg/default,yanl
中,但我們要訓(xùn)練自己的數(shù)據(jù)集時(shí)記得在 data
參數(shù)后指定我們自己的數(shù)據(jù)集 yamL
文件路徑哦。
以下提供兩種指令,分別對(duì)應(yīng)了不同的需求。(這里有一點(diǎn)值得注意,我直接寫(xiě) data=MoonCake.yal
是報(bào)錯(cuò)的! 這個(gè)涉及到一個(gè)坑的問(wèn)題,沒(méi)遇到的同學(xué)暫且忽略)
python
指令訓(xùn)練方式
from ultralytics import YOLO# Load a model
model = YOLO('yolov8n.yaml') # build a new model from YAML
model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt') # build from YAML and transfer weights# Train the model
model.train(data='coco128.yaml', epochs=100, imgsz=640)
在訓(xùn)練過(guò)程中(訓(xùn)練結(jié)束后也可以看》我們可以通過(guò) Tensorboard實(shí)時(shí)查看模型的訓(xùn)練進(jìn)度,只需要在終端中鍵入如下的指令,這個(gè)在我們每次訓(xùn)練時(shí)候都會(huì)有提示:
tensorboard --logdir runs\detect\train2
訓(xùn)練結(jié)束后我們可以查看得到的一些指標(biāo)數(shù)據(jù):
我這里展示一張 PR
曲線(xiàn)圖。
6.驗(yàn)證模型
驗(yàn)證模型同樣是簡(jiǎn)單命令行即可實(shí)現(xiàn),如果沒(méi)有修改中的 ultralytics/yolo/cfg/default,yamL
默認(rèn)值,同樣別忘了指定自己數(shù)據(jù)集的 yaml
,即 data=ultralytics/datasets/MoonCake.yaml
python
指令驗(yàn)證方式
from ultralytics import YOLO# Load a model
model = YOLO('yolov8n.pt') # load an official model
model = YOLO('path/to/best.pt') # load a custom model# Validate the model
metrics = model.val() # no arguments needed, dataset and settings remembered
metrics.box.map # map50-95
metrics.box.map50 # map50
metrics.box.map75 # map75
metrics.box.maps # a list contains map50-95 of each category
同樣的,我們驗(yàn)證完后依然可以得到一個(gè)文件夾:
我們可以看一下檢測(cè)效果:
7.導(dǎo)出模型
python
指令方式導(dǎo)出
from ultralytics import YOLO# Load a model
model = YOLO('yolov8n.pt') # load an official model
model = YOLO('path/to/best.pt') # load a custom trained# Export the model
model.export(format='onnx')
導(dǎo)出有關(guān)的具體參數(shù)如下:
注: TorchScript是PVTorch的模型導(dǎo)出工具。INT8(8位整數(shù)量化)是一種量化方法,可將神經(jīng)網(wǎng)絡(luò)參數(shù)表示為8位整數(shù),以降低存儲(chǔ)和計(jì)算
成本。ONNX(Open NeuralNetwork Exchange) 是一種跨平臺(tái)、開(kāi)放式的機(jī)器學(xué)習(xí)框架。TensorRT是一種用于加速深度學(xué)習(xí)推理的高性能
引擎。CoreML是蘋(píng)果公司推出的機(jī)器學(xué)習(xí)框架。Keras是一種流行的深度學(xué)習(xí)框架。
至此使用 YOLOv8
訓(xùn)練自己的目標(biāo)檢測(cè)數(shù)據(jù)集七大步完結(jié)撒花!!!