0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于YOLOv8的自定義醫(yī)學(xué)圖像分割

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 2023-12-20 10:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

YOLOv8是一種令人驚嘆的分割模型;它易于訓(xùn)練、測(cè)試和部署。在本教程中,我們將學(xué)習(xí)如何在自定義數(shù)據(jù)集上使用YOLOv8。但在此之前,我想告訴你為什么在存在其他優(yōu)秀的分割模型時(shí)應(yīng)該使用YOLOv8呢?

我正在從事與醫(yī)學(xué)圖像分割相關(guān)的項(xiàng)目,當(dāng)我的合作者突然告訴我,我們只有來自175名患者的600張圖像和標(biāo)注。在醫(yī)學(xué)成像領(lǐng)域,這是一個(gè)常見的問題,因?yàn)榕R床醫(yī)生是最忙碌的人,他們有許多職責(zé)。然而,他向我保證,一旦模型訓(xùn)練好(并進(jìn)行微調(diào)),我們將獲得來自其他300多名患者的圖像和標(biāo)注,作為額外的測(cè)試集以評(píng)估我們的模型。

我開始將這50名患者分為訓(xùn)練、測(cè)試和驗(yàn)證數(shù)據(jù)集,使用8010的比例。對(duì)于模型,我首先嘗試了UNet及其變體(ResUNet、Attention UNet、Res-Attention UNet)。這些模型在訓(xùn)練、測(cè)試和驗(yàn)證數(shù)據(jù)集上表現(xiàn)出色,但在額外的測(cè)試集上表現(xiàn)糟糕。然后我想,“讓我們?cè)囋嘫OLOv8;如果有效,那將是很好的,如果不行,那將是一次有趣的學(xué)習(xí)經(jīng)歷?!睅讉€(gè)小時(shí)后,它奏效了,令我驚訝的是,在額外的測(cè)試集上遠(yuǎn)遠(yuǎn)超出了我的預(yù)期。我不能透露具體數(shù)值,因?yàn)檎撐娜栽趯彶橹校以敢夥窒砣绾螌⑵湔{(diào)整為自定義數(shù)據(jù)集,以便你可以節(jié)省大量工作時(shí)間。讓我們開始制定攻略。

攻略

以下是我們將學(xué)習(xí)的主題:

1. YOLOv8簡(jiǎn)介

2. 安裝庫

3. 數(shù)據(jù)集準(zhǔn)備

4. 訓(xùn)練準(zhǔn)備

5. 訓(xùn)練模型

6. 結(jié)果

YOLOv8簡(jiǎn)介

YOLOv8是YOLO系列的最新版本,用于實(shí)時(shí)目標(biāo)檢測(cè),由Ultralytics開發(fā)。它通過引入空間注意力和特征融合等修改來提高準(zhǔn)確性和速度。該架構(gòu)將修改過的CSPDarknet53骨干網(wǎng)絡(luò)與用于處理的先進(jìn)頭部相結(jié)合。這些先進(jìn)之處使YOLOv8成為各種計(jì)算機(jī)視覺任務(wù)的最新選擇。

安裝庫

以下是安裝庫的選項(xiàng)。

# Install the ultralytics package using conda
conda install -c conda-forge ultralytics


or 


# Install the ultralytics package from PyPI
pip install ultralytics

數(shù)據(jù)集準(zhǔn)備

數(shù)據(jù)集需要進(jìn)行兩個(gè)步驟的處理:

步驟1:請(qǐng)按照以下結(jié)構(gòu)組織您的數(shù)據(jù)集(圖像和掩膜):理想情況下,訓(xùn)練、測(cè)試和驗(yàn)證(val)的比例為8010。數(shù)據(jù)集文件夾的安排如下:

dataset
|
|---train
|   |-- images
|   |-- labels 
|   
|---Val
|   |-- images 
|   |-- labels
|
|---test
|   |-- images
|   |-- labels

步驟2:第二步是將 .png(或任何類型)掩膜(標(biāo)簽)轉(zhuǎn)換為所有3個(gè)標(biāo)簽文件夾中的 .txt 文件。以下是將標(biāo)簽(.png、.jpg)轉(zhuǎn)換為 .txt 文件的Python代碼。(您也可以在此操作)

將每個(gè)標(biāo)簽圖像轉(zhuǎn)換為 .txt 文件

import numpy as np
from PIL import Image


import numpy as np
from PIL import Image
from pathlib import Path


def create_label(image_path, label_path):
    # Load the image from the given path and convert it to a NumPy array
    mask = np.asarray(Image.open(image_path))


    # Find the coordinates of non-zero (i.e., not black) pixels in the mask's first channel (assumed to be red)
    rows, cols = np.nonzero(mask[:, :, 0])


    # If no non-zero pixels are found in the mask, return early as there's nothing to label
    if len(rows) == 0:
        return  # Optionally, handle the case of no non-zero pixels as needed


    # Calculate the normalized coordinates by dividing by the respective dimensions of the image
    # This is done to ensure that the coordinates are relative (between 0 and 1) rather than absolute
    normalized_coords = [(col / mask.shape[1], row / mask.shape[0]) for row, col in zip(rows, cols)]


    # Construct a string representing the label data
    # The format starts with '0' (which might represent a class id or similar) followed by pairs of normalized coordinates
    label_line = '0 ' + ' '.join([f'{cord[0]} {cord[1]}' for cord in normalized_coords])


    # Ensure that the directory for the label_path exists, create it if not
    Path(label_path).parent.mkdir(parents=True, exist_ok=True)


    # Open the label file in write mode and write the label_line to it
    with open(label_path, 'w') as f:
        f.write(label_line)






import os


for x in ['train', 'val', 'test']:
    images_dir_path = Path(f'datasets/{x}/labels')
    for img_path in images_dir_path.iterdir():
        if img_path.is_file() and img_path.suffix.lower() in ['.jpg', '.jpeg', '.png', '.bmp']:
            label_path = img_path.parent.parent / 'labels_' / f'{img_path.stem}.txt'
            label_line = create_label(img_path, label_path)
        else:
            print(f"Skipping non-image file: {img_path}")

請(qǐng)注意:在運(yùn)行上述代碼后,請(qǐng)不要忘記從標(biāo)簽文件夾中刪除標(biāo)簽(掩膜)圖像。

訓(xùn)練準(zhǔn)備

為訓(xùn)練創(chuàng)建 'data.yaml' 文件。只需在Python中運(yùn)行下面的代碼,它將為YOLOv8創(chuàng)建 'data.yaml' 文件。

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


names: ['object']
# Hyperparameters ------------------------------------------------------------------------------------------------------
# lr0: 0.01  # initial learning rate (i.e. SGD=1E-2, Adam=1E-3)
# lrf: 0.01  # final learning rate (lr0 * lrf)
# momentum: 0.937  # SGD momentum/Adam beta1
# weight_decay: 0.0005  # optimizer weight decay 5e-4
# warmup_epochs: 3.0  # warmup epochs (fractions ok)
# warmup_momentum: 0.8  # warmup initial momentum
# warmup_bias_lr: 0.1  # warmup initial bias lr
# box: 7.5  # box loss gain
# cls: 0.5  # cls loss gain (scale with pixels)
# dfl: 1.5  # dfl loss gain
# pose: 12.0  # pose loss gain
# kobj: 1.0  # keypoint obj loss gain
# label_smoothing: 0.0  # label smoothing (fraction)
# nbs: 64  # nominal batch size
# hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
# hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
# hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.5  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.2  # image scale (+/- gain)
shear: 0.2  # image shear (+/- deg) from -0.5 to 0.5
perspective: 0.1  # image perspective (+/- fraction), range 0-0.001
flipud: 0.7  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 0.8  # image mosaic (probability)
mixup: 0.1  # image mixup (probability)
# copy_paste: 0.0  # segment copy-paste (probability)
    '''
    
with Path('data.yaml').open('w') as f:
    f.write(yaml_content)

訓(xùn)練模型

一旦數(shù)據(jù)準(zhǔn)備好,其余的非常簡(jiǎn)單,只需運(yùn)行以下代碼。

import matplotlib.pyplot as plt
from ultralytics import YOLO


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


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

d2faa654-9eda-11ee-8b88-92fbcf53809c.jpg

恭喜,你成功了。現(xiàn)在你會(huì)看到一個(gè) 'runs' 文件夾,你可以在其中找到所有的訓(xùn)練矩陣和圖表。

結(jié)果

好,讓我們?cè)跍y(cè)試數(shù)據(jù)上檢查結(jié)果:

model = YOLO("runs/segment/train13/weights/best.pt") # load the model


file = glob.glob('datasets/test/images/*') # let's get the images

現(xiàn)在讓我們?cè)趫D像上運(yùn)行代碼。

# lets run the model over every image
for i in range(len(file)):
    result = model(file[i], save=True, save_txt=True)

將每個(gè) Pred.txt 文件轉(zhuǎn)換為 mask.png

import numpy as np
import cv2


def convert_label_to_image(label_path, image_path):
    # Read the .txt label file
    with open(label_path, 'r') as f:
        label_line = f.readline()


    # Parse the label line to extract the normalized coordinates
    coords = label_line.strip().split()[1:]  # Remove the class label (assuming it's always 0)


    # Convert normalized coordinates to pixel coordinates
    width, height = 256, 256  # Set the dimensions of the output image
    coordinates = [(float(coords[i]) * width, float(coords[i+1]) * height) for i in range(0, len(coords), 2)]
    coordinates = np.array(coordinates, dtype=np.int32)


    # Create a blank image
    image = np.zeros((height, width, 3), dtype=np.uint8)


    # Draw the polygon using the coordinates
    cv2.fillPoly(image, [coordinates], (255, 255, 255))  # Fill the polygon with white color
    print(image.shape)
    # Save the image
    cv2.imwrite(image_path, image)
    print("Image saved successfully.")


# Example usage
label_path = 'runs/segment/predict4/val_labels/img_105.txt'
image_path = 'runs/segment/predict4/val_labels/img_105.jpg'
convert_label_to_image(label_path, image_path)






file = glob.glob('runs/segment/predict11/labels/*.txt')
for i in range(len(file)):
    label_path = file[i]
    image_path = file[i][:-3]+'jpg'
    convert_label_to_image(label_path, image_path)
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3517

    瀏覽量

    50383
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1224

    瀏覽量

    25434
  • 醫(yī)學(xué)圖像分割

    關(guān)注

    0

    文章

    5

    瀏覽量

    887

原文標(biāo)題:基于YOLOv8的自定義醫(yī)學(xué)圖像分割

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于YOLOv8實(shí)現(xiàn)自定義姿態(tài)評(píng)估模型訓(xùn)練

    Hello大家好,今天給大家分享一下如何基于YOLOv8姿態(tài)評(píng)估模型,實(shí)現(xiàn)在自定義數(shù)據(jù)集上,完成自定義姿態(tài)評(píng)估模型的訓(xùn)練與推理。
    的頭像 發(fā)表于 12-25 11:29 ?3510次閱讀
    基于<b class='flag-5'>YOLOv8</b>實(shí)現(xiàn)<b class='flag-5'>自定義</b>姿態(tài)評(píng)估模型訓(xùn)練

    labview調(diào)用yolov8/11目標(biāo)檢測(cè)、分割、分類

    labview使用2020版本64位編輯,調(diào)用yolov8/11的onnx模型案例。 源碼: 通過網(wǎng)盤分享的文件:Labview_cls.zip等4個(gè)文件 鏈接: https
    發(fā)表于 04-21 19:37

    如何修改yolov8分割程序中的kmodel?

    自定義YOLOv8分割類class SegmentationApp(AIBase): def __init__(self,kmodel_path,labels,model_input_size
    發(fā)表于 04-25 08:22

    使用YOLOv8做目標(biāo)檢測(cè)和實(shí)例分割的演示

    YOLOv8是來自Ultralytics的最新的基于YOLO的對(duì)象檢測(cè)模型系列,提供最先進(jìn)的性能。
    的頭像 發(fā)表于 02-06 10:11 ?8402次閱讀

    YOLOv8自定義數(shù)據(jù)集訓(xùn)練到模型部署推理簡(jiǎn)析

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

    TensorRT 8.6 C++開發(fā)環(huán)境配置與YOLOv8實(shí)例分割推理演示

    對(duì)YOLOv8實(shí)例分割TensorRT 推理代碼已經(jīng)完成C++類封裝,三行代碼即可實(shí)現(xiàn)YOLOv8對(duì)象檢測(cè)與實(shí)例分割模型推理,不需要改任何代碼即可支持
    的頭像 發(fā)表于 04-25 10:49 ?6993次閱讀
    TensorRT 8.6 C++開發(fā)環(huán)境配置與<b class='flag-5'>YOLOv8</b>實(shí)例<b class='flag-5'>分割</b>推理演示

    YOLOv8版本升級(jí)支持小目標(biāo)檢測(cè)與高分辨率圖像輸入

    YOLOv8版本最近版本又更新了,除了支持姿態(tài)評(píng)估以外,通過模型結(jié)構(gòu)的修改還支持了小目標(biāo)檢測(cè)與高分辨率圖像檢測(cè)。原始的YOLOv8模型結(jié)構(gòu)如下。
    的頭像 發(fā)表于 05-16 11:14 ?1.4w次閱讀
    <b class='flag-5'>YOLOv8</b>版本升級(jí)支持小目標(biāo)檢測(cè)與高分辨率<b class='flag-5'>圖像</b>輸入

    在AI愛克斯開發(fā)板上用OpenVINO?加速YOLOv8-seg實(shí)例分割模型

    《在 AI 愛克斯開發(fā)板上用 OpenVINO 加速 YOLOv8 目標(biāo)檢測(cè)模型》介紹了在 AI 愛克斯開發(fā)板上使用 OpenVINO 開發(fā)套件部署并測(cè)評(píng) YOLOv8 的目標(biāo)檢測(cè)模型,本文將介紹在 AI 愛克斯開發(fā)板上使用 OpenVINO 加速
    的頭像 發(fā)表于 06-05 11:52 ?1453次閱讀
    在AI愛克斯開發(fā)板上用OpenVINO?加速<b class='flag-5'>YOLOv8</b>-seg實(shí)例<b class='flag-5'>分割</b>模型

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

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

    解鎖YOLOv8修改+注意力模塊訓(xùn)練與部署流程

    很多人也想跟修改YOLOv5源碼一樣的方式去修改YOLOv8的源碼,但是在github上面卻發(fā)現(xiàn)找到的YOLOv8項(xiàng)目下面TAG分支是空的
    的頭像 發(fā)表于 08-11 14:14 ?5362次閱讀
    解鎖<b class='flag-5'>YOLOv8</b>修改+注意力模塊訓(xùn)練與部署流程

    如何修改YOLOv8的源碼

    很多人也想跟修改YOLOv5源碼一樣的方式去修改YOLOv8的源碼,但是在github上面卻發(fā)現(xiàn)找到的YOLOv8項(xiàng)目下面TAG分支是空的,然后就直接從master/main下面把源碼克隆出來一通
    的頭像 發(fā)表于 09-04 10:02 ?2604次閱讀
    如何修改<b class='flag-5'>YOLOv8</b>的源碼

    用自己的數(shù)據(jù)集訓(xùn)練YOLOv8實(shí)例分割模型

    YOLOv8 于 2023 年 1 月 10 日推出。截至目前,這是計(jì)算機(jī)視覺領(lǐng)域分類、檢測(cè)和分割任務(wù)的最先進(jìn)模型。該模型在準(zhǔn)確性和執(zhí)行時(shí)間方面都優(yōu)于所有已知模型。
    的頭像 發(fā)表于 11-10 16:44 ?5824次閱讀
    用自己的數(shù)據(jù)集訓(xùn)練<b class='flag-5'>YOLOv8</b>實(shí)例<b class='flag-5'>分割</b>模型

    YOLOv8實(shí)現(xiàn)旋轉(zhuǎn)對(duì)象檢測(cè)

    YOLOv8框架在在支持分類、對(duì)象檢測(cè)、實(shí)例分割、姿態(tài)評(píng)估的基礎(chǔ)上更近一步,現(xiàn)已經(jīng)支持旋轉(zhuǎn)對(duì)象檢測(cè)(OBB),基于DOTA數(shù)據(jù)集,支持航拍圖像的15個(gè)類別對(duì)象檢測(cè),包括車輛、船只、典型各種場(chǎng)地等。包含2800多張
    的頭像 發(fā)表于 01-11 10:43 ?2567次閱讀
    <b class='flag-5'>YOLOv8</b>實(shí)現(xiàn)旋轉(zhuǎn)對(duì)象檢測(cè)

    RK3576 yolov8訓(xùn)練部署教程

    本章展示yolov8模型的在EASY EAI Orin nano的部署過程。
    的頭像 發(fā)表于 04-02 16:04 ?442次閱讀
    RK3576 <b class='flag-5'>yolov8</b>訓(xùn)練部署教程

    RV1126 yolov8訓(xùn)練部署教程

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 號(hào)開源的基于YOLOV5進(jìn)行更新的 下一個(gè)重大更新版本,目前支持圖像分類、物體檢測(cè)和實(shí)例分割任務(wù),鑒于
    的頭像 發(fā)表于 04-16 14:53 ?473次閱讀
    RV1126 <b class='flag-5'>yolov8</b>訓(xùn)練部署教程

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品