Posted on

資料增強好工具 – Albumentations

官方資訊

GITHUB: https://github.com/albumentations-team/albumentations

官方文檔: https://albumentations.ai/docs/getting_started/transforms_and_targets/

官方範例: https://github.com/albumentations-team/albumentations_examples/blob/master/notebooks/pytorch_semantic_segmentation.ipynb

Albumentations介紹

Albumentations 是一個流行的計算機視覺數據增強庫,專門設計用於圖像分類、目標檢測、分割等任務。它提供了豐富的圖像增強技術,可以幫助您在訓練深度學習模型時提升模型的性能和魯棒性。 Albumentations 支持多種常用的深度學習框架,如PyTorch和TensorFlow。

以下是 Albumentations 的一些特點和功能:

  • 多樣的增強技術: Albumentations 提供了大量的圖像增強技術,包括但不限於旋轉、翻轉、裁剪、縮放、亮度調整、對比度調整、顏色變換、模糊效果、噪聲添加等。
  • 高性能: Albumentations 以速度和內存效率為目標,因此它在圖像增強方面表現出色。這使得您能夠在訓練過程中高效地應用增強,不會成為訓練的瓶頸。
  • 靈活性: 您可以通過組合不同的增強操作來構建自定義的數據增強流水線。這使得您能夠根據任務和數據集的特點選擇適合的增強操作。
  • 易於集成: Albumentations 支持多種主流深度學習框架,可以方便地與您的模型訓練流程集成,無需複雜的配置。
  • 實時預覽: Albumentations 提供了實時預覽功能,可以在應用增強之前查看圖像的效果,以確保增強操作設置正確。
  • 多線程支持: 對於大規模數據集,Albumentations 支持多線程應用增強,加速數據準備過程。
  • 大量示例: Albumentations 提供了豐富的示例和文檔,幫助您了解每個增強操作的用法和效果。

使用範例

以下是一個使用 Albumentations 的簡單示例,演示如何將一些常見的增強操作應用於圖像數據:

https://github.com/albumentations-team/albumentations_examples/blob/master/notebooks/pytorch_semantic_segmentation.ipynb

import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
import matplotlib.pyplot as plt

# 示例图像路径
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 定义增强操作
transform = A.Compose([
    A.Resize(width=256, height=256),
    A.HorizontalFlip(p=0.5),
    A.VerticalFlip(p=0.5),
    A.Rotate(limit=30, p=0.5),
    A.RandomBrightnessContrast(p=0.2),
    A.Normalize(),
    ToTensorV2(),
])

# 应用增强
transformed_image = transform(image=image)['image']

# 可视化原始图像和增强后的图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title('Original Image')

plt.subplot(1, 2, 2)
plt.imshow(transformed_image[0])  # 转换后的图像是 PyTorch 张量,选择通道 0 进行显示
plt.title('Transformed Image')
plt.show()

Posted on

把標記轉成YOLO格式 – JSON2YOLO

JSON2YOLO介紹

官方網站: https://github.com/ultralytics/JSON2YOLO

JSON2YOLO 是一個用於將JSON格式標註數據轉換為YOLO格式標註數據的工具。 YOLO(You Only Look Once)是一種流行的目標檢測算法,它能夠在單次前向傳遞中同時預測圖像中的多個目標邊界框和類別。

在計算機視覺中,標註數據用於告知模型在圖像中的哪些位置存在目標以及目標的類別。 JSON和YOLO是兩種常用的標註數據格式,其中JSON通常用於描述目標的邊界框和類別,而YOLO格式則將目標的邊界框和類別信息結合在一起,以便更有效地訓練目標檢測模型。

JSON2YOLO 工具的主要目的是簡化將JSON格式標註數據轉換為YOLO格式標註數據的過程。通常,這種轉換涉及將目標的邊界框坐標映射到YOLO格式的網格單元,並將類別信息進行編碼。這使得標註數據能夠更好地適應YOLO模型的訓練和預測需求。

何時會需要做格式轉換

當我們使用別人的資料集,很有可能別人並不是使用YOLO格式去輸出資料集的,如果我們想要使用YOLO做訓練,勢必就得做標註資料的轉換,針對YOLO的狀況,就會需要使用這個轉換工具來將其他格式轉為YOLO標記格式

或者像是roboflow支持的輸出格式並不包含YOLO semgemt,所以也會需要先下載一般JSON格式的標記,再使用這個工具來做轉換

Roboflow支持的輸出格式

如何使用

接著再呼叫JSON2YOLO-master>python general_json2yolo.py

轉換好的資料就會出現在new_dir

Posted on

好用的線上標記工具-Roboflow

Roboflow介紹

官網: https://roboflow.com/

文檔: https://docs.roboflow.com/

Roboflow 是一個用於計算機視覺項目的平台,它旨在幫助開發人員和團隊更輕鬆地構建、訓練和部署計算機視覺模型。 Roboflow 提供了一系列工具和功能,使您能夠有效地處理圖像數據、訓練機器學習模型,並將這些模型集成到您的應用程序中。以下是 Roboflow 的一些主要特點和功能:

  • 數據預處理和清理: Roboflow 提供了數據預處理工具,可以幫助您對圖像數據進行清理、轉換和增強,以提高模型的訓練質量和性能。
  • 數據標註和註釋: 為了訓練計算機視覺模型,您需要標註圖像中的對象和特徵。 Roboflow 提供了圖像標註工具,可幫助您在圖像上繪製邊界框、進行分類標籤等操作。
  • 模型訓練: 您可以使用 Roboflow 訓練您的計算機視覺模型,選擇適當的架構並使用您的數據進行訓練。 Roboflow 支持多種常見的深度學習框架,如TensorFlow和PyTorch。
  • 模型評估和優化: 在訓練完成後,您可以使用 Roboflow 的評估工具來檢查模型在測試數據集上的表現,並進行模型的調優。
  • 模型部署: Roboflow 提供了將訓練好的模型部署到不同環境的選項,包括本地環境、移動設備和雲端。
  • 集成和 API: 您可以使用 Roboflow 的 API 將計算機視覺能力集成到您的應用程序中,以便自動處理圖像數據和執行預測。
  • 教程和資源: Roboflow 提供了豐富的教程、文檔和資源,幫助您了解計算機視覺的基礎知識和最佳實踐。

可讓團隊於線上共同標記圖片

這個功能是我覺得Roboflow大勝labelImg的原因,當團隊有很多人要負責標記時,這個工具可以非常方便的檢視、確認、共同標記。

可匯入現有的資料集及標記

Roboflow可以直接匯入以標記好的檔案,可以在線上去觀察以標記的資料的標記樣態,這些都是labelImg沒有辦法做到的,我們可以直接把含有標記和圖片的資料夾拉近網頁裡面,他會問你是否資料夾內的檔案全部放入,選擇Upload

就會可以看到已經標記好的狀況,我覺得這個功能在使用別人標記的圖檔時非常重要,才可以知道別人是如何去標記圖片的

線上做資料增強

Roboflow 提供了豐富的在線數據增強工具,用於處理圖像數據,改善數據集的多樣性,提高模型的泛化能力。數據增強是在保持圖像語義信息的前提下,通過應用各種變換和處理來生成多樣性的圖像,從而增加模型對於不同場景的適應能力。以下是 Roboflow 在線數據增強工具的一些功能和特點:

  • 旋轉和翻轉: 您可以輕鬆地對圖像進行旋轉、水平翻轉和垂直翻轉,從而生成不同角度和方向的圖像。
  • 縮放和裁剪: Roboflow 允許您調整圖像的尺寸、剪裁圖像以及生成不同分辨率的圖像,以增加模型對於不同大小的物體和場景的適應能力。
  • 亮度和對比度調整: 您可以調整圖像的亮度、對比度和飽和度,從而改變圖像的外觀和光照條件。
  • 噪聲和擾動: 添加噪聲、模糊效果和其他擾動可以幫助模型更好地應對真實世界中的噪聲和不確定性。
  • 顏色變換: 改變圖像的色彩分佈、色調和色溫,使模型能夠在不同的環境下進行準確的預測。
  • 隨機變換: Roboflow 提供了隨機化參數,可以在每次增強時以隨機方式應用不同的變換,從而生成更多樣化的數據。
  • 多模態增強: 對於多通道圖像(如RGB圖像),您可以單獨處理每個通道,或者應用通道之間的特定變換,以增加數據的多樣性。
  • 實時預覽: 在進行數據增強時,Roboflow 提供實時預覽功能,讓您可以在應用增強之前查看變換後的圖像。
  • 保存和導出: 您可以保存增強後的圖像,以便後續在模型訓練中使用。 Roboflow支持將增強後的數據導出到各種格式,如Yolo、COCO等。

按Generate可以做圖像預處理並選擇資料增強的方法,不過這邊圖片要輸出的若太多,就會要升級方案,免費方案沒辦法輸出破千張

線上建模

選擇Deploy頁籤,可以線上建模,並可以看到在測試資料及上的偵測狀況,我覺得最酷的是這一切都完全使用點、按就可以達成,完全no code

Posted on

Yolov8 – 物件偵測模型

模型介紹

GitHub位置: https://github.com/ultralytics/ultralytics

官方網站: https://ultralytics.com/

YOLOv8 最初由 Ultralytics 公司的開發人員開發和發布,旨在在目標檢測任務中提供高性能和高效率的解決方案。 基於深度學習和計算機視覺領域的前沿進步而構建,在速度和準確性方面提供無與倫比的性能。其流線型設計使其適用於各種應用程序,並可輕鬆適應從邊緣設備到雲 API 的不同硬件平台。

與之前的 YOLO 版本相比,YOLOv8 引入了一些新的設計思想和技術,以提高模型的精度和速度。它在模型結構、數據增強、網絡設計等方面進行了優化,使得在目標檢測任務中取得了出色的結果。 YOLOv8 不僅可以在通用的目標檢測任務中表現良好,還可以應用於各種應用領域,如自動駕駛、工業檢測、物體識別等。

模型安裝

官方的教學提供了非常明確的指導: https://docs.ultralytics.com/quickstart/

在這邊我選擇了使用pip安裝,只需要打下這一行就可以了

pip install ultralytics

用command line執行的方式如下

yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

用python執行偵測的方式

from ultralytics import YOLO

# Load a model
model = YOLO("yolov8n.yaml")  # build a new model from scratch
model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)

# Use the model
model.train(data="coco128.yaml", epochs=3)  # train the model
metrics = model.val()  # evaluate model performance on the validation set
results = model("https://ultralytics.com/images/bus.jpg")  # predict on an image
path = model.export(format="onnx")  # export the model to ONNX format

官方建議使用的相關工具

建立一個物件偵測模型,需要做標註、影像增強、修改、訓練、佈署,以及將模型整合至使用端的程式。對於這些流程,Yolo提供了很完整的生態鏈去實現這些步驟

支持的任務

自己建立模型

下面是官方網站內一個包含建模、預測、輸出模型的程式碼範例

from ultralytics import YOLO

# Create a new YOLO model from scratch
model = YOLO('yolov8n.yaml')

# Load a pretrained YOLO model (recommended for training)
model = YOLO('yolov8n.pt')

# Train the model using the 'coco128.yaml' dataset for 3 epochs
results = model.train(data='coco128.yaml', epochs=3)

# Evaluate the model's performance on the validation set
results = model.val()

# Perform object detection on an image using the model
results = model('https://ultralytics.com/images/bus.jpg')

# Export the model to ONNX format
success = model.export(format='onnx')

我自己嘗試使用原有的模型訓練新的資料,在訓練過程中,會出現下面這樣的模型訊息

上面那些數值的解釋如下

  • Epoch (迭代輪數): 這是訓練過程中的迭代次數,每次迭代會處理數據集中的一批樣本。
  • GPU_mem (顯存佔用): 顯存是指圖形處理單元(GPU)上的內存,該數字顯示在當前迭代中 GPU 使用了多少顯存。
  • box_loss (框回歸損失): 這是目標檢測模型訓練中的一個損失項,用於優化檢測框的位置。
  • cls_loss (分類損失): 也是目標檢測模型訓練中的損失項之一,用於優化目標的分類預測。
  • dfl_loss (變換損失): 這可能是一種針對目標檢測中檢測框位置變換的損失。
  • Instances (實例數): 在每次迭代中,訓練過程處理的目標實例數量。
  • Size (尺寸): 可能是指輸入圖像的尺寸。
  • Class (類別): 指的是不同的目標類別。
  • Images (圖像數): 在評估模型性能時,所用圖像的數量。
  • Box (框)、P (精確率)、R (召回率): 這些是用於評估目標檢測模型性能的指標。精確率衡量模型在預測為正類的情況下有多少是正確的,召回率衡量模型在所有正類樣本中有多少被正確檢測出來。
  • mAP50、mAP50-95 (平均精確率): 這是在不同閾值下計算的平均精確率。 mAP50 表示在 50% 的 IoU 閾值下的平均精確率,而 mAP50-95 表示在 50% 到 95% 的 IoU 閾值範圍內的平均精確率。

以上圖而言,在第23輪的訓練其精度為48.4%,F1召回率為59%

處理圖片大小的不一致

YOLO原本建模時所使用的是COCO的資料集,在這個資料集裡面,圖片的長、寬皆為640px,但是實際上我們應用上所使用的圖片很可能並不是640×640的尺寸,這時候就要先對圖片做處理。

如果只是要做預測,可以直接使用resize_with_pad來對圖片做縮放,這個函數可以保持長寬比相同且不失真,將圖像大小調整為目標寬度和高度。如果目標尺寸與圖像尺寸不匹配,則會調整圖像大小,然後用零填充以匹配請求的尺寸。

但對於訓練,您還需要相應地調整邊界框的大小和填充邊界框,這並非易事。
這是如何完成此操作的示例https://nbviewer.jupyter.org/github/aleju/imgaug-doc/blob/master/notebooks/B02%20-%20Augment%20Bounding%20Boxes.ipynb

以下為幾個主要手法:

  • 調整輸入尺寸:你可以將攝像機圖像調整為與 YOLO 模型訓練時使用的正方形尺寸相匹配。這可能會導致圖像在寬度或高度上出現一些留白,但能夠與模型兼容。
  • 圖像裁剪:將攝像機圖像進行裁剪,以適應 YOLO 模型所需的正方形尺寸。你可以從圖像的中心或其他感興趣的區域進行裁剪,以確保包含重要的目標信息。
  • 填充:如果圖像的長寬比與模型所需的正方形尺寸不匹配,你可以在圖像的較短邊或較長邊添加填充,使其達到正方形尺寸。填充可以使用一些背景顏色或內容進行填充,以保持圖像比例。
  • 訓練新模型:如果你的攝像機圖像尺寸與標準的 YOLO 輸入尺寸差異較大,並且以上方法不適用,你可能需要考慮訓練一個新的 YOLO 模型,以適應你的攝像機圖像尺寸。這樣可以確保模型在不同尺寸的圖像上都有良好的性能。

無論你選擇哪種方法,都需要注意到調整輸入尺寸可能會對模型性能產生影響,特別是在目標檢測任務中。你可能需要在實際場景中進行測試和調整,以找到最適合你應用的方法。

Posted on

PyTorch於Mac系統下的安裝教學

環境架設

相關教學文章: https://github.com/pytorch/pytorch

首先,PyTorch需要 Python 3.8.1以上的環境,先安裝Anaconda,接著設定一個虛擬環境使用py3.8.1

conda create -n aia16 python=3.8.1
conda activate aia16

切換到新創建的環境之後,就依照下面的步驟下載PyTorch

git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
# if you are updating an existing checkout
git submodule sync
git submodule update --init --recursive

編譯PyTorch

當你運行python setup.py develop來安裝PyTorch(或任何其他Python套件)時,這個命令的目的是在”開發模式”下安裝該套件。這意味著源代碼的更改會立即反映到Python環境中,無需重新安裝。

但是對於像PyTorch這樣的大型項目,這個過程可能會變得相對緩慢。如果你只是想試用PyTorch而不是開發它,那麼通常建議直接從官方渠道安裝預編譯的版本,這樣會快得多。(可以跳過此步驟)

安裝編譯所需工具

conda install cmake ninja
# Run this command from the PyTorch directory after cloning the source code using the “Get the PyTorch Source“ section below
pip install -r requirements.txt
# Add this package on intel x86 processor machines only
conda install mkl mkl-include
# Add these packages if torch.distributed is needed
conda install pkg-config libuv

開始編譯

python3 setup.py develop

直接安裝PyTorch

使用預編譯的二進制檔案安裝PyTorch是相對簡單的。以下是使用pip或conda安裝PyTorch的方法:

使用pip安裝

pip install torch torchvision

使用conda安裝

conda install pytorch torchvision -c pytorch

下載第一個測試專案

https://github.com/pytorch/ios-demo-app

首先要先安裝依賴管理套件cocoapods,安裝指令如下:

sudo gem install cocoapods

cocoapods安裝失敗解決方法

https://stackoverflow.com/questions/69460048/unable-to-install-cocoapods-in-macos-monterey-version-12-0-beta-xcode-13-013a

用homebrew安裝

brew install cocoapods

安裝依賴項

先把目錄切到有PodFile的位置,然後下指令

pod install