發佈日期:

讓你的ChatGPT更強大 – PDF分析

讓ChatGPT可以上傳、分析PDF的好工具

這個工具可以讓ChatGPT可以閱讀內容很長的PDF檔案,而且不用Plus也可以使用,可以讓使用者就PDF的內容來發問,CHATGPT會依照PDF的內容來回答

現在有人開發了AI PDF的工具,也可以嘗試看看: https://chat.openai.com/g/g-V2KIUZSj0-ai-pdf

但是這個工具一定要付費的ChatGPT Plus才可使用,所以如果沒有Plus的人,可以使用下面的Chrome插件的方式

Chrome插件下載

ChatGPT Sidebar & File Uploader

啟用之後你的ChatGPT會增加上傳檔案的按鈕(非Plus用戶也可以唷!)

設定外掛

至下列網址設定外掛行為: chrome://extensions/

如果沒有設定的話,這個的Sidebar在每個站都會有,我在這邊讓他只能夠影響到ChatGPT這個站,下面的三個開關則請憑自己的喜好去設定

設定PDF檔案內容分段的prompt

這邊我是建議要改用中文來寫,不然他回答都會一直是英文,後面問答用中文問的效果也會很差,但一開始prompt就用中文下的話,回答的內容都還算正確

下面是我設定的值

Single Part Prompt

#zh-TW
下面是文件完整的資訊,請幫我做此文件資料的總結

Multi Part First Prompt

#zh-TW
我所分享的此份文件會被分成很多個部分,請等待我輸入所有部分,接著再做全部資料的總結,在這之前,請單單回應 “了解,我會等待其餘的部分輸入”

Multi Part Consecutive Prompts

#zh-TW
這是此份文件分段的其中一部份,請回應”了解,我會等待其餘部分的輸入”

Last Part Prompt

#zh-TW
這是最後一部分,請仔細地觀看全部的文件,在之後的問題中,回應我這份文件的相關資訊 ,請單單回應 “了解,我會整理從第一部份至最後一部分的資訊”

設定分段的長度

這邊可視你的ChatGPT的版本來設定,一般來說,就是Token長度,不可以超過長度上限

特點/模型Bard (Google)ChatGPT (OpenAI)ChatGPT Plus (OpenAI)Bing (Microsoft)Claude (Anthropic)
上下文窗口 長度(Token)32K4K8K8K100K
推理能力不錯最佳最佳不明不錯
網路連接功能原生支持網路搜尋無法讀取網頁需連至Bing取得網頁內容所有用戶可用的連接功能無法讀取網頁
多模態能力支持文字、圖像、語音輸入支持圖像、語音及文字輸入,以及圖像、文字、檔案輸出支持文字輸入,圖像、文字輸出支持PDF等檔案的文字讀取
建議用途圖像辨識初次接觸者皆可資訊搜尋長文PDF摘要
費用免費免費每月$20美金免費免費
主要用途研究、資料分析、聊天程式碼開發、聊天多模態及與其他服務的串接應用網路搜尋、聊天研究、分析
發佈日期:

讓你的ChatGPT更強大 – Zapier AI Actions

Zapier是甚麼

Zapier 是一個無需編寫代碼的自動化工具,用於連接和自動化不同應用程序。它允許你創建自動化工作流程(Zaps),觸發事件(如新郵件)將啟動操作(如將附件上傳到雲端硬盤),提高生產力並節省時間。 Zapier 支持數千種應用程序,包括常見的工作工具、社交媒體和電子郵件服務。

在ChatGPT Plus使用API連接Zapier可以做到甚麼

與其他應用程式連動 – 通訊錄

與其他應用程式連動 – 日曆

與其他應用程式連動 – Gmail

如何建立連動

首先,你一定要付費成為ChatGPT Plus會員,這樣才會能夠在你的ChatGPT裡面串接外部API

接著,建立一個你自己專屬的My GPTs,選擇Create a GPT

接著,這邊有詳細的設定教學(https://actions.zapier.com/docs/platform/gpt)

首先,複製這串網址

https://actions.zapier.com/gpt/api/v1/dynamic/openapi.json?tools=meta

選擇最下面的Create new action,接著選擇Import from URL,把剛剛的網址貼上去

設定Zapier方的權限

這邊的設定就和ChatGPT本身無關,而是Zapier這邊的權限控管,如果ChatGPT的這個對話功能不會只有自己使用的話,也要教所有使用者如何允許ChatGPT去存取他的Zapier帳號

提供配置 URL

我們為您提供了一個支援自然語言參數的網址,供您在 GPT 中使用,您可以在其中指定操作名稱,也可以選擇包含特定欄位值詳細資訊。使用 https://actions.zapier.com/gpt/start 作為基礎。

它支援兩個可選的查詢參數:

  • setup_action 與操作名稱
  • setup_params 用於欄位指令(提供某些欄位值,例如進行 AI 猜測,或說不包含某些欄位)

例如,下面的連結將為 Google 日曆尋找電子郵件設定新操作,並將開始時間和結束時間欄位設為讓 AI 猜測.立即嘗試此處或造訪此網址:

https://actions.zapier.com/gpt/start?setup_action=google calendar find event&setup_params=set have AI guess for Start and End time

把下面的文字加入ChatGPT的Instructions欄位裡面,教導GPT如何引導使用者去開啟Zapier權限

###Rules:
- 在操作之前,我需要確認您是否已登入並設定了 Zapier 的 AI Actions。這是進行下一步所必需的。
- 假入已經登入的話,開始下面的步驟

###Instructions for Zapier Custom Action:
Step 1. 我將首先檢查您是否擁有完成此請求所需的 Zapier AI Actions。我會呼叫 /list_available_actions/ 來列出可用的操作。 假如REQUIRED_ACTION可以在AVAILABLE ACTIONS之中找到的話,則到Step 4,否則則到Step 2。

Step 2. 如果所需的操作不可用,我將向您發送所需操作的配置連結。您需要根據該連結配置 Zapier AI Action,並在完成後通知我。

Step 3. 一旦您確認已配置所需的操作,我將繼續處理您的原始請求。

Step 4. 使用在/list_available_actions/ 的JSON 回應中傳回的id 欄位(在results 陣列中),我將填寫運行操作所需的字串。我將根據您的請求填寫指令和任何其他必要的欄位。 

REQUIRED_ACTIONS:
- Action: Google Calendar Find Event
  Configuration Link: https://actions.zapier.com/gpt/start?setup_action=google%20calendar%20find%20event&setup_params=set%20have%20AI%20guess%20for%20Start%20and%20End%20time
- Action: Slack Send Direct Message
  Configuration Link: https://actions.zapier.com/gpt/start?setup_action=Slack%20Send%20Direct%20Message

日曆功能的GPT 演示

實驗心得

這個Action應該非常花費額度, 因為我的Plus沒呼叫幾個Action就會額度用完了,而且在呼叫Action的時候,或許是驗證問題,或許是額度不足失敗問題,會導致很多機會沒辦法照著我們的想法去走。

但是在ChatGPT內可以串接自己的API連接到自己的網站功能裡,真的非常強大,很期待日後系統越來越穩定,功能越來越健全後此功能的可能未來性

參考資料

Create custom versions of ChatGPT with GPTs and Zapier

AI Actions

發佈日期:

YOLOv8使用範例

建模的範例

先用下面指令安裝好所需的套件

pip install ultralytics

然後在Roloflow下載要訓練的素材集,選擇YOLOv8

把裡面的資料(含data.yaml)解壓縮在同層資料夾下,如圖

接著直接執行下面的程式,yolov8會自動下載所需要的yolov8.yamlyolov8n.pt

import multiprocessing
import os
from ultralytics import YOLO
os.environ['CUDA_LAUNCH_BLOCKING'] = '1'

def my_function():
    model = YOLO('yolov8.yaml').load("yolov8n.pt")
    # Train the model
    model.train(data='./data.yaml', epochs=300, imgsz=640)
    model.val(data="./data.yaml")

if __name__ == '__main__':
    multiprocessing.freeze_support()  # Optional, if you're freezing the script
    my_function()

這時候會出現錯誤如下,因為資料集放在哪邊也是剛剛才自動下載的,所以我們要打開一下這個設定檔案,設定一下我們的資料集的正確位置(datasets_dir)

看到這些訊息就代表成功的開始建模型囉!

模型使用範例

重點是在這行

model = YOLO('best.pt')

這行在載入我們建好的模型

results = model(image, show=False, verbose=False)

model這個預測方法有很多可控制的參數,例如要不要直接秀出圖片、要不要存圖片等等

YOLOv8非常貼心的是在於說,其吐出的物件如result,只要print這個物件,就會有非常詳細的結構和屬性意義教學,在開發上非常的方便

import VideoStream
import cv2
import numpy as np
from ultralytics import YOLO


videostream = VideoStream.VideoStream((1280, 720), 30, 0).start()
cam_quit = 0
model = YOLO('best.pt')
# 繪製邊框和標籤
def detect(image):
    results = model(image, show=False, verbose=False)
    # Show the results
    result = list(results)[0]
    for i in range(len(result.boxes)):
        r = result[i].boxes
        cls = int(r.cls[0].item())
        xywh = r.xywh[0].tolist()
        x_center, y_center, width, height = [int(x) for x in xywh[:4]]
        if width < 100 and height < 100:
            x1 = int(x_center - (width / 2))
            y1 = int(y_center - (height / 2))
            x2 = x1 + width
            y2 = y1 + height
            cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 3)
            cv2.putText(image, result.names[cls], (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 1, cv2.LINE_AA) 

while cam_quit == 0:
    imageSource = videostream.read()
    imageSource = cv2.resize(imageSource, (960, 540))
    detect(imageSource)
    cv2.imshow("image", imageSource)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        cam_quit = 1

videostream.stop()
cv2.destroyAllWindows()

發佈日期:

OBS開啟時可使用的相關指令

官方介紹

官方啟動指令介紹頁面: https://obsproject.com/kb/launch-parameters

如何使用啟動指令

要使用自定義啟動參數創建 OBS Studio 的捷徑:

  1. 複製一個指向 OBS Studio 的捷徑,或選擇一個已存在的捷徑(從「開始」菜單、工作欄等處)。
  2. 右鍵點擊捷徑,然後點擊「屬性」。
  3. 在目標欄位中,obs64.exe 路徑後面添加啟動參數(如左圖所示)。

若要通過計劃任務或其他自動方式啟動 OBS Studio,請確保也設置了工作目錄(「開始於…」),該目錄必須指向 obs64.exe 所在的文件夾。

啟動參數介紹

OBS Studio 支援的啟動參數(Launch Parameters)。這些參數用於自動化和便攜式使用。每個參數都有特定的功能,可以在啟動 OBS Studio 時進行特定的操作或設定。

參數及其描述如下:

  • --help, -h:獲取可用參數的列表。
  • --version, -v:獲取 OBS 的版本。
  • --startstreaming:自動開始直播。
  • --startrecording:自動開始錄影。
  • --startvirtualcam:自動開始虛擬攝影機。
  • --startreplaybuffer:自動開始重播緩存。
  • --collection "name":使用指定的場景集合啟動。
  • --profile "name":使用指定的配置檔啟動。
  • --scene "name":使用指定的場景啟動。
  • --studio-mode:啟動時啟用 Studio 模式。
  • --minimize-to-tray:啟動時最小化到系統托盤。
  • --portable, -p:使用便攜模式。
  • --multi, -m:啟動多個實例時不顯示警告。
  • --always-on-top:啟動時開啟「總在最前面」模式。
  • --verbose:使日誌更詳細。
  • --unfiltered_log:禁用日誌過濾(不抑制重複行)。
  • --disable-updater:禁用內置更新器(僅限 Windows/macOS)。
  • --allow-opengl:在 Windows 上允許 OpenGL 渲染器。
  • --only-bundled-plugins:僅使用內建模組啟動。
  • --safe-mode:強制 OBS 以安全模式啟動,禁用所有第三方插件、腳本和 WebSockets。
  • --disable-shutdown-check:禁用不潔關機檢測,該檢測會提示以安全模式啟動。
  • --disable-missing-files-check:禁用啟動時可能出現的缺失文件對話框。

這些參數提供了更多的控制和靈活性,使使用者可以根據自己的需求和工作流程自定義 OBS Studio 的啟動和運行方式。

發佈日期:

JavaScript H.264 解碼器介紹 – Broadway

Broadway介紹

Broadway 是一個 JavaScript H.264 解碼器。H.264 是一個廣泛使用的視頻壓縮標準,Broadway 提供了一種在瀏覽器中,特別是不支持該格式的瀏覽器中,直接解碼 H.264 視頻的能力。

主要特點

  1. 純JavaScript:Broadway 是完全用 JavaScript 寫的,這意味著它可以在任何支持 JavaScript 的平台上運行,不需要任何外部插件或擴展。
  2. 多線程支持:Broadway 可以在主線程上運行,也可以在背景工作線程上運行,從而提高性能和響應性。
  3. 網頁集成:使用 Broadway,開發者可以輕鬆地在網頁上集成 H.264 視頻播放功能,無需依賴外部播放器或插件。

Live Demo

當首次訪問上述示範頁面時,可能會感覺視頻播放器的速度有點慢,這是因為它需要首先下載整個視頻才能開始播放。但請有耐心,一旦視頻下載完畢,您可以點擊播放器來觀看視頻。

上面的左上角播放器在主線程上運行,而其餘的播放器在背景工作線程上運行。

本機端使用範例

把Player資料夾內的檔案下載下來,放進本地端的node.js專案的Player資料夾內

檔案連結: https://github.com/mbebenita/Broadway/tree/master/Player

接著撰寫node.js程式

const express = require('express');
const http = require('http');
const path = require('path');
const socketio = require('socket.io');

let eApp = express();
let server = http.Server(eApp);
let io = socketio(server, { pingInterval: 3000, pingTimeout: 60000 });

// 設定靜態檔案的路徑
eApp.use(express.static(path.join(__dirname, '..', 'Player')));

io.on('connection', (socket) => {
    console.log('A user connected');
    socket.on('disconnect', () => {
        console.log('A user disconnected');
    });
});

let config = {
    port: 8080  // 依您的URL端口設定為8080
};
server.listen(config.port, '0.0.0.0', () => {
    let address = server.address();
    console.log(`Server running at ${address.address}:${address.port}`);
});

接著開啟電腦的http://127.0.0.1:8080/treeDemo.html,就可以在本機運行可動的範例了

發佈日期:

幾個使用PYAV的簡單範例

使用PYAV的前提

PyAV 是FFmpeg函式庫的 Pythonic 綁定。目標是提供底層庫的所有功能和控制,但盡可能管理細節。

PyAV 可透過容器、串流、封包、編解碼器和影格直接、精確地存取您的媒體。它公開了該資料的一些轉換,並幫助您將資料傳入/傳出其他套件(例如 Numpy 和 Pillow)。

這種權力確實伴隨著一些責任,因為與媒體合作非常複雜,PyAV 無法將其抽象化或為您做出所有最佳決策。如果該ffmpeg命令無需您竭盡全力即可完成工作,那麼 PyAV 可能會成為障礙而不是幫助。

所以如果我們想要在推流前處理串流、或者是拉流後處理串流內容,或者是更改串流編碼的相關資訊等【較難直接使用ffmpeg指令達到的事情時】,才較適合使用PYAV。

用RTMP的方式推流

範例程式碼如下:

import av
import asyncio
import cv2
import numpy as np
import threading
import time
from av import VideoFrame
from av.codec import CodecContext

# Define the RTMP server URL
rtmp_url = 'rtmp://127.0.0.1/live/test1'  # Replace with your RTMP server URL

# Function to capture webcam frames and push to RTMP server
def capture_and_push():
    # Open the video capture device (webcam)
    cap = cv2.VideoCapture(0)

    # Create an output container for the RTMP stream
    output_container = av.open(rtmp_url, 'w', format='flv')

    # Set up video stream parameters
    video_stream = output_container.add_stream('h264', rate=30)
    video_stream.width = 640
    video_stream.height = 480
    # Create a codec context for H.264 encoding
    codecContext = CodecContext.create('h264', 'w')

    # Create a thread for encoding and pushing frames
    def encode_and_push_frames():
        while True:
            ret, frame = cap.read()
            if not ret:
                break

            # Convert the frame to a VideoFrame
            frame = VideoFrame.from_ndarray(frame, format='bgr24')
            frame.pts = frame.pts
            frame.time_base = frame.time_base

            # Encode the frame and write it to the output container
            packet = video_stream.encode(frame)
            
            output_container.mux(packet)

    encode_thread = threading.Thread(target=encode_and_push_frames)
    encode_thread.start()

    # Wait for the encode thread to finish
    encode_thread.join()

    # Release the video capture device and close the output container
    cap.release()
    output_container.close()

if __name__ == "__main__":
    capture_and_push()

輸出透明背景的影片

若要使用 pyav (Python 的 ffmpeg/avconv 綁定) 來輸出具有透明背景的影片,你通常會使用像 ProRes 4444 或者 VP9 (與 WebM 容器一同使用) 這類的編碼器,因為它們支持 alpha 通道 (透明度)。

import av
import numpy as np

# 定義影片參數
width, height = 640, 480
duration = 5  # seconds
fps = 30
total_frames = duration * fps

# 創建輸出容器和流
container = av.open('output.webm', mode='w')
stream = container.add_stream('libvpx-vp9', rate=fps)
stream.width = width
stream.height = height
stream.pix_fmt = 'yuv420p'

# 產生影片框,這裡僅作為範例用透明背景
for frame_idx in range(total_frames):
    # 創建一個全透明的框
    img = np.zeros((height, width, 4), dtype=np.uint8)
    
    # 只是一個範例,所以在畫面中央畫一個半透明的紅色圓
    center_x, center_y = width // 2, height // 2
    radius = min(width, height) // 4
    y, x = np.ogrid[-center_y:height-center_y, -center_x:width-center_x]
    mask = x*x + y*y <= radius*radius
    img[mask] = [255, 0, 0, 128]  # Semi-transparent red
    
    # 轉換成 AVFrame 和寫入流
    frame = av.VideoFrame.from_ndarray(img, format='rgba')
    for packet in stream.encode(frame):
        container.mux(packet)

# 結束編碼
for packet in stream.encode():
    container.mux(packet)

container.close()

在串流裡增加自定義的變數

pyav裡面的frame.side_data是一個屬性,它通常包含與該幀(幀)相關的附加資訊。這些資訊可能包括但不限於:

  1. 動態範圍資訊
  2. 運動向量資訊(對於某些視訊編解碼器)
  3. 其他 FFmpeg 內部為特定編解碼器或格式定義的元數據

舉個例子,如果你正在解碼一個使用 HEVC(或稱為 H.265)編碼的視訊串流,frame.side_data可能會包含關於這一幀的 HDR 元資料(如果該視訊支援 HDR)。

通常情況下,大多數應用程式可能不需要直接讀取side_data。但是,對於需要細節控製或分析的應用程序,這是一個非常有用的屬性。

import av
import pyav
import threading

# Define the source RTMP URL and destination RTMP URL
source_url = 'rtmp://127.0.0.1/live/test1'
destination_url = 'rtmp://127.0.0.1/live/test2'

# Create an input container for the source RTMP stream
input_container = av.open(source_url, mode='r')

# Create an output container for the destination RTMP stream
output_container = av.open(destination_url, mode='w')

# Set up a video encoder for H.264
video_stream = output_container.add_stream('h264', rate=30)
video_stream.options['x264opts'] = 'nal-hrd=cbr'
video_stream.options['c:v'] = 'libx264'

# Define a SEI message to add to the video frames (modify this as needed)
sei_data = b'Some SEI Data'

# Function to add SEI data to frames and write to the output
def process_frames():
    for packet in input_container.demux():
        if packet.stream.type == 'video':
            for frame in packet.decode():
                # Add SEI data to the frame
                frame.side_data['sei'] = sei_data
                # Encode and write the frame to the output
                output_container.mux(packet)

# Create a thread to process and write frames
frame_thread = threading.Thread(target=process_frames)

try:
    # Start the frame processing thread
    frame_thread.start()

    # Run the main loop to write the output to the destination RTMP stream
    while True:
        output_container.mux(output_container.recv())
except (KeyboardInterrupt, pyav.AVError):
    pass
finally:
    # Clean up resources and close the containers
    frame_thread.join()
    input_container.close()
    output_container.close()

發佈日期:

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()
發佈日期:

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來進行智慧標記,使用狀況可參考下面的影片

發佈日期:

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
發佈日期:

影像分割模型介紹

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 有更好的性能,特別是在需要捕獲多尺度特徵的情境下。