Posted on

pyav介紹

甚麼是pyav

PyAV是FFmpeg的Python封裝,旨在提供底層庫的全部功能和控制,同時盡可能管理繁瑣的細節。PyAV用於直接和精確地訪問媒體,包括容器、流、封包、編解碼器和幀。它還提供了一些數據轉換功能,並幫助您在其他程序之間傳送數據(例如Numpy和Pillow)。

然而,由於媒體處理非常複雜,PyAV無法完全抽像或為您做出所有最佳決策。 如果FFmpeg命令可以滿足您的需求,那麼PyAV可能會成為阻礙。 但在必要時,PyAV是一項關鍵工具。安裝PyAV可能有一些複雜的依賴關係,但現在可以在PyPI上找到針對Linux、Mac和Windows的二進位安裝套件。

官方網站: https://pyav.org/docs/stable/

GitHub位置: https://github.com/PyAV-Org/PyAV

建議使用場景

pyAVffmpeg 都是用來處理影音的工具,但它們的使用場景和方法有所不同。以下是對兩者的比較,以及根據不同情境的建議:

  1. 使用介面
    • pyAV:是一個 Python 函式庫,允許開發者使用 Python 語言來操作影音資料。
    • ffmpeg:是一個命令行工具,通常被用於進行批量處理或在沒有 Python 環境的系統上執行。
  2. 易用性和彈性
    • pyAV:由於是 Python 函式庫,使用者可以利用 Python 語言的所有特性來進行更複雜的操作,比如條件式處理、迴圈等。這使得對於需要更細緻操作的場景,例如資料分析、特定範圍的編輯等,pyAV 更有優勢。
    • ffmpeg:對於直接和簡單的影音轉換、剪裁、合併等操作,ffmpeg 的命令行界面非常適用。它能夠快速完成大部分的基本任務。
  3. 整合和擴展性
    • 如果你正在開發一個 Python 應用程序,並且希望直接在程式中處理影音,那麼 pyAV 可能是更好的選擇。
    • 如果只是簡單的一次性任務,或者需要在不同的平台或系統上腳本化影音處理,那麼 ffmpeg 可能更為適合。

結論

  • 如果你是 Python 開發者,且希望在程式中進行複雜的影音操作,那麼 pyAV 是個不錯的選擇。
  • 如果你只需要執行基本的影音轉換、剪裁或合併等操作,且希望能在多種平台上快速執行,那麼直接使用 ffmpeg 命令行工具可能更加適合。

安裝方法

使用以下方式安裝(如果下面的指令失敗的話,請參考此頁面安裝: https://pyav.org/docs/stable/overview/installation.html)

pip install av

後來我是使用下面這方法安裝成功的(windows)

pip install av --no-binary av
git clone https://github.com/PyAV-Org/PyAV.git
cd PyAV-main
python setup.py build --ffmpeg-dir=C:\ffmpeg

簡單的拉取RTMP源流的範例

以下的範例會拉取rtmp://127.0.0.1/live/testStream並使用OpenCV的函數顯示影像在視窗裡

import av
import cv2
import numpy as np
import os
import signal

def exit(*args,**kwargs):
    os.kill( os.getpid(), 9 )
signal.signal(signal.SIGINT,exit)

print('opening video...')
video = av.open('rtmp://127.0.0.1/live/testStream', 'r')

print('start streaming')
try:
    for packet in video.demux():
        for frame in packet.decode():
            if packet.stream.type == 'video':
                img = frame.to_ndarray(format='bgr24')
                cv2.imshow("Test", img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
except KeyboardInterrupt:
    print(KeyboardInterrupt)
    pass
cv2.destroyAllWindows()
Posted on

Segment Anything研究筆記

Segment Anything介紹

論文網址: https://arxiv.org/pdf/2304.02643.pdf

GitHub地址: https://github.com/facebookresearch/segment-anything

這份內容介紹了「Segment Anything」(SA)計畫,它包括了一個新的圖像分割任務、模型和數據集。使用高效的模型,在數據收集過程中建立了迄今為止最大的分割數據集,擁有超過10億個遮罩和1100萬張的圖像。這個模型設計和訓練成可提示,因此它可以進行zero-shot轉移到一系列任務,通過提示工程(prompt)實現。模型的zero-shot性能印象深刻,通常與或優於以前的完全監督結果競爭。他們公開了「Segment Anything Model」(SAM)和相應的數據集(SA-1B),以促進計算機視覺基礎模型的研究。

SAM模型由圖像編碼器、提示編碼器和遮罩解碼器三個組件組成,旨在實現高效運行和實時互動提示。數據引擎包括三個階段,從手動標註到半自動標註,最後實現完全自動生成遮罩。最終數據集SA-1B包括1100萬張高分辨率圖像和10億多個高質量分割遮罩,可供未來計算機視覺基礎模型的研究使用。該數據集的質量經過詳細分析,結果顯示自動生成的遮罩質量很高。

此外,文中還提到了有關模型效能、數據集特性以及公平性考這份內容介紹了「Segment Anything」(SA)計畫,它包括了一個新的圖像分割任務、模型和數據集。使用高效的模型,在數據收集過程中建立了迄今為止最大的分割數據集,擁有超過10億個遮罩和1100萬張許可和隱私尊重的圖像。這個模型設計和訓練成可提示,因此它可以進行零-shot轉移到一系列任務,通過提示工程實現。模型的零-shot性能印象深刻,通常與或優於以前的完全監督結果競爭。他們釋放了「Segment Anything Model」(SAM)和相應的數據集(SA-1B),以促進計算機視覺基礎模型的研究。

此外,文中還提到了有關模型效能、數據集特性以及公平性考慮的討論。該計畫的目標是促進基礎模型的發展,以應對圖像分割等廣泛的計算機視覺問題。整體來說,這個計畫提供了一個重要的資源,用於研究和開發計算機視覺基礎模型。

Segment Anything做了甚麼

1. 啟示來源:

  • 啟發自NLP的標記預測任務,並考慮如何為分割任務設計基礎模型

2. 定義分割任務:

  • 基於NLP的提示概念,SAM將其轉化為分割。提示可以是前景/背景點、粗略框、遮罩、或自由文本
  • 任務目標是根據給予的提示返回有效的分割遮罩。即使提示模糊,輸出仍應是合理的遮罩。

3. 預訓練策略:

  • 透過模擬各類提示序列進行預訓練,並將模型預測的遮罩與實際情況對照。
  • 即使遇到歧義的情境,如衣服與人的示例,模型仍應該能提供有效的遮罩。

4. 零樣本轉移:

  • 預訓練賦予模型根據不同提示進行推理的能力。
  • 通過工程化特定的提示,例如使用邊界框檢測器,可以解決具體的下游分割任務。

5. 分割的多面性:

  • 分割技術包括互動分割、邊緣檢測、超像素化等多種方法。
  • 本研究旨在產生一通用模型,可以適應多數分割任務,並透過提示工程來達成。

6. 與多任務分割的區別:

  • 傳統的多任務分割模型針對一組固定任務訓練,但SAM的模型在推理階段可以適應和執行不同的任務

7. 深入討論:

  • 提示和組合提供了一種策略,使模型更具擴展性,能夠完成許多不同的任務。
  • 透過組合的策略,模型可以作為更大系統的一部分進行運作,例如結合現有的對象檢測器進行實例分割。
從這個圖可以看出,SAM可以從同一個點的提示輸入,對照至多個不同的輪廓,這可以讓模型更具擴展性,藉由後續的訓練和組合完成更多不同的任務

Segment Anything Model (SAM) 簡介

SAM 是為了可以應對提示的分割而設計的模型。它主要包含三個組件:

  1. 圖像編碼器(image encoder):基於擴展性和強大的預訓練方法,SAM使用經過預訓練的Vision Transformer (ViT) 來適應處理高分辨率的輸入。該圖像編碼器每張圖片只運行一次,可以在對模型給出提示之前先運行。
  2. 提示編碼器(prompt encoder):SAM考慮兩組提示:稀疏(如點、框、文本)和密集(如遮罩)。SAM使用位置編碼來表示點和框,並為每種提示類型加上學到的嵌入;自由形式的文本則使用CLIP的文本編碼器。對於密集的提示(即遮罩),SAM使用卷積來嵌入它,並與圖像嵌入進行元素級的相加。
  3. 遮罩解碼器(mask decoder):該解碼器有效地映射圖像嵌入、提示嵌入以及輸出令牌到一個遮罩。在經過兩個解碼器區塊後,SAM放大圖像嵌入,然後使用一個MLP將輸出令牌映射到一個動態線性分類器,進而計算每個圖像位置上的遮罩前景概率。
這張圖展示了SAM模型的整體流程。一個高效的圖像編碼器會輸出一個圖像嵌入(表示),然後可以被各種不同的輸入提示有效地查詢,以實時的速度產生物體的遮罩。對於對應多於一個物體的模糊提示,SAM能夠輸出多個合法的遮罩以及相關的信心分數。

解決模糊性:對於模糊的提示,模型可能會輸出多個合理的遮罩。為了解決這一問題,SAM修改模型使其能夠對單一提示預測多個輸出遮罩。SAM發現3個遮罩輸出通常足以應對大多數常見情況。模型還會為每個遮罩預測一個信心分數(即預估的IoU)。

效率:整體的模型設計主要是考慮到效率。給定一個預先計算的圖像嵌入,提示編碼器和遮罩解碼器可以在一個網頁瀏覽器上、在CPU上、在約50ms內運行。這樣的運行效能使得SAM的模型可以實時互動地給出提示。

損失和訓練:SAM使用focal loss和dice loss的線性組合來監督遮罩預測。SAM使用幾何提示的混合來訓練可提示的分割任務。SAM模擬一個互動設置,每個遮罩隨機抽樣提示11輪,使SAM能夠無縫地融入數據引擎中。

Zero-Shot Transfer 實驗

「零樣本遷移」是機器學習中的一個概念,主要關注如何讓模型在沒有直接經過訓練的任務或類別上表現得很好。以下是其詳細解釋:

零次轉移(Zero-Shot Transfer)簡介:

  1. 定義:在機器學習中,當我們訓練一個模型來處理某種任務或分類某些類別,但希望它能夠處理從未見過的新任務或新類別時,我們稱之為「零次轉移」換言之,模型從未直接在某些任務或類別上進行過訓練,但希望我們仍然能夠在這些任務或類別上表現良好。
  2. 如何實現:這通常是透過利用與目標任務或類別相關的一些額外資訊來實現的,例如語義關係或屬性。例如,在圖像分類中,即使模型從未見過「斑馬」這個類別,但透過知道斑馬是黑白條紋的、與馬相似的動物,模型可能能夠正確地辨識出斑馬。
  3. 應用:零樣本學習的應用範圍廣泛,包括圖像分類、文字分類、語音識別等。在現實世界中,我們經常遇到新的任務或類別,而不是總是從頭開始訓練新的模型,所以零次轉移學習提供了一個有效的方法來適應這些新情境。
  4. 與其他轉移學習的區別:轉移學習通常意味著將一個任務中學到的知識應用到另一個相關任務中。當這種轉移不涉及模型中從未見過的新類別時,它被稱為“有的轉移學習」或「少射程學習」。而當轉移涉及到完全未見過的監督類別時,它被稱為「零次轉移學習」。

總之,「零次轉移」是關於如何使機器學習模型具有更強的泛化能力,從而能夠處理它從未直接經歷過的任務或類別。

在這篇論文中,我們提示SAM來:(1) 執行邊緣檢測,(2) 分割所有內容,即物體提議生成,(3) 分割檢測到的物體,即實例分割,以及(4) 作為概念驗證,從自由格式文本中分割物體。下圖為測試結果:

從單個前景點分割出一個對象。但由於一個點可能指向多個對象,這樣的任務定義起來是不確定的。大多數數據集的真實遮罩並未列出所有可能的遮罩,使得自動度量可能不可靠。因此,我們除了標準的mIoU指標外,還進行了一項由標註者對遮罩質量進行1(無意義)到10(完美)評分的人類研究。

結果:

  • 在使用mIoU的全套23個數據集的自動評估中,與RITM比較,SAM在其中16個數據集上表現更好。
  • 在進行歧義解決的“神諭”實驗中,SAM在所有數據集上都超過了RITM。
  • 人類研究的結果顯示,評分者總是將SAM的遮罩質量評分為高於RITM。而且,SAM的平均評分落在7到9之間,這意味著其遮罩質量相當好。

其他觀察:

  • 當點的數量從1增加到9時,各方法之間的差距會減少。
  • 使用隨機點取樣替代默認的中心點取樣時,SAM與基線之間的差距變得更大,但SAM在兩種取樣方法下都能獲得相似的結果。

使用SAM進行智慧標記

Roboflow採用了SAM來進行智慧標記,使用狀況可參考下面的影片

Posted on

U2Net模型的去背應用

官方GitHub: https://github.com/danielgatis/rembg/tree/main

安裝方式

CPU support

pip install rembg # for library
pip install rembg[cli] # for library + cli

GPU support

首先要去安裝onnxruntime-gpu,接著

pip install rembg[gpu] # for library
pip install rembg[gpu,cli] # for library + cli

使用範例

下面為一個讀取攝影機的簡單去背使用範例

import VideoStream
import cv2
import numpy as np
import time
from rembg import new_session, remove

videostream = VideoStream.VideoStream((1280, 720), 30, 0).start()
cam_quit = 0
total = 0
frame = 0

while cam_quit == 0:
    imageSource = videostream.read()
    imageSource = cv2.resize(imageSource, (640,360))
    aStart = time.time()
    # u2netp為model名稱
    output = remove(imageSource, session = new_session("u2netp") )
    aEnd = time.time()
    if frame <= 60:
        total = total + (aEnd - aStart)
        frame = frame + 1
    print("detect time: " + str(aEnd - aStart ))
    cv2.imshow("output", output)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        print("avg detect time: " + str(total/frame))
        cam_quit = 1

videostream.stop()
cv2.destroyAllWindows()

Stable Diffusion WebUI Rembg

Stable Diffusion WebUI所使用的去背功能也是這個唷!

相關介紹文章: https://zhuanlan.zhihu.com/p/648234420

可以參考WebUI的參數去尋找相關程式碼可設定的部分,例如Erode size、Foreground threshold、Background threshold

模型去背測試

原始影像如下圖

模型列表

u2net

  • 檔案大小: 171,873KB
  • 處理時間: 1.741s

u2netp

  • 檔案大小: 4,468KB
  • 處理時間: 0.702s

u2net_human_seg

  • 檔案大小: 171,873KB
  • 處理時間: 1.997s

u2net_cloth_seg

  • 檔案大小: 172,066KB
  • 處理時間: 5.496s

silueta

  • 檔案大小: 43,138KB
  • 處理時間: 5.496s

isnet-general-use

  • 檔案大小: 174,461KB
  • 處理時間: 2.629s

isnet-anime

  • 檔案大小: 171,944KB
  • 處理時間: 2.533s
Posted on

影像分割模型介紹

Image Segmentation介紹

影像分割(Image Segmentation)是電腦視覺中的一個基本任務,目的是將數字影像劃分成多個片段(或稱為「超像素」),使得具有相似性質的像素群組成同一片段。影像分割的目的是簡化或改變影像的表示形式,使其更容易被分析。以下是關於影像分割的詳細介紹:

  1. 目標
    • 將影像中具有相似特性(如顏色、強度、紋理)的像素分到同一區域。
    • 賦予影像的每一個像素一個標籤,該標籤指示該像素屬於哪一物體或區域。
  2. 分割技術類型
    • 閾值分割:根據像素值的閾值將影像分成兩個或多個部分。
    • 基於區域的分割:從種子點開始,將相鄰的像素添加到區域中,直到符合某些條件。
    • 基於邊緣的分割:檢測影像中的邊緣(突然的強度變化)來劃分區域。
    • 基於聚類的分割:例如 K-means,將像素分為擁有相似特性的多個群體。
    • 神經網路和深度學習:如 U-Net, DeepLab 等模型,用於更複雜的影像分割任務。
  3. 應用
    • 醫學影像:例如,從 MRI 影像中識別出不同的器官或病變區域。
    • 遙感:劃分地表的不同區域,如水域、森林、城市等。
    • 物體識別和跟踪:識別影像中的特定物體。
    • 電腦視覺任務:如場景理解、影像修復、3D 建模等。
  4. 評估
    • 可以使用像 Jaccard 系數(Intersection over Union, IoU)這樣的指標來評估分割模型的性能。

影像分割作為電腦視覺中的一個核心任務,在許多應用中都扮演著重要的角色,且隨著深度學習的發展,其效果和應用領域持續擴展。

使用深度學習做影像分割

深度學習和神經網路在影像去背上已取得了驚人的成果。常見的模型如下:

  1. U-Net 結構:
    • U-Net是一種用於影像分割的卷積神經網路(CNN)結構。
    • 它具有縮小(下採樣)和擴展(上採樣)的部分,使其形狀像字母“U”。
    • U-Net非常適合進行像素級別的分類,如分離前景和背景。
  2. Mask R-CNN:
    • Mask R-CNN是一種用於實例分割的方法,可以同時偵測物件並生成對應的遮罩。
    • 它結合了Faster R-CNN(用於物件偵測)和一個額外的遮罩分支。
  3. DeepLab:
    • DeepLab是一個強大的影像分割模型,它使用了空間金字塔池化和全卷積網路。
    • 它能夠精確地捕捉物件的邊界,使其適合去背任務。

火紅的模型U-Net介紹

網路的介紹文章: https://ithelp.ithome.com.tw/articles/10240314

  • 起源:U-Net 最初是為了醫學影像分割而設計的,特別是在數據集相對較小的情境下。
  • 架構:U-Net 架構具有對稱的編碼器和解碼器部分。編碼器進行下採樣,而解碼器進行上採樣。兩者之間有跳躍連接,這意味著對應的編碼器和解碼器層之間的特徵被結合在一起,這有助於模型獲取更精確的位置信息。

去背改良版U2NET

網路相關教學文章: https://blog.csdn.net/xuzz_498100208/article/details/109912302

  • 起源:U^2-Net 被設計為一個更深的網絡結構,用於進行較為複雜的影像分割和去背工作。
  • 架構:U2-Net 的名稱意味著「U-Net 的 U-Net」,這是因為它的設計理念是將多個 U-Net 結構嵌套在一起。具體來說,它利用了深層和淺層的嵌套U-Net架構來捕獲多尺度特徵。U2-Net 的重要組件是其嵌套的殘差結構,這有助於模型學習從各種層次獲取的資訊。U2-Net的架構包括六個編碼器階段和五個解碼器階段,以及一個用於融合顯著地圖的模塊。它通過嵌套的U結構從不同階段有效提取多尺度特徵,從而實現了顯著對象檢測的優異性能。該方法對於克服現有骨幹網絡的限制和提高檢測性能具有重要意義。
  • 特性:由於其深度和複雜的架構,U^2-Net 在某些情境下可能比 U-Net 有更好的性能,特別是在需要捕獲多尺度特徵的情境下。
Posted on

Transformer 模型於機器視覺的應用

論文來源 – CAPABILITIES – Vision

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

On the Opportunities and Risks of Foundation Models

Transformer 模型帶來的突破

通過大規模的自我監督學習,Transformer模型可以將多模態的原始感官資料轉化為視覺知識。這不僅有助於傳統的感知任務,還可能開創對時間和常識推理的新方法。這些資料可以來自不同的數據源和領域,顯示出在醫療和互動式感知環境中有廣泛的應用潛力。

在電腦視覺領域,Transformer模型能將來自多種來源和感測器的原始資料轉化成視覺知識,此知識適用於多種應用場景。這種思路其實是過去十年在該領域漸漸發展起來的。尤其是ImageNet的出現和監督式預訓練的技術,都帶領了電腦視覺朝向深度學習的方向演變。現今的深度學習模型超越了早期的傳統方法,能夠在大量資料上訓練後,再應用於如圖像識別、物件偵測和圖像分割等不同任務,這樣的思維持續為Transformer模型所採納。

Transformer模型的發展背後是先前方法的限制。傳統的監督學習需要昂貴且仔細收集的標籤,這限制了它的穩定性、泛化性和適用性。相對地,自我監督學習的進步為發展Transformer模型提供了新路徑,讓它能從大量的原始資料中獲取對視覺世界的上下文理解。雖然相對於整個領域的廣泛目標,Transformer模型的能力還在初級階段,但已在傳統電腦視覺任務上展現出增強的泛化能力,且預計這種進展會持續。長遠來看,Transformer模型減少對明確標籤的依賴可能會帶來如常識推理等基礎認知技能的進步,這在傳統監督學習中一直難以達成。

過去機器視覺的關鍵功能

這些任務涵蓋了電腦領域的多個方面,包括:

  1. 影像分類:將影像分為不同的類別或標籤,通常使用複雜神經網路(CNN)等深度學習模型進行分類。
  2. 目標偵測:辨識影像中的特定物體,並確定它們的位置和邊界框。
  3. 語意分割:將影像的分配到特定的像素類別,以實現像素級的影像分割。
  4. 動作辨識:辨識影像序列中的動作或運動,通常用於影片分析和動作捕捉。
  5. 場景圖產生:產生影像描述場景中物件以及它們之間關係的場景圖。
  6. 幾何、運動與3D任務:頭部了深度估計(工件的距離或深度資訊)、運動結構(推斷物體的運動)、表面法向偵測(辨識物體表面的法向方向)、曲率線(偵測物體的運動)曲率資訊)和關鍵點估計等3D任務。

深度學習模型的主要進展源於ImageNet資料集的引入。通常,模型先在像圖像分類這樣的監督訓練任務上進行訓練,然後根據特定的任務和資料集進行調整,以適應該任務或領域的需求。

電腦視覺任務在多種實際應用中,如自動駕駛、影像編輯、機器人和醫學影像分析都起到關鍵作用。深度學習的進步已大大提高了這些任務的效能,使其更符合實際需求。

新的視覺合成和無監督學習領域

  1. GANs:透過一對競爭的生成器和判別器,GANs能夠創建具有個性和活潑的視覺內容。它們互相學習而不需要明確的監督,使GAN成為強大的視覺內容生成工具,廣泛應用於圖像生成和擴增實境。
  2. VAEs:VAE是機率型的生成模型,能在無監督下學習視覺特性。透過學習潛在的表示,它對生成圖像有出色的能力。
  3. 對比學習:這是一種自我監督方法,透過分析資料樣本的相似性來學習特徵。常用於如影像檢索和確定相似性的任務中。
  4. 視覺屬性推論:某些神經模型能夠推測圖像中的特性,如顏色或形狀,即使沒有明確標籤。這通常利用自我監督方法,如重建或對比學習。
  5. 結合架構與規模:最新研究利用靈活的神經網路,如資料視覺轉換器,和大型訓練資料集,達到更佳的視覺合成和無監督學習效果。這增強了模型的規模和效能。

這些發展使得視覺合成和無監督學習在電腦視覺領域具有更廣泛的應用前景,有助於提高影像生成、影像處理、場景合成等任務的表現。同時,這些技術也為自動駕駛、虛擬實境、影像增強等領域提供了更多的可能性。

在無需明確標籤或註釋的訓練中,樣本的適應效率提高。視覺合成領域尤其如此,DALL-E就是一明例。但需了解,電腦視覺的基礎模型相比自然語言還在初階。圖像不僅包含物理場景理解、視覺常識、時間事件等,還涉及社會觀點。雖然這些都是目標,但因關注範疇廣,實際應用仍有挑戰。如,視覺問答系統在回答需常識理解的問題時表現不佳,因這類問題通常需外部知識,非單從圖像獲取。

Transformer 模型於機器視覺的可能應用

基礎模型的五個關鍵屬性:
表達能力——靈活地捕獲和表示豐富的資訊;
可擴充性 ─ 高效使用大量資料;
模式——將各種模式和領域連接在一起;
記憶能力——存儲大量積累的知識;
組合能力——概括到新的上下文、任務和環境。
  1. 環境智慧於醫療保健和家居:在這些場合,利用現有的智慧技術,transformer模型或許能更細緻地偵測人類活動和醫療狀況,並優化醫生、患者和消費者之間的交互體驗。
  2. 移動和消費者應用:具備更強大的多模態銜接的transformer模型可以在移動場景中提供更高效的互動,而該模型在視覺和語言生成上的進步也能讓計算攝影和內容編輯得到裨益。
  3. 機器人交互:transformer模型在機器人環境中的雙重輸入已被證實是有效的;基於大量自我為中心的視覺資料(真實或模擬,人或機器人)訓練的transformer模型可能通過捕捉更多的場景、視覺和動作來推進此領域。

Transformer 模型的可能挑戰

  1. 圖像理解與泛化:人類具有獨特的能力,可以清楚地解讀不易辨識的結構圖,並推斷出物體和場景的物理和幾何特性。雖然目前的transformer模型在圖像合成及細緻語言輸入的泛化上展現了潛力,但它們仍然難以適應簡單的形狀和顏色組合。泛化不僅僅是語義層面;視覺場景和物體自身都遵循特定的物理和幾何法則。transformer模型已初步掌握了對場景和物體幾何形狀的認知,且早期對物理場景和幾何形狀理解的研究,可能為transformer模型的進一步發展提供有益的方向。
  2. 計算效率與模型建立:當涉及到解析視覺、場景和事件的動態畫面時,人類展現了高效的能力。這些動態視覺流對於捕捉事件變化是十分重要的。Transformer模型已在模擬事件的長期連續性方面顯示初步能力,對於機器人等應用中的時間序列和因果一致性建模尤為有益。然而,相較於語言中的文字標記,低級的視覺輸入具有高維度:例如,一張1080p的圖像包含超過200萬像素。在這種背景下,模擬更多元的事件動態,特別是當涉及其他模式(如語音、光流等)和更高解析度時,是一大挑戰。顯然,處理每個像素是具挑戰性的。當前的視覺Transformer模型經常透過整合圖像區塊或多幀的嵌入來解決此問題,但這種做法可能會遺失某些細節。
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

如何把docker image推到AKS

請參考此說明: https://docs.docker.com/cloud/aci-integration/

首先請登入Azure

會跳出瀏覽器登入Azure的帳號和docker做連接

docker login azure

接著創立aci的context

docker context create aci myacicontext

使用docker context ls可以檢視現在有哪些context

接著這樣就可以把image部屬上AKS了

docker --context myacicontext run -p 80:80 nginx

推送自建的container

https://learn.microsoft.com/zh-tw/training/modules/intro-to-containers/7-exercise-deploy-docker-image-to-container-instance

1.建立容器

2. 改名並推送上去

docker tag reservationsystem:latest <registry-name>.azurecr.io/reservationsystem:latest
docker image ls
docker login <login-server>
docker push <registry-name>.azurecr.io/reservationsystem:latest