Posted on

Transformer 模型介紹

甚麼是Transformer 模型

Transformer 模型是一種神經網路,藉由追蹤序列資料中的關係,學習上下文之間的脈絡及意義,就如同句子中的每一個字。
Transformer 模型是使用一套不斷發展,稱為注意力(attention)或自我注意力(self-attention)的數學技術,它可偵測一個系列中以微妙方式相互影響和相互依賴的資料元素,甚至是模糊的資料元素。
Google 在 2017 年的一篇論文中,首次提到 Transformer 模型是迄今發明出最新且最強大的模型之一。Transformer 模型在推動機器學習不斷進步,有些人稱其為 Transformer 人工智慧。

NVIDIA – 何謂 Transformer 模型?

Transformer 模型是一種深度學習模型,由Vaswani等人於2017年在論文 “Attention is All You Need” 中提出。它最初是為了解決序列到序列的任務,例如機器翻譯,但後來已被用於多種自然語言處理(NLP)任務,並成為了許多先進模型,如 BERT 和 GPT 等的基礎。

「Transformer 模型讓我們可以做到自我監督學習,以及快速發展人工智慧。」NVIDIA 創辦人暨執行長黃仁勳在 2022 年舉行的 GTC 大會主題演講中表示。

Transformer 模型的主要特點包括:

  1. Self-Attention Mechanism
    • Self-Attention 使模型能夠權衡輸入序列中不同位置的重要性,從而更好地捕捉序列中的依賴關係。
    • 透過計算 Query、Key 和 Value 的點積來得出每個單詞對其他單詞的注意力分數。
  2. Multi-Head Attention
    • Transformer 使用多個 Self-Attention 頭,讓模型能夠同時關注多個位置,從而獲取更豐富的信息。
  3. Positional Encoding
    • 因為 Transformer 模型沒有內建的順序感知機制,所以要通過加入位置編碼來獲取序列中單詞的位置信息。
  4. Feed-Forward Neural Networks
    • 每個 Transformer Block 包含一個全連接的前饋神經網絡,用於進行非線性轉換。
  5. Layer Normalization
    • 每個子層(例如 Self-Attention、Feed Forward Neural Network)有一個 Layer Norm,用於穩定模型的訓練。
  6. Residual Connections
    • 模型中使用了殘差連接,這有助於緩解梯度消失問題,並允許模型設計得更深。

Transformer 模型由編碼器和解碼器組成。編碼器用於處理輸入序列,而解碼器則用於生成輸出序列。在許多情況下,例如當模型用於文本生成或者語言模型訓練時,可能只會使用到解碼器。

這個模型由於其高效的平行計算和強大的表達能力,已成為當前自然語言處理領域的主流架構。

Transformers 模型原理

Transformers 模型使用鍵值結構(Key-Value Structure)進行自注意力(self-attention),這是它們在處理序列資料中的重要組成部分。以下是如何在 Transformers 中使用鍵值結構進行自註意力機制的簡要說明:

  1. 輸入表示:在Transformers模型中,輸入序列被編碼為一組向量,通常稱為「嵌入」(embeddings)。這些嵌入向量包括查詢(query)、鍵(key)和值(value)表示。每個嵌入支持都用於不同的目的。
  2. 計算注意力分數:對於每個位置或單詞,模型計算查詢與所有鍵顯示之間的相似度分數。這是透過點積或其他方法來完成的,目的是簡單查詢與鍵的關聯程度。分數用於表示每個位置對其他位置的關注度。
  3. 應用softmax函數:為了獲得標準化的注意力權重,模型要應用softmax函數計算上一步的分數。這將確保注意力重總和等於1,因此它們可以被視為機率分佈。
  4. 計算加權值:使用softmax歸一化的注意力權重來加權值分配。這意味著每個位置的值都會根據注意力權重進行加權組合,以產生新的表示。
  5. 輸出:最後,透過將加權值相加,模型產生了更新的表示,這些表示包含了上下文資訊和關注重點。這些更新的表示被傳遞到下層或用於任務特定的操作。

總的來說,自注意力機制允許Transformer模型根據輸入資料的不同部分之間的關係來動態調整其內部表示。鍵值結構在此過程中起到關鍵作用,因為它們允許模型在查詢和按鍵之間建立關聯,便於在產生新的表示時聚焦於相關的資訊。這使得Transformer模型能夠在各種自然語言處理任務中表現出色,包括機器翻譯、文字生成、文字分類等。

論文內容探究

在 2021 年 8 月的一篇論文中,史丹佛大學的研究人員將 Transformer 模型稱為「基礎模型」,他們認為這些模型推動了人工智慧的典範移轉。他們寫道:「在過去幾年,基礎模型之規模和範圍擴大了我們對可能性的想像。」

On the Opportunities and Risks of Foundation Models

這份報告探討了一種新興的人工智慧(AI)系統建構範式 , 稱為「基礎模型」 。

基礎模型是指任何一個在廣泛數據上進行訓練(通常使用大規模的自監督訓練) , 可以適應各種下游任務的模型 。 這份報告探討了基礎模型的機會和風險, 包括模型的能力 、 技術原則 、 應用以及社會影響 。 基礎模型的重要性在於它們的規模和範疇 , 從而改變了我們對於可能性的想像 。

然而 , 基礎模型的崛起也伴隨著風險 , 因為它們的缺陷可能會傳遞給所有適應的下游模型 。 由於我們目前對基礎模型的工作方式 、 失敗時機和能力缺乏清晰的理解 , 因此需要深度跨學科的合作來解決這些問題 。

報告還討論了基礎模型的社會影響 , 包括社會不平等 、 濫用 、 經濟和環境影響 、 法律和道德考慮等方面 。 基礎模型的部署對人們的生活產生了深遠的影響 , 因此需要負責任地預測和應對這些道德和社會考慮 。 報告還強調 , 基礎模型的研究和部署是兩個不同的階段 , 並且需要更嚴格的測試和審核 , 以確保它們的可靠性和安全性 。

基礎模型的兩個重要特點: Emergence 、Homogenizatio

基礎模型的興起帶來了「Emergence(新興特性)」和「Homogenizatio(同質化)」,它們使AI系統更強大,但也需要謹慎使用,因為基礎模型的缺陷會傳承到所有適應的下游模型中。需要跨學科合作來深入研究基礎模型的工作,以理解它們的工作方式、失敗情況和潛在能力。

  • Emergence : 意味著基礎模型的行為是由模型自動產生而不是明確設計的 , 這使得我們難以預測它們的所有行為 。
  • Homogenization: 則表示基礎模型的使用在各種應用中變得非常相似 , 這帶來了高度的效益 , 但也可能導致一個模型的缺陷影響所有相關的應用 。
人工智慧的發展呈現出一個日漸盛行且趨於標準化的軌跡。從機器學習的引入開始,我們已能從示例中自動進行推斷;深度學習帶來了用於預測的高階特徵;而基礎模型更進一步,引入了上下文學習等先進功能。在此過程中,機器學習使得學習算法趨於標準化(如邏輯回歸),深度學習則使得模型架構標準化(如卷積神經網路),而基礎模型則將整個模型本身標準化(如GPT-3)。
圖 2.基礎模型可以集中來自各種模態的所有數據的資訊。 然後,這個模型可以適應廣泛的下游任務。

Homogenization和Emergence在某種程度上令人擔憂地互相影響。Homogenization在數據稀缺的特定任務領域中可能帶來巨大優勢。然而,任何模型中的缺陷都可能被所有的適應模型所繼承。由於基礎模型的力量更多地來自於它們的Emergence特性,而非其明確結構,這使得當前的基礎模型難以被理解,並可能出現意外的故障模式。由於Emergence使基礎模型的能力和缺陷變得不可預知,因此對這些模型進行大規模的Homogenization會帶來風險。

基礎模型的應用範圍

此外,報告指出,基礎模型生態系統包括從數據創建到部署的多個階段,並強調在整個過程中的關鍵作用。數據的創建、整理、訓練和適應是基礎模型生態系統的重要組成部分,需要特別關注資料的品質、道德和法律要求。報告呼籲在基礎模型的各個階段都應該實施嚴格的監測和負責任的實踐。

基礎模型的社會影響


基礎模型在AI系統中的崛起帶來了深遠的社會影響。主要問題是:它們造成了哪些具體影響?相關的考慮包括社會不平等的加劇、對經濟和環境的影響、誤導信息的擴散、法律和道德問題,以及政治經濟層面的挑戰。由於基礎模型的多功能性和不可預知性,我們面臨如何負責任地處理其帶來的道德和社會問題。

再者,我們需要考慮基礎模型的整體生態系統,從數據生成到實際部署。這一系統包括數據收集、訓練、適應和部署等多個階段,並強調了人在此過程中的重要性。

此外,有一系列基於通用模型的新興AI系統,如BERT、DALL-E和GPT-3。這些模型雖然帶來了新的可能性,但也伴隨著同質化和其他風險。要應對這些挑戰,需要多學科的合作。

隨著基礎模型的興起,AI正朝向更泛化的方向發展。其中,「Emergence」和「Homogenization」成為了核心概念。在這發展過程中,如何減少風險、確保AI的安全性和道德考慮,都是我們面臨的主要挑戰。

基礎模型對社會的影響涵蓋了多個範疇,如社會不平等、經濟效應、環境問題、信息誤用、法律後果、倫理挑戰和政治經濟。在研究和部署這些模型時,我們需要承擔相應的社會責任,並加強測試與審查。同時,我們必須深入理解基礎模型的整個生態系統,從數據收集到模型的部署,人在這過程中扮演著核心角色。為了降低潛在的不良效應,我們需要更加重視數據品質、模型使用方式以及相關的倫理考量。

Posted on

AI大師論壇:人工智慧如何形塑人類未來

YOUTUBE連結: https://www.youtube.com/watch?v=k7aFffQn5vU

本篇文章所有圖片皆來自於永齡基金會 YouTube

講者介紹

吳恩達(1976-,英文名:Andrew Ng),華裔美國人,是斯坦福大學計算機科學系和電子工程系副教授,人工智能實驗室主任。吳恩達是人工智能和機器學習領域國際上最權威的學者之一。吳恩達也是在線教育平台Coursera的聯合創始人(with Daphne Koller),DeepLearning.AI創始人。

他的其他分享

AI 大神吳恩達降臨──告訴你如何成為創新者

【ChatGPT 之父來台】Sam Altman、吳恩達重磅開講!談 AI 將如何顛覆世界

現在AI應用的狀況

兩個重要的概念

  1. 監督式學習:需要label,從2015起大多的應用都是監督式學習,即便是不同的應用但大多屬於監督式學習
  2. 生成AI: 而現在則到了生成式AI的時代,CHATGPT利用不停地去預測下一個字來完成文字的生成,可以產生非常長的文字。
現在監督式學習模型為最大宗應用

大模型的時代

從2010-2020,進入了GPU加速的大模型的時代。這是因為GPU的支持,讓模型可以學習更多的資料,這也讓生成式AI有機會發展起來

AI的革命 – 生成式AI的發展

CHATGPT利用不停地去預測下一個字來完成文字的生成,可以產生非常長的回應文字。吳恩達認為這樣的生成式模型會很大的改變現有的模型生態

生成式AI如何改變建模的過程

以前的監督式學習需要
拿到label資料->建模->部屬
現在則只需要
指定prompt->部屬

吳恩達在現場分享,不同的 AI 分屬不同領域,包含生成式 AI、監督式學習等。他指出,過去 10 年是生成式 AI 的 10 年,如今生成式 AI 僅處於早期的成功階段,未來潛力仍大,如果要達到真正的通用,至少還要 30,甚至 50 年。

他認為,或許現在大家已看到很多生成式 AI 的消費端應用,但更讓他興奮的是開發端的發展。過去很多 AI 應用需要花 6 個月打造,現在已可以讓成千上萬的人,透過生成式 AI 將開發過程降低至幾天內。他認為 AI 的未來,還有許多機會是給開發者的。

Generative AI 的課程很重要

他認為企業應該賦能員工,因為生成式AI會是下一個顛覆AI產業的應用,可以讓員工在這些地方學習Generative AI

三年內生成式AI的數量會增長一倍

他認為現在雖然監控式模型是大多數的應用,而生成很少,但未來會改變,三年內預計生成式AI會大增。而他認為監督式學習的應用成長幅度則會減低,因為未來的建模會更偏向廣泛化功能的建模(生成模型)

雖然生成式 AI 要追上發展已久的監督式 AI 的產值還有一段距離,但其成長速度驚人。台灣的開發者團隊在全球人工智慧領域也做出了重要貢獻。他也舉例自己從共同創辦人那裡獲得將 AI 導入船運業的點子,同理也期望在台灣激發如農業、工業領域更多類似的 AI 創業點子。

他舉出一個APP就是可以把你的照片變成太空人的照片的APP,叫做LENSA,他們的營收在去年12月到最高,然後就掉下去了,這是因為這是一個很單純的APP,很快地就會風潮過去。而大多數能夠屹立不搖、一直被使用的軟體,都要經過很多時間的考驗

為什麼在台灣AI還沒有廣泛被採用

為什麼在台灣AI還沒有廣泛被採用,這是因為還很難使用no code/low code的方式去建模,他還舉了披薩工廠的例子,說明未來很可能建模就會像是在產生一個披薩。未來自己建模的機率會大幅降低,因為客製化建模很可能no code就可以達成,只需要做prompts。不再需要大量的標註資料

他指出,有許多領域專案本身具有高價值的生意,例如廣告、搜尋業務,自然吸引許多工程師投入;不過有些總價值沒那麼高、較為長尾的小型生意,例如餐廳,對於大型科技公司來說投入的吸引力較低。

這是AI應用上非常重大的一個革命,未來企業將可以用非常省成本的方式採用AI

The AI stack

企業要使用AI所需要擁有的資源

他提到 AI 的基礎架構、開發者工具市場已經有一些贏家、高度競爭,也獲得了大量外界關注;但還有一塊是 AI 未來的發展重點── App 應用程式,而這高度需要合作夥伴。人工智慧(AI)被認為將成為未來社會的基礎設施,就像水和電網一樣不可或缺。監督式學習和生成式 AI 是兩個關鍵領域。

AI的危機

  • 偏見、歧視、不正確的資訊=>這些部分正在快速改進中
  • 職業被自動化取代=>但是要取代所有人類的工作還要很久很久
  • 國際化會變得非常的快速、資訊更加爆炸,但在一些突發狀況中,如瘟疫、氣候改變等,AI的腳色會變得十分關鍵

新創如何使用生成式AI

https://bearing.ai/

這個吳恩達投資的公司在很短很短的時間建立了航運預測的AI軟體,猛猛搭~

擁有生成式AI的技術可以更快速的建立所需要的模型

Posted on

使用現有模型標記新圖片

Auto Labeling

因為在標記時常會花費很多的時間和力氣,現在市面上有許多auto labeling的工具,例如前一陣子meta有發表一個模型,還引起注目叫做SAM: https://segment-anything.com/

以下為一個簡單的使用範例

from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor
import matplotlib.pyplot as plt
import cv2
import numpy as np
def show_anns(anns):
    if len(anns) == 0:
        return
    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
    ax = plt.gca()
    ax.set_autoscale_on(False)

    img = np.ones((sorted_anns[0]['segmentation'].shape[0], sorted_anns[0]['segmentation'].shape[1], 4))
    img[:,:,3] = 0
    for ann in sorted_anns:
        m = ann['segmentation']
        color_mask = np.concatenate([np.random.random(3), [0.35]])
        img[m] = color_mask
    ax.imshow(img)
    
image = cv2.imread('./train/IMG_5208_jpg.rf.d85b8d233845117f0362c17ca2222c21.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

sam_checkpoint = "sam_vit_h_4b8939.pth"
model_type = "vit_h"

device = "cpu"

sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)

mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(image)
print(len(masks))
print(masks[0].keys())

plt.figure(figsize=(20,20))
plt.imshow(image)
show_anns(masks)
plt.axis('off')
plt.show() 

成果如下:

Roboflow的智慧圈選工具

在Roboflow也有類似的智慧圈選工具,可以自動為我們圈選目標的形狀,使用方式如下

使用現有模型標記YOLO格式label

但是若我們想要使用既有的模型訓練一些新的圖片,在新的圖片,若要標記一些常見的物品,如汽車、人、機車等…。這些東西因為在YOLO這種模型,預設的偵測狀況就很不錯了,有的時候為了要讓標記更快速,可以使用現有模型把預測的結果轉為標記檔案,再匯入Roboflow等標記軟體檢視標記狀況並修正錯誤的標記,會可以使標記工作更輕鬆。

預測結果轉標記程式碼

這邊是預測的result的相關文件: https://docs.ultralytics.com/reference/engine/results/#ultralytics.engine.results.Results.tojson

我真的覺得yolov8做的很用心的點,在於他的說明超級清楚,尤其是在程式碼本身上面,我們可以單單藉由下面程式碼印出詳細返回的物件結構,然後就可以了解該如何取得我們所需的物件資訊

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.pt')  # pretrained YOLOv8n model

# Run batched inference on a list of images
results = model(['im1.jpg', 'im2.jpg'])  # return a list of Results objects

# Process results list
for result in results:
    boxes = result.boxes  # Boxes object for bbox outputs
    masks = result.masks  # Masks object for segmentation masks outputs
    keypoints = result.keypoints  # Keypoints object for pose outputs
    probs = result.probs  # Probs object for classification outputs
    print(masks )

從API我們可以得知,若我們使用的是yolo-seg,則吐回的座標資訊可參考這個返回值

完整預測結果轉標記的程式範例

設定folder_path到images的資料夾,label會放到相對應的labels資料夾下

from ultralytics import YOLO
from PIL import Image
import cv2
import os

# 資料夾路徑
folder_path = './datasets/coco8-seg/images/train'
images = []
# 確保資料夾存在
if not os.path.exists(folder_path):
    print("資料夾不存在")
else:
    # 取得資料夾內所有檔案
    file_list = os.listdir(folder_path)
    
    # 遍歷每個檔案
    for filename in file_list:
        # 確保檔案是圖片檔案(可根據您的需求調整)
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            # 構建完整的檔案路徑
            file_path = os.path.join(folder_path, filename)
            
            images.append(file_path)

# Load a model
model = YOLO('yolov8n-seg.pt')  # pretrained YOLOv8n model

# Run batched inference on a list of images
results = model(images)  # return a list of Results objects


# Show the results
for r in results:
    formatted_string = ""
    if r is not None and r.masks is not None:
        for i in range(len(r.masks.xyn)):
            mask = r.masks.xyn[i]
            cls = int(r.boxes.cls[i].item())
            formatted_rows = []
            formatted_rows.append(cls)
            for row in mask:
                formatted_rows.append(row[0])
                formatted_rows.append(row[1])

            formatted_string = ((formatted_string + '\n') if formatted_string != "" else "") + " ".join(str(x) for x in formatted_rows)
        with open(r.path.replace('.jpg', '.txt').replace('images', 'labels'), "a") as file:
            file.write(formatted_string)

把YOLO格式轉為COCO格式

請參考此專案: https://github.com/Taeyoung96/Yolo-to-COCO-format-converter/tree/master

Posted on

尋找pretrain model的好地方

https://paperswithcode.com/sota

“SOTA” 是 “State-of-the-Art” 的縮寫,意為 “最先進技術”。在計算機科學和人工智能領域,SOTA模型指的是當前被認為是在某個特定任務或領域內表現最優秀的模型或方法。這些模型通常代表了當前領域內的最高水平,並在諸如自然語言處理、計算機視覺、語音識別等各種任務中發揮著重要作用。

Posted on

常見的Computer Vision Tasks

下面是四種常見的計算機視覺任務的簡要介紹:

分類(Classification)

分類任務是將輸入圖像分為不同的類別或類別之一。例如,給定一張圖像,分類任務的目標是確定圖像中顯示的對像是什麼,比如貓、狗、汽車、飛機等。這通常涉及訓練一個分類器,以便它能夠識別圖像中的特定特徵並將其歸類到正確的類別中。

語義分割(Semantic Segmentation)

語義分割任務是為圖像中的每個像素分配一個類別標籤,從而實現像素級別的分類。與分類任務不同,語義分割不僅關注對象的類型,還考慮了對象的位置和邊界。這在許多應用中很有用,比如圖像分割、醫學圖像分析等。

語義分割是一種計算機視覺任務,旨在將圖像中的每個像素分配給預定義的語義類別。在語義分割中,每個像素都被標記為屬於某個特定的類別,如人、車、樹等。語義分割遵循像素級別的分類,因此通常使用像素級別的掩碼(即”masks”)來表示圖像中每個類別的區域。這些分割掩碼是二進製圖像,其中每個像素要嘛屬於某個類別,要嘛不屬於。

有名模型: U-Net 

和實例分割最大的不同是他的輸入會是兩張圖片,一張為原圖,一張為掩碼的圖

目標檢測(Object Detection)

目標檢測任務涉及在圖像中識別並定位多個不同類別的對象。相比於分類任務,目標檢測不僅需要標識對象的類別,還需要確定它們的位置和邊界框。常見的目標檢測算法可以提供每個檢測到的對象的邊界框和類別信息。具代表性的演算法包括Faster R-CNN, YOLO, SSD等

這篇文章介紹了許多我們常用的物件偵測模型: https://zhuanlan.zhihu.com/p/38709522

實例分割(Instance Segmentation)

實例分割任務結合了目標檢測和語義分割的概念,不僅要對每個對象進行分類,還需要在像素級別區分出每個對象的邊界。實例分割旨在識別圖像中的每個獨立實例並為每個實例分配獨特的標籤,從而在一個圖像中區分出不同的對象。

例如: COCO Segmentation
COCO(Common Objects in Context)是一個廣泛使用的圖像識別和分割數據集,其中包含了多種物體類別的圖像以及每個圖像中物體的分割標註。 COCO Segmentation 數據集中的分割信息通常是用多邊形輪廓來表示物體的形狀。這種分割方法在標註上更靈活,可以準確地表示物體的複雜形狀,但同時也需要更多的標註工作。

Posted on

conda無法安裝套件,缺少OpenSSL解決方案

錯誤訊息

Collecting package metadata (current_repodata.json): failed CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is required to download and install packages. Exception: HTTPSConnectionPool(host=’conda.anaconda.org’, port=443): Max retries exceeded with url: /conda-forge/win-64/current_repodata.json (Caused by SSLError(“Can’t connect to HTTPS URL because the SSL module is not available.”))

使用pip install/conda install跳出的錯誤

解決方法

在anaconda3>Library>bin尋找這兩個檔案

  • libcrypto-1_1-x64.dll
  • libssl-1_1-x64.dll

然後複製到anaconda3>DLLs.

相關討論串

https://github.com/conda/conda/issues/11982

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模型訓練及其指標意義

訓練自定義的YOLOv8模型

以下為官網的一個範例程式

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
results = model.train(data='coco128.yaml', epochs=100, imgsz=640)

範例中三種載入方式的比較

  • model = YOLO(‘yolov8n.yaml’):
    這段代碼使用給定的 YAML 配置文件構建一個新的 YOLO 模型。 YAML 配置文件包含了有關模型架構、層設置、超參數等的信息。通過提供 YAML 文件的路徑,可以創建一個全新的 YOLO 模型。(yaml檔案位於: ultralytics\cfg\models\v8)
  • model = YOLO(‘yolov8n.pt’):
    這段代碼加載一個預訓練的 YOLO 模型,該模型以 PyTorch 的 .pt 文件格式保存。預訓練模型已經在某個數據集上進行了訓練,並且包含了在該數據集上學到的權重。這個過程稱為遷移學習,它可以加快在新數據集上訓練模型的收斂速度,同時保留之前任務的特徵提取能力。
  • model = YOLO(‘yolov8n.yaml’).load(‘yolov8n.pt’):
    這段代碼首先使用給定的 YAML 配置文件構建一個 YOLO 模型,然後從預訓練的 .pt 文件中加載權重,將權重遷移到新構建的模型中。這使您可以根據自己的需求創建模型結構,然後將預訓練模型的權重用於該結構。這種方法允許您根據不同的目標任務進行微調或擴展。

YOLOv8 模型的每個類別中有五個模型

YOLOv8nYOLOv8sYOLOv8mYOLOv8lYOLOv8x
YOLOv8 Nano是最快和最小的,而YOLOv8 Extra Large(YOLOv8x)是最準確但最慢的

YOLOv8 使用了以下預訓練模型:

  • 在 COCO 檢測數據集上訓練的對象檢測,圖像分辨率為 640。
  • 在 COCO 分割數據集上訓練的實例分割,圖像分辨率為 640。
  • 在 ImageNet 數據集上預訓練的圖像分類模型,圖像分辨率為 224。

訓練指標分析

Intersection over Union指標

IoU(Intersection over Union)是一個用於評估目標檢測和分割任務的常用指標。它主要用於衡量預測的目標與實際目標之間的重疊程度。在機器學習和計算機視覺領域中,IoU通常用於衡量模型的預測準確度,特別是在處理像目標檢測、物體定位和分割等任務時。

IoU的計算方式是將預測的目標區域(通常是矩形框或分割區域)與實際目標區域的交集面積除以它們的聯集面積。公式如下:

其中,交集是預測區域和實際區域的重疊部分,聯集是預測區域和實際區域的整體合併部分。

在目標檢測中,當模型預測的目標框與實際目標框之間的IoU值越高,表示模型的預測越準確。通常,當IoU超過一個預定的閾值(例如0.5或0.7)時,可以將該預測視為成功檢測。這種指標可以用於計算Precision-Recall曲線以及平均精度(Average Precision)等性能指標。

在分割任務中,IoU用於衡量模型預測的分割區域與實際分割區域之間的相似度。當分割區域的IoU越高,表示模型的分割結果越準確。

mAP50(B)

mAP50(B) 是指”Mean Average Precision at IoU 0.50 for Large Objects”,意思是在IoU(Intersection over Union,重疊度)為0.50 的情況下,針對較大目標計算的平均精度(AP)值的均值。 mAP 是模型在不同類別上的平均精度值,而 mAP50(B) 是針對較大目標計算的平均精度值。

mAP50-95(B)

mAP50-95(B) 是指 “Mean Average Precision across IoU 0.50 to 0.95 for Large Objects”,意思是在 IoU 從 0.50 到 0.95 範圍內,針對較大目標計算的平均精度值的均值。這個指標更全面地評估了模型在不同重疊度下的性能。

precision(B)

precision(B) 是針對較大目標計算的精確率,即模型在預測中有多少是正確的,相對於所有預測中的正確和錯誤。它是衡量模型預測的準確性的指標之一。

recall(B)

recall(B) 是針對較大目標計算的召回率,即模型正確預測的目標數與實際目標數之比。它表示模型能夠檢測到多少實際目標。召回率是衡量模型識別能力的指標之一。

dfl_loss(Detection Focal Loss)

dfl_loss 是一種在YOLO目標檢測中引入的特殊損失函數,它是基於焦點損失(Focal Loss)的改進。焦點損失的主要目標是應對樣本不平衡問題,即正負樣本比例嚴重失衡。在目標檢測中,負樣本(即不含目標的區域)遠遠多於正樣本(含有目標的區域)。 dfl_loss 試圖通過放大難以分類的正樣本的損失,來應對這種不平衡,從而使模型更關注難以識別的目標。

box_loss(Box Regression Loss)

這是用於衡量預測框位置的損失函數。在目標檢測中,模型不僅要預測目標的類別,還要預測框的位置,即邊界框的中心坐標、寬度和高度。 box_loss 的目標是使模型的位置預測更接近真實目標框的位置。這有助於確保檢測到的框與真實目標框的位置相匹配,從而提高目標定位的準確性。

cls_loss(Class Classification Loss)

cls_loss 用於分類目標的類別。在YOLO中,每個檢測框需要預測它所屬的目標類別。 cls_loss 的作用是確保模型的類別預測盡可能準確。這對於準確地將檢測框與正確的目標類別關聯非常重要,從而實現了目標分類的準確性。

我的tensorborad訓練狀況

這邊深藍色的是使用YOLOv8m.pt做預訓練模型、淺藍色的是使用YOLOv8n,深藍色的跑了2個多小時(100次),淺藍色的因為懶得跑完只做了60幾次。橘色的是別人訓練的歷程。

為什麼自己訓練的結果即使所有資料集都一樣卻有不同的狀況,需要進一步去了解。