返回文章列表

視覺資料集建立與影像處理技術

本文探討如何建立機器學習所需的視覺資料集,涵蓋影像收集、處理、以及不同資料型別的轉換技巧。從照片、地理空間資料到音訊和視訊,文章提供實用的程式碼範例和詳細的解說,幫助讀者理解如何將不同格式的資料轉換為機器學習模型可用的 4D

機器學習 電腦視覺

影像資料是機器學習,特別是電腦視覺領域的根本。構建高效的視覺資料集需要仔細考量影像的解析度、品質、格式以及儲存方式。除了常見的JPEG照片,許多科學和工程領域也使用來自儀器裝置的特殊影像資料,例如X光、MRI、雷達和衛星影像。這些資料需要經過特定的預處理步驟,才能有效地輸入機器學習模型。對於地理空間資料,柵格化和投影轉換是關鍵步驟;遙測資料則需要標準化和異常值處理。此外,音訊和視訊資料也可以透過譜圖和嵌入等技術轉換為影像形式,以便利用電腦視覺技術進行分析。選擇合適的影像解析度需要平衡模型複雜度、訓練效率和預測準確度。高解析度影像雖然能保留更多細節,但也意味著更大的計算成本和儲存需求。

建立視覺資料集

在影像上執行機器學習需要大量的影像資料。在第四章中探討的案例大多數都適用於監督式機器學習。對於這種模型,我們還需要正確的答案或標籤來訓練機器學習模型。如果要訓練無監督的機器學習模型或像 GAN 或自編碼器這樣的自監督模型,可以省略標籤。本章將探討如何建立一個由影像和標籤組成的機器學習資料集。

本章的程式碼位於本文 GitHub 儲存函式庫的 05_create_dataset 資料夾中。我們將在適當的地方提供程式碼範例和筆記本的檔案名稱。

收集影像

在大多數機器學習專案中,第一階段是收集資料。資料收集可以透過多種方式進行:安裝攝影機於交通路口、連線到數位目錄以取得汽車零件的照片、購買衛星影像存檔等。它可以是一項物流活動(安裝交通攝影機)、技術活動(建立軟體聯結器到目錄資料函式庫)或商業活動(購買影像存檔)。

作為輸入的中繼資料

由於機器學習專案的成功高度依賴於資料的品質和數量,因此我們可能不僅需要收集影像資料,還需要收集有關這些影像取得上下文的各種中繼資料(例如,拍攝交通路口照片時的天氣,以及該路口所有交通燈的狀態)。雖然本文只關注影像,但請記住,您可以透過將這些中繼資料輸入到影像模型的某個晚期密集層中作為上下文特徵,從而顯著提高機器學習模型的準確性。從本質上講,這將中繼資料與影像嵌入串聯起來,並與影像模型一起訓練密集神經網路。欲瞭解更多詳情,請參閱 Valliappa Lakshmanan、Sara Robinson 和 Michael Munn 所著的《機器學習設計模式》第二章中的多模態輸入設計模式的討論。

照片

照片是最常見的影像資料來源之一。這些照片可以包括從社交媒體和其他來源取得的照片,以及在受控條件下由永久安裝的攝影機拍攝的照片。

在收集影像時,我們需要做出的第一個選擇是攝影機的位置以及影像的大小和解析度。顯然,影像必須框住我們感興趣的任何事物——例如,安裝用於拍攝交通路口的攝影機需要對整個路口有清晰的視野。

直觀地看,似乎透過在最高解析度的影像上訓練模型,我們將獲得最高準確度的模型,因此我們應該盡力以最高的解析度收集資料。然而,高影像解析度伴隨著幾個缺點:

  • 更大的影像需要更大的模型——卷積模型的每一層中的權重數量與輸入影像的大小成比例地縮放。
  • 訓練機器學習模型的機器記憶體(RAM)有限,因此影像大小越大,每批次中可以擁有的影像數量就越少。一般來說,更大的批次大小會導致更平滑的訓練曲線。因此,大影像可能會對準確度產生反作用。
  • 更高的解析度,尤其是那些在戶外和低光環境中拍攝的影像,可能會有更多的噪聲。將影像平滑到較低的解析度可能會導致更快的訓練和更高的準確度。
  • 收集和儲存高解析度影像比收集和儲存較低解析度的影像需要更長的時間。因此,為了捕捉高速動作,可能需要使用較低的解析度。
  • 更高的解析度影像需要更長的時間來傳輸。因此,如果您正在邊緣收集影像並將它們傳送到雲端進行推理,透過使用更小、更低解析度的影像,可以實作更快的推理。

因此,建議使用根據您的影像噪聲特性和機器學習基礎設施預算所能承受的最高解析度。不要降低解析度到無法分辨感興趣物件的地步。

一般來說,值得使用預算範圍內最高品質的攝影機(就鏡頭、靈敏度等方面而言)——如果預測期間使用的影像始終清晰、白平衡一致,且影像上的噪聲影響最小,那麼許多電腦視覺問題就會被簡化。其中一些問題可以透過影像預處理來糾正(影像預處理技術將在第六章中介紹)。儘管如此,最好還是擁有沒有這些問題的影像,而不是收集資料後再進行糾正。

攝影機通常可以以壓縮(如 JPEG)或未壓縮(如 RAW)格式儲存照片。在儲存 JPEG 照片時,我們通常可以選擇品質。較低品質和較低解析度的 JPEG 檔案壓縮效果更好,因此儲存成本更低。如前所述,較低解析度的影像也將減少計算成本。由於儲存相對於計算成本較低,因此我們的建議是選擇高品質閾值的 JPEG(95%+),並以較低的解析度儲存它們。

您可以使用的最低解析度取決於具體問題。如果您正在嘗試對風景照片進行分類別以確定它們是水還是陸地,您可能可以使用 12x16 的影像。如果您的目標是識別那些陸地風景照片中的樹木型別,您可能需要畫素足夠小,以便清晰地捕捉到葉子的形狀,因此您可能需要 768x1024 的影像。

# 以下是一個範例程式碼,用於讀取和處理影像
import cv2

def read_image(path):
    # 使用 OpenCV 讀取影像
    image = cv2.imread(path)
    # 將影像轉換為 RGB 格式
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    return image

#### 內容解密:
此段程式碼定義了一個函式 `read_image`,用於讀取指定路徑下的影像檔案它使用 OpenCV 的 `imread` 函式讀取影像並將其從 BGR 格式轉換為 RGB 格式這是因為 OpenCV 預設讀取影像為 BGR 格式而大多數其他函式庫如 matplotlib預期的是 RGB 格式

影像資料的收集與處理

在許多科學與工程領域中,影像資料扮演著至關重要的角色。諸如X光、核磁共振成像(MRI)、光譜儀、雷達和鐳射雷達等儀器,都能夠產生2D或3D的影像資料。這些資料的處理和分析對於後續的機器學習模型訓練至關重要。

特殊影像資料的處理

許多儀器產生的影像資料並非傳統的RGB三通道影像。例如,X光影像可以視為灰階影像,因為它們只包含一個通道的資訊。如果儀器能夠測量多個物理量,那麼這些不同的測量值可以被視為影像的不同通道。

極座標網格

雷達和超聲波等儀器的資料通常是在極座標系統下取得的(參見圖5-2)。在這種情況下,可以直接將極座標資料作為輸入影像,或者將其轉換到笛卡爾座標系統後再輸入機器學習模型。兩種方法各有優缺點:極座標系統下沒有插值或畫素重複的問題,但畫素大小會隨著位置變化;而在笛卡爾座標系統下,畫素大小保持一致,但可能會出現資料缺失、插值或聚合的問題。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 視覺資料集建立與影像處理技術

package "視覺資料集建立" {
    package "影像收集" {
        component [攝影機佈署] as camera
        component [解析度選擇] as resolution
        component [格式轉換] as format
    }

    package "資料類型" {
        component [照片影像] as photo
        component [地理空間資料] as geospatial
        component [遙測資料] as remote
    }

    package "預處理技術" {
        component [4D 張量轉換] as tensor
        component [通道處理] as channel
        component [音訊視訊轉換] as audio_video
    }
}

camera --> resolution : 品質平衡
geospatial --> remote : 柵格化處理
photo --> tensor : 模型輸入

note bottom of resolution
  解析度與成本
  效能權衡
end note

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

此圖示顯示了極座標資料處理的兩種不同方法。

我們建議直接使用極座標網格作為輸入影像,並將每個畫素距離中心的距離(或畫素大小)作為額外的輸入通道。這樣可以充分利用所有影像資料,而不會因為座標轉換而丟失資訊。

衛星通道

處理衛星影像時,最好在原始的衛星檢視或經過視差校正的網格上進行工作,而不是將影像重新對映到地球座標系。如果使用投影的地圖資料,盡量在原始投影上進行機器學習。將同一地點在不同波長下拍攝的影像視為不同的通道(參見圖5-3)。需要注意的是,預訓練模型通常是在三通道影像(RGB)上訓練的,因此遷移學習和微調可能不適用,但底層架構可以支援任意數量的通道,只要是從頭開始訓練。

地理空間層

如果有多個地圖層(如土地所有權、地形、人口密度等,參見圖5-4),並且它們是在不同的投影下收集的,那麼就需要將它們重新對映到相同的投影中,對齊畫素,並將這些不同的層視為影像的不同通道。在這種情況下,將畫素的緯度作為額外的輸入通道可能會有幫助,這樣可以考慮到畫素大小的變化。

概念驗證

在許多情況下,手頭上沒有足夠的資料,而為了概念驗證而收集資料可能需要太長時間。這時,可以考慮購買類別似的資料,以瞭解專案的可行性。在購買影像時,需要確保所購買的影像在品質、解析度等方面與最終專案中將要使用的影像相似。

模擬影像

另一種進行概念驗證的方法是模擬影像。第11章中有一個例子,透過模擬影像來展示計算葡萄藤上番茄數量的能力。在模擬影像時,修改現有的影像可能比從頭開始建立更容易。例如,如果有綠色葡萄藤的照片,可以在上面新增不同大小的紅色番茄,以生成模擬的番茄藤影像。

程式碼範例與解析

以下是一個簡單的Python程式碼範例,用於展示如何將多個地理空間層組合成一個多通道影像:

import numpy as np
import rasterio

# 載入不同的地理空間層
land_cover = rasterio.open('land_cover.tif').read(1)
topography = rasterio.open('topography.tif').read(1)
population_density = rasterio.open('population_density.tif').read(1)

# 將不同的層堆積疊成一個多通道影像
multi_channel_image = np.stack([land_cover, topography, population_density], axis=-1)

# 輸出多通道影像的形狀
print(multi_channel_image.shape)

內容解密:

  1. 匯入必要的函式庫:使用numpy進行數值運算,使用rasterio讀取地理空間柵格資料。
  2. 載入地理空間層:分別讀取土地覆寫、地形和人口密度等柵格資料的第一個波段。
  3. 堆積疊成多通道影像:使用np.stack將三個單通道柵格資料堆積疊成一個三通道的多通道影像。其中,axis=-1引數表示在最後一個維度(即通道維度)上進行堆積疊。
  4. 輸出多通道影像的形狀:列印預出生成的多通道影像的形狀,以確認其維度是否正確。

資料型別與處理

在建立視覺資料集的過程中,我們不僅處理普通的照片,還會遇到其他型別的影像資料,例如地理空間圖層、MRI 掃描或聲音的頻譜圖等。只要資料能夠轉換成 4D 張量(batch x height x width x channels)的形式,機器學習技術就可以應用於這些資料。

通道(Channels)

典型的照片以 24 位 RGB 影像的形式儲存,包含三個通道(紅、綠、藍),每個通道由 0 到 255 的 8 位元數值表示。有些電腦生成的影像還包含第四個 alpha 通道,用於表示畫素的透明度。alpha 通道主要用於將多個影像疊加或合成。

縮放(Scaling)

許多機器學習框架和預訓練模型期望畫素值從 [0,255] 縮放到 [0,1]。大多數模型會忽略 alpha 通道。在 TensorFlow 中,可以使用以下程式碼實作縮放:

# 從檔案讀取壓縮資料到字串
img = tf.io.read_file(filename)
# 將壓縮字串轉換為 3D uint8 張量
img = tf.image.decode_jpeg(img, channels=3)
# 將資料轉換為 [0,1] 範圍的浮點數
img = tf.image.convert_image_dtype(img, tf.float32)

內容解密:

  1. tf.io.read_file(filename):此函式用於從檔案中讀取資料,傳回一個包含檔案內容的字串。
  2. tf.image.decode_jpeg(img, channels=3):此函式將 JPEG 格式的影像解碼為 3D 張量,channels=3 指定輸出為 RGB 影像。
  3. tf.image.convert_image_dtype(img, tf.float32):此函式將影像資料的資料型別轉換為 tf.float32,並自動將畫素值縮放到 [0,1] 範圍。

通道順序(Channel Order)

典型的影像輸入形狀為 [height, width, channels],其中通道數通常為 RGB 影像的 3 或灰階影像的 1。這種表示法稱為「通道最後」(channels-last),是 TensorFlow 的預設格式。早期的機器學習套件和硬體曾使用「通道優先」(channels-first)格式。

# 將通道優先的影像轉換為通道最後
image = tf.einsum('chw->hwc', channels_first_image)
# 或者使用 transpose 函式
image = tf.transpose(channels_first_image, perm=(1, 2, 0))

內容解密:

  1. tf.einsum('chw->hwc', channels_first_image):使用 Einstein 求和約定,將通道優先的影像轉換為通道最後格式。
  2. tf.transpose(channels_first_image, perm=(1, 2, 0)):透過指定維度的排列順序,將通道優先的影像轉換為通道最後格式。

灰階影像處理

對於灰階影像或簡單的 2D 陣列,可能需要擴充維度以符合 [height, width, 1] 的形狀:

image = tf.expand_dims(arr2d, axis=-1)

內容解密:

  1. tf.expand_dims(arr2d, axis=-1):在指定的軸(此處為最後一個軸)上增加一個維度,將灰階影像轉換為具有單一通道的影像格式。

地理空間資料(Geospatial Data)

地理空間資料可以來自地圖圖層或遙感技術,如無人機、衛星、雷達等。這些資料通常有多個光柵波段(raster bands),可以視為多通道影像進行處理。

# 將多個光柵波段堆積疊成多通道影像
image = tf.stack([read_into_2darray(b) for b in raster_bands], axis=-1)

內容解密:

  1. tf.stack([read_into_2darray(b) for b in raster_bands], axis=-1):將多個光柵波段讀取為 2D 陣列後,在最後一個軸上堆積疊,形成多通道影像。

總結來說,不同型別的視覺資料可以透過適當的預處理步驟轉換為機器學習模型所需的輸入格式。理解這些資料型別的特性和適當的處理方法對於建立有效的視覺資料集至關重要。

資料型別處理與轉換

在機器學習(ML)專案中,不同型別的資料需要經過適當的處理和轉換才能被有效地利用。本章節將探討地理空間資料、遙測資料、音訊和視訊資料的處理方法。

地理空間資料的柵格化

地理空間資料通常以向量形式存在,例如國家或城市的邊界。為了將這些資料用於機器學習模型,需要將其轉換為柵格格式。這種轉換過程稱為柵格化。

在柵格化過程中,向量資料被轉換為一系列二元影像,每個影像代表一個特定的類別。例如,如果向量資料代表國家邊界,則可以生成多個柵格影像,每個影像對應一個國家,在該國家邊界內的畫素值為1,其他地方為0。這種方法類別似於對類別變數進行獨熱編碼。

# 柵格化範例程式碼
import numpy as np

def rasterize_vector_data(vector_data, shape):
    raster_data = np.zeros(shape)
    # 根據向量資料生成柵格資料的邏輯
    return raster_data

內容解密:

  1. rasterize_vector_data 函式接受向量資料和輸出柵格資料的形狀作為輸入。
  2. 初始化一個全零的 NumPy 陣列 raster_data,其形狀由輸入引數 shape 指定。
  3. 在實際應用中,需要根據向量資料的具體內容填充 raster_data,這裡省略了具體實作細節。

地理空間資料的投影方式也需要考慮。不同的投影方式(如蘭伯特保角投影、麥卡託投影等)具有不同的特性,如面積保持、方向保持等。雖然任何投影方式都可用於機器學習,但確保所有柵格波段使用相同的投影是非常重要的。

遙測資料的處理

遙測資料是由成像儀器收集的,例如衛星或無人機上的攝影機。這些資料可能包含多個頻道的資訊。如果原始資料經過顏色處理以便視覺化,最好使用原始感測資料而非顏色處理後的影像。

在處理遙測影像時,需要注意以下幾點:

  1. 將影像資料標準化,例如將畫素值縮放到0到1之間。
  2. 處理異常值,例如海洋波浪或潮汐引起的異常值,可能需要裁剪資料到合理的範圍內。
  3. 處理缺失資料,例如衛星視野外的區域或雷達影像中的雜波區域。可以透過裁剪、插值或建立額外的柵格波段來標記缺失值。
# 遙測資料標準化範例程式碼
import numpy as np

def normalize_remote_sensing_data(data):
    min_val = np.min(data)
    max_val = np.max(data)
    normalized_data = (data - min_val) / (max_val - min_val)
    return normalized_data

內容解密:

  1. normalize_remote_sensing_data 函式接受遙測資料作為輸入。
  2. 計算輸入資料的最小值和最大值。
  3. 將資料標準化到0到1之間,透過減去最小值並除以最大值與最小值的差值。

音訊和視訊資料的處理

音訊是一種1D訊號,而視訊是3D資料。雖然有專門針對音訊和視訊的機器學習技術,但也可以將影像處理技術應用於這些資料。

譜圖

在對音訊進行機器學習之前,需要將音訊分割成時間視窗,並對這些視窗進行分析。可以使用Conv1D層處理音訊資料,但將音訊訊號表示為譜圖(spectrogram)通常能獲得更好的結果。譜圖是一種2D表示,顯示了音訊訊號在不同時間點的頻率特性。

# 生成譜圖範例程式碼
from scipy import signal
from scipy.io import wavfile
import numpy as np

def generate_spectrogram(filename):
    sample_rate, samples = wavfile.read(filename)
    _, _, spectro = signal.spectrogram(samples, sample_rate)
    img = np.log(spectro)
    return img

內容解密:

  1. generate_spectrogram 函式讀取一個WAV檔案。
  2. 使用scipy.signal.spectrogram函式生成譜圖。
  3. 對譜圖取對數,以獲得更好的表示。

使用電腦視覺技術進行自然語言處理

將句子或檔案轉換為嵌入向量(embeddings),然後將這些向量排列成2D結構,可以使用電腦視覺技術來處理自然語言問題。例如,可以使用預訓練的嵌入模型(如Universal Sentence Encoder或BERT)將句子轉換為嵌入向量,然後應用卷積神經網路(CNN)等技術進行檔案理解任務。

# 使用預訓練嵌入模型範例程式碼
import tensorflow_hub as hub

def embed_sentences(paragraph):
    embed = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
    embeddings = embed(paragraph.split('.'))
    return embeddings

內容解密:

  1. embed_sentences 函式接受一個段落作為輸入。
  2. 載入預訓練的Universal Sentence Encoder模型。
  3. 將段落分割成句子,並計算每個句子的嵌入向量。

本章節介紹瞭如何處理不同型別的資料,包括地理空間資料、遙測資料、音訊和視訊資料,以及如何使用電腦視覺技術進行自然語言處理。這些技術和方法可以幫助開發者更好地準備和利用多樣化的資料來源,以支援各種機器學習專案的需求。