色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用自己的數據集訓練YOLOv8實例分割模型

新機器視覺 ? 來源:新缸中之腦 ? 2023-11-10 16:44 ? 次閱讀

YOLOv8 于 2023 年 1 月 10 日推出。截至目前,這是計算機視覺領域分類、檢測和分割任務的最先進模型。該模型在準確性和執行時間方面都優于所有已知模型。

77d62b5a-7f03-11ee-939d-92fbcf53809c.png

與之前的所有 YOLO 模型相比,ultralytics 團隊在使該模型更易于使用方面做得非常好 — 你甚至不必再克隆 git 存儲庫!

01創建圖像數據集

在這篇文章中,我創建了一個非常簡單的示例,展示了在數據上訓練 YOLOv8 所需執行的所有操作,特別是針對分割任務。數據集很小,并且模型“易于學習”,這樣我們就可以在簡單的 CPU 上訓練幾秒鐘后得到令人滿意的結果。

我們將創建一個黑色背景白色圓圈的數據集。圓圈的大小各不相同。我們將訓練一個模型來分割圖像內的圓圈。

數據集如下所示:

數據集是使用以下代碼生成的:

import numpy as np
from PIL import Image
from skimage import draw
import random
from pathlib import Path

def create_image(path, img_size, min_radius):
    path.parent.mkdir( parents=True, exist_ok=True )
    
    arr = np.zeros((img_size, img_size)).astype(np.uint8)
    center_x = random.randint(min_radius, (img_size-min_radius))
    center_y = random.randint(min_radius, (img_size-min_radius))
    max_radius = min(center_x, center_y, img_size - center_x, img_size - center_y)
    radius = random.randint(min_radius, max_radius)

    row_indxs, column_idxs = draw.ellipse(center_x, center_y, radius, radius, shape=arr.shape)
    
    arr[row_indxs, column_idxs] = 255

    im = Image.fromarray(arr)
    im.save(path)

def create_images(data_root_path, train_num, val_num, test_num, img_size=640, min_radius=10):
    data_root_path = Path(data_root_path)
    
    for i in range(train_num):
        create_image(data_root_path / 'train' / 'images' / f'img_{i}.png', img_size, min_radius)
        
    for i in range(val_num):
        create_image(data_root_path / 'val' / 'images' / f'img_{i}.png', img_size, min_radius)
        
    for i in range(test_num):
        create_image(data_root_path / 'test' / 'images' / f'img_{i}.png', img_size, min_radius)

create_images('datasets', train_num=120, val_num=40, test_num=40, img_size=120, min_radius=10)

02創建標簽

現在有了圖像數據集,我們需要為圖像創建標簽。通常,需要為此做一些手動工作,但由于我們創建的數據集非常簡單,因此創建生成標簽的代碼非常容易:

from rasterio import features

def create_label(image_path, label_path):
    arr = np.asarray(Image.open(image_path))

    # There may be a better way to do it, but this is what I have found so far
    cords = list(features.shapes(arr, mask=(arr >0)))[0][0]['coordinates'][0]
    label_line = '0 ' + ' '.join([f'{int(cord[0])/arr.shape[0]} {int(cord[1])/arr.shape[1]}' for cord in cords])

    label_path.parent.mkdir( parents=True, exist_ok=True )
    with label_path.open('w') as f:
        f.write(label_line)

for images_dir_path in [Path(f'datasets/{x}/images') for x in ['train', 'val', 'test']]:
    for img_path in images_dir_path.iterdir():
        label_path = img_path.parent.parent / 'labels' / f'{img_path.stem}.txt'
        label_line = create_label(img_path, label_path)

以下是標簽文件內容的示例:

0 0.0767 0.08433 0.1417 0.08433 0.1417 0.0917 0.15843 0.0917 0.15843 0.1 0.1766 0.1 0.1766 0.10844 0.175 0.10844 0.175 0.1177 0.18432 0.1177 0.18432 0.14333 0.1918 0.14333 0.1918 0.20844 0.18432 0.20844 0.18432 0.225 0.175 0.225 0.175 0.24334 0.1766 0.24334 0.1766 0.2417 0.15843 0.2417 0.15843 0.25 0.1417 0.25 0.1417 0.25846 0.0767 0.25846 0.0767 0.25 0.05 0.25 0.05 0.2417 0.04174 0.2417 0.04174 0.24334 0.04333 0.24334 0.04333 0.225 0.025 0.225 0.025 0.20844 0.01766 0.20844 0.01766 0.14333 0.025 0.14333 0.025 0.1177 0.04333 0.1177 0.04333 0.10844 0.04174 0.10844 0.04174 0.1 0.05 0.1 0.05 0.0917 0.0767 0.0917 0.0767 0.08433

標簽對應于該圖像:

標簽內容只是一個文本行。每張圖像中只有一個對象(圓圈),每個對象在文件中由一行表示。如果每張圖像中有多個對象,則應為每個標記的對象創建一條線。

第一個 0 代表標簽的類別類型。因為我們只有一種類類型(圓形),所以總是 0。如果數據中有多個類,則應該將每個類映射到一個數字(0、1、2…),并在標簽文件中使用該數字。

所有其他數字表示標記對象的邊界多邊形的坐標。格式為 并且坐標相對于圖像的大小 - 您應該將坐標標準化為 1x1 圖像大小。例如,如果有一個點 (15, 75) 并且圖像大小為 120x120,則歸一化點為 (15/120, 75/120) = (0.125, 0.625)。

在處理圖像庫時獲取坐標的正確方向性總是令人困惑。所以為了明確這一點,對于YOLO來說,X坐標是從左到右,Y坐標是從上到下。

03YAML 配置

我們有了圖像和標簽。現在需要使用數據集配置創建一個 YAML 文件:

yaml_content = f'''
train: train/images
val: val/images
test: test/images

names: ['circle']
    '''
    
with Path('data.yaml').open('w') as f:
    f.write(yaml_content)

請注意,如果你有更多對象類類型,則需要按照在標簽文件中的順序將它們添加到名稱數組中。第一個是 0,第二個是 1,等等...

04數據集文件結構

讓我們看看使用 Linux 樹命令創建的文件結構:

tree .
data.yaml
datasets/
├── test
│   ├── images
│   │   ├── img_0.png
│   │   ├── img_1.png
│   │   ├── img_2.png
│   │   ├── ...
│   └── labels
│       ├── img_0.txt
│       ├── img_1.txt
│       ├── img_2.txt
│       ├── ...
├── train
│   ├── images
│   │   ├── img_0.png
│   │   ├── img_1.png
│   │   ├── img_2.png
│   │   ├── ...
│   └── labels
│       ├── img_0.txt
│       ├── img_1.txt
│       ├── img_2.txt
│       ├── ...
|── val
|   ├── images
│   │   ├── img_0.png
│   │   ├── img_1.png
│   │   ├── img_2.png
│   │   ├── ...
|   └── labels
│       ├── img_0.txt
│       ├── img_1.txt
│       ├── img_2.txt
│       ├── ...

05訓練模型

現在我們有了圖像和標簽,可以開始訓練模型了。首先讓我們安裝這個包:

pip install ultralytics==8.0.38

ultralytics 庫變化非常快,有時會破壞 API,所以我更喜歡堅持使用一個版本。下面的代碼取決于版本 8.0.38(我寫這篇文章時的最新版本)。如果你升級到較新的版本,也許需要進行一些代碼調整才能使其正常工作。

開始訓練:

from ultralytics import YOLO

model = YOLO("yolov8n-seg.pt")

results = model.train(
        batch=8,
        device="cpu",
        data="data.yaml",
        epochs=7,
        imgsz=120,
    )

為了這篇文章的簡單性,我使用 Nano 模型 (yolov8n-seg),我僅在 CPU 上訓練它,只有 7 個 epoch。在我的筆記本電腦上進行訓練只花了幾秒鐘。

有關可用于訓練模型的參數的更多信息,你可以點擊這里查看。

06理解結果

訓練完成后,你將在輸出末尾看到與此類似的一行:

Results saved to runs/segment/train60

讓我們看一下此處找到的一些結果:

驗證標注:

from IPython.display import Image as show_image
show_image(filename="runs/segment/train60/val_batch0_labels.jpg")

在這里我們可以看到驗證集部分的真實標注。這應該幾乎完全對齊。如果你發現這些標注沒有很好地覆蓋物體,那么標注很可能是不正確的。

預測的驗證標簽:

show_image(filename="runs/segment/train60/val_batch0_pred.jpg")

在這里,我們可以看到訓練模型對部分驗證集(與我們上面看到的相同部分)所做的預測。這可以讓你了解模型的表現如何。請注意,為了創建此圖像,應選擇置信度閾值,此處使用的閾值是 0.5,這并不總是最佳閾值(我們將在稍后討論)。

精度曲線:

要理解這張圖表和下一張圖表,你需要熟悉精確度和召回率概念。這里很好地解釋了它們的工作原理

show_image(filename="runs/segment/train60/MaskP_curve.png")

7862c42a-7f03-11ee-939d-92fbcf53809c.png

模型檢測到的每個對象都有一定的置信度,通常,如果在聲明“這是一個圓”時盡可能確定對你來說很重要,你將僅使用高置信度值(高置信度閾值)。當然,這需要權衡——你可能會錯過一些“圈子”。另一方面,如果你想“捕獲”盡可能多的“圓圈”,但要權衡其中一些不是真正的“圓圈”,可以同時使用低置信度值和高置信度值(低置信度閾值)。

上圖(以及下圖)可幫助你決定使用哪個置信閾值。在我們的例子中,我們可以看到,對于高于 0.128 的閾值,我們獲得 100% 的精度,這意味著所有對象都被正確預測。

請注意,因為我們實際上是在做分割任務,所以我們需要擔心另一個重要的閾值——IoU(交并集),如果你不熟悉,你可以在這里閱讀介紹文章。對于此圖表,使用的 IoU 為 0.5。

召回曲線:

show_image(filename="runs/segment/train60/MaskR_curve.png")
788a35aa-7f03-11ee-939d-92fbcf53809c.png ? ?

在這里你可以看到召回率圖表,隨著置信度閾值的上升,召回率下降。這意味著你“抓住”的“圓圈”更少。

在這里你可以明白為什么在這種情況下使用 0.5 置信度閾值是一個壞主意。對于 0.5 的閾值,可以獲得大約 90% 的召回率。然而,在精度曲線中,我們看到對于高于 0.128 的閾值,我們獲得 100% 的精度,因此我們不需要達到 0.5,我們可以安全地使用 0.128 閾值并獲得 100% 的精度和幾乎 100% 記起 :)

精確率-召回率曲線:

這是精確率-召回率曲線的一個很好的解釋

show_image(filename="runs/segment/train60/MaskPR_curve.png")
78a1468c-7f03-11ee-939d-92fbcf53809c.png ?

這里我們可以清楚地看到之前得出的結論,對于這個模型,我們可以達到幾乎 100% 的精確率和 100% 的召回率。

這個圖表的缺點是我們看不到應該使用什么閾值,這就是為什么我們仍然需要上面的圖表。

隨時間的推移損失

show_image(filename="runs/segment/train60/results.png")
78bae54c-7f03-11ee-939d-92fbcf53809c.png ?

在這里,你可以看到不同損失在訓練過程中如何變化,以及它們在每個時期后在驗證集上的表現如何。

關于損失,以及可以從這些圖表中得出的結論,有很多話要說,但是,這超出了本文的范圍。我只是想說你可以在這里找到它:)

07使用訓練好的模型

可以在結果目錄中找到的另一件事是模型本身。以下是如何在新圖像上使用該模型:

my_model = YOLO('runs/segment/train60/weights/best.pt')
results = list(my_model('datasets/test/images/img_5.png', conf=0.128))
result = results[0]

結果列表可能有多個值,每個值對應一個檢測到的對象。因為在此示例中,每個圖像中只有一個對象,所以我們采用第一個列表項。

你可以看到我在這里傳遞了我們之前找到的最佳置信度閾值 (0.128)。

有兩種方法可以獲取檢測到的對象在圖像中的實際位置。選擇正確的方法取決于你打算如何處理結果。我將展示這兩種方式。

result.masks.segments
[array([[    0.10156,     0.34375],
        [    0.09375,     0.35156],
        [    0.09375,     0.35937],
        [   0.078125,       0.375],
        [   0.070312,       0.375],
        [     0.0625,     0.38281],
        [    0.38281,     0.71094],
        [    0.39062,     0.71094],
        [    0.39844,     0.70312],
        [    0.39844,     0.69531],
        [    0.41406,     0.67969],
        [    0.42187,     0.67969],
        [    0.44531,     0.46875],
        [    0.42969,     0.45312],
        [    0.42969,     0.41406],
        [    0.42187,     0.40625],
        [    0.41406,     0.40625],
        [    0.39844,     0.39062],
        [    0.39844,     0.38281],
        [    0.39062,       0.375],
        [    0.38281,       0.375],
        [    0.35156,     0.34375]], dtype=float32)]

這將返回對象的邊界多邊形,類似于我們傳遞標記數據的格式。

第二種方式:

result.masks.masks
tensor([[[0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         ...,
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.]]])

這將返回一個形狀為 (1, 128, 128) 的張量,表示圖像中的所有像素。作為對象一部分的像素接收 1,背景像素接收 0。

我們來看看面具是什么樣子的:

import torchvision.transforms as T
T.ToPILImage()(result.masks.masks).show()

圖像的預測分割

這是原始圖像:

雖然并不完美,但對于很多應用來說已經足夠好了,而且 IoU 肯定高于 0.5。

08結束語

總之,與之前的 Yolo 版本相比,新的 ultralytics 庫更容易使用,尤其是對于分割任務,它現在是一等公民。你可以發現 Yolov5 也是 ultralytics 新軟件包的一部分,所以如果你不想使用新的 Yolo 版本(它仍然是新的和實驗性的),你可以使用眾所周知的 yolov5:

790dd072-7f03-11ee-939d-92fbcf53809c.png

轉自新缸中之腦

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11320

    瀏覽量

    209832
  • 命令
    +關注

    關注

    5

    文章

    688

    瀏覽量

    22055
  • 模型
    +關注

    關注

    1

    文章

    3261

    瀏覽量

    48916
  • 數據集
    +關注

    關注

    4

    文章

    1208

    瀏覽量

    24737

原文標題:用自己的數據集訓練YOLOv8實例分割模型

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于YOLOv8實現自定義姿態評估模型訓練

    Hello大家好,今天給大家分享一下如何基于YOLOv8姿態評估模型,實現在自定義數據集上,完成自定義姿態評估模型訓練與推理。
    的頭像 發表于 12-25 11:29 ?2871次閱讀
    基于<b class='flag-5'>YOLOv8</b>實現自定義姿態評估<b class='flag-5'>模型</b><b class='flag-5'>訓練</b>

    使用YOLOv8做目標檢測和實例分割的演示

    YOLOv8是來自Ultralytics的最新的基于YOLO的對象檢測模型系列,提供最先進的性能。
    的頭像 發表于 02-06 10:11 ?7543次閱讀

    YOLOv8自定義數據集訓練模型部署推理簡析

    如果你只是想使用而不是開發,強烈推薦通過pip安裝方式獲取YOLOv8包!YOLOv8安裝命令行
    的頭像 發表于 03-24 09:27 ?4705次閱讀

    TensorRT 8.6 C++開發環境配置與YOLOv8實例分割推理演示

    YOLOv8實例分割TensorRT 推理代碼已經完成C++類封裝,三行代碼即可實現YOLOv8對象檢測與實例
    的頭像 發表于 04-25 10:49 ?5861次閱讀
    TensorRT 8.6 C++開發環境配置與<b class='flag-5'>YOLOv8</b><b class='flag-5'>實例</b><b class='flag-5'>分割</b>推理演示

    在AI愛克斯開發板上OpenVINO?加速YOLOv8分類模型

    本系列文章將在 AI 愛克斯開發板上使用 OpenVINO 開發套件依次部署并測評 YOLOv8 的分類模型、目標檢測模型實例分割
    的頭像 發表于 05-05 11:47 ?1068次閱讀
    在AI愛克斯開發板上<b class='flag-5'>用</b>OpenVINO?加速<b class='flag-5'>YOLOv8</b>分類<b class='flag-5'>模型</b>

    在AI愛克斯開發板上OpenVINO?加速YOLOv8目標檢測模型

    《在 AI 愛克斯開發板上 OpenVINO 加速 YOLOv8 分類模型》介紹了在 AI 愛克斯開發板上使用 OpenVINO 開發套件部署并測評 YOLOv8 的分類
    的頭像 發表于 05-12 09:08 ?1341次閱讀
    在AI愛克斯開發板上<b class='flag-5'>用</b>OpenVINO?加速<b class='flag-5'>YOLOv8</b>目標檢測<b class='flag-5'>模型</b>

    AI愛克斯開發板上使用OpenVINO加速YOLOv8目標檢測模型

    《在AI愛克斯開發板上OpenVINO加速YOLOv8分類模型》介紹了在AI愛克斯開發板上使用OpenVINO 開發套件部署并測評YOLOv8的分類
    的頭像 發表于 05-26 11:03 ?1263次閱讀
    AI愛克斯開發板上使用OpenVINO加速<b class='flag-5'>YOLOv8</b>目標檢測<b class='flag-5'>模型</b>

    在AI愛克斯開發板上OpenVINO?加速YOLOv8-seg實例分割模型

    《在 AI 愛克斯開發板上 OpenVINO 加速 YOLOv8 目標檢測模型》介紹了在 AI 愛克斯開發板上使用 OpenVINO 開發套件部署并測評 YOLOv8 的目標檢測
    的頭像 發表于 06-05 11:52 ?1030次閱讀
    在AI愛克斯開發板上<b class='flag-5'>用</b>OpenVINO?加速<b class='flag-5'>YOLOv8</b>-seg<b class='flag-5'>實例</b><b class='flag-5'>分割</b><b class='flag-5'>模型</b>

    教你如何用兩行代碼搞定YOLOv8各種模型推理

    大家好,YOLOv8 框架本身提供的API函數是可以兩行代碼實現 YOLOv8 模型推理,這次我把這段代碼封裝成了一個類,只有40行代碼左右,可以同時支持YOLOv8對象檢測、
    的頭像 發表于 06-18 11:50 ?3087次閱讀
    教你如何用兩行代碼搞定<b class='flag-5'>YOLOv8</b>各種<b class='flag-5'>模型</b>推理

    在AI愛克斯開發板上OpenVINO?加速YOLOv8-seg實例分割模型

    《在 AI 愛克斯開發板上 OpenVINO 加速 YOLOv8 目標檢測模型》介紹了在 AI 愛克斯開發板上使用 OpenVINO 開發套件部署并測評 YOLOv8 的目標檢測
    的頭像 發表于 06-30 10:43 ?952次閱讀
    在AI愛克斯開發板上<b class='flag-5'>用</b>OpenVINO?加速<b class='flag-5'>YOLOv8</b>-seg<b class='flag-5'>實例</b><b class='flag-5'>分割</b><b class='flag-5'>模型</b>

    三種主流模型部署框架YOLOv8推理演示

    深度學習模型部署有OpenVINO、ONNXRUNTIME、TensorRT三個主流框架,均支持Python與C++的SDK使用。對YOLOv5~YOLOv8的系列模型,均可以通過C+
    的頭像 發表于 08-06 11:39 ?2765次閱讀

    YOLOv8實現任意目錄下命令行訓練

    當你使用YOLOv8命令行訓練模型的時候,如果當前執行的目錄下沒有相關的預訓練模型文件,YOLOv8
    的頭像 發表于 09-04 10:50 ?1134次閱讀
    <b class='flag-5'>YOLOv8</b>實現任意目錄下命令行<b class='flag-5'>訓練</b>

    基于YOLOv8的自定義醫學圖像分割

    YOLOv8是一種令人驚嘆的分割模型;它易于訓練、測試和部署。在本教程中,我們將學習如何在自定義數據集上使用
    的頭像 發表于 12-20 10:51 ?796次閱讀
    基于<b class='flag-5'>YOLOv8</b>的自定義醫學圖像<b class='flag-5'>分割</b>

    YOLOv8實現旋轉對象檢測

    YOLOv8框架在在支持分類、對象檢測、實例分割、姿態評估的基礎上更近一步,現已經支持旋轉對象檢測(OBB),基于DOTA數據集,支持航拍圖像的15個類別對象檢測,包括車輛、船只、典型
    的頭像 發表于 01-11 10:43 ?1892次閱讀
    <b class='flag-5'>YOLOv8</b>實現旋轉對象檢測

    YOLOv8中的損失函數解析

    YOLO長期以來一直是目標檢測任務的首選模型之一。它既快速又準確。此外,其API簡潔易用。運行訓練或推斷作業所需的代碼行數有限。在2023年下半年,YOLOv8在框架中引入了姿態估計后,該框架現在支持最多四個任務,包括分類、目標
    的頭像 發表于 11-05 17:15 ?1124次閱讀
    <b class='flag-5'>YOLOv8</b>中的損失函數解析
    主站蜘蛛池模板: 亚洲午夜久久影院| 久久天堂网| 亚洲国产成人精品无码区5566| 久久影院一区| 国产精品视频大全| 99国产精品久久人妻| 亚洲 欧美 制服 视频二区| 内射白嫩少妇超碰| 精品一区二区三区高清免费观看| 第一次破女初国产美女| 真实国产精品视频国产网| 网友自拍偷拍| 欧美一道本一区二区三区| 九九在线免费视频| 国产精品单位女同事在线| av淘宝 在线观看| 在线观看亚洲专区5555| 亚洲国产在线视频精品| 使劲别停好大好深好爽动态图| 男人扒开添女人屁股| 久久婷婷久久一区二区三区| 国产亚洲精品久久孕妇呦呦你懂| 攵女yin乱合集高h| chinesedaddy80老年人| 2020年国产理论| 永久adc视频年龄确认| 亚洲精品视频久久| 西西人体一级裸片| 日本无码色哟哟婷婷最新网站 | 精品久久久无码21P发布| 国产高清亚洲日韩字幕一区| 大乳牛奶女magnet| 被老头下药玩好爽| 97色伦久久视频在观看| 中文字幕国产在线观看| 在线观看亚洲免费视频| 一个人免费完整观看日本| 亚洲一区日韩一区欧美一区a| 亚洲人成网77777色在线播放| 亚洲精品无码AV中文字幕蜜桃| 亚洲99精品A片久久久久久|