Posted on

ChatGPT / Bing / Bard / Claude指南

一、介紹人工智慧

這邊主要是在說明人工智慧演進的過程,其實人工智慧的概念第一時間是在1950年時,由圖靈所提出,定義為一個人透過鍵盤和另一個對象溝通,如果施測者無法分辨與之對話的對象是人還是機器的話, 這個機器就被認為擁有「智慧

但這個時候人工智慧的實作方式還比較以符號邏輯(類似統計學這樣以符號代表抽象的概念)為主,但很難清楚的釐清人類的思考邏輯。後來專家系統時代,人類會嘗試針對每個領域的知識去化作一條條的規則

但是,人類所能表達的,遠比人類所知道的少(博藍尼悖論),因此我們很難很完整的把我們所知道的化作規則或思考邏輯來打造人工智慧。

從2010年至今,我們進入的資料至上的時代,也就是我們開始直接丟資料給電腦,由電腦去歸納、找出電腦自己看得懂的規則,這也是為什麼ChatGPT等生成式AI的結果帶有部分的不可控、不可預測性。

了解AI的演進過程可以讓我們了解當我們要選擇AI技術時,可能可使用的選擇。雖然2010年後的機器學習技術能夠做到最廣泛的通用人工智能,但是若我們的需求範圍較為侷限,或者需要非常高的可解釋性、準確性時,仍然可以考慮符號邏輯或專家系統的方式來實做。

這些演進的歷程都是現在生成式AI能夠出現的重要基礎,每一代之間的關係不是淘汰,而是一層層的進化。

二、基礎模型帶來AI再一次的革命

在這邊我強調了在ChatGPT出現之前的AI應用,大多都用在中、大型企業內部或智能相關產品的應用。但是ChatGPT出現之後,AI從產業研發進入全民有感,並且掀起了非常大的AI風潮。

這是因為基礎模型的出現,所謂基礎模型就是類似ChatGPT這樣用途可以非常廣泛,並且可以透過詞嵌入的方式,以非常快速簡單的prompt方式,打造不同的產品。

例如下圖中的GitHub Copilot、智慧錄音卡、Notion AI、AI心理諮商,其實都是使用ChatGPT的模型,卻可以使用在多種非常不同的應用場景上(心理安慰、生活便利、程式開發等不同用途)

這樣的一個基礎模型的出現,帶來開發AI應用的革命性變革,過去,有些AI應用程式可能需要我花上六個月、甚至一年的時間來建立,現在許多團隊可能一週就能完成

以ChatGPT的自製一個聊天機器人為例,現在只需要上傳一些機器人需要知道的文件資料、並且使用對話的方式指導機器人該如何正確回應,就可以擁有一個專屬的客製對話機器人

三、生成式AI相關的應用

有興趣的可以自行去研究、了解現在AI可以做到那些事情

文本生成(LLM)

圖像生成 (text-to-image)

音樂 / 聲音生成

程式碼生成

四、多模態應用

基礎模型另一個強大之處,在於可以結合視覺、聽覺、文字的輸入,以及對不同型態輸入資料的交叉理解,能夠讓AI朝【通用型人工智慧】更加靠近

五、善用AI為生產力的新動能

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

AI成為生產力的新動能,用戶在人工智慧輔助下完成工作的效率要高得多

Posted on

OpenAI Playground介紹

什麼是OpenAI Playground

教學文件:

https://platform.openai.com/docs/overview

OpenAI Playground(OpenAI 遊樂場)是OpenAI提供的一個線上平台,用於演示和測試他們的自然語言處理模型,例如GPT-3.5(本模型的基礎)。它允許用戶與模型進行互動,輸入文本並獲得模型的自動回應,以便演示其自然語言處理能力

OpenAI Playground通常用於展示GPT-3及其他相關模型的功能,並讓開發者和研究人員評估這些模型的效能以及探索其應用潛力。用戶可以在Playground上提出各種問題,構建對話,生成文字,從而了解模型如何處理不同的輸入。

此外,OpenAI Playground也提供一個用戶友好的界面,讓用戶可以輕鬆嘗試GPT-3及相關模型的能力,而無需自行設定或編程。這對於探索自然語言處理的應用,以及將這些模型集成到不同的應用中都非常有用。

在OpenAI Playground體驗與模型的互動

Playground 的完整版介面,可以提供各種模式和參數,通過調整無數其他可自定義選項來增強用戶體驗。在對話框的部分也可以使用語音輸入,或者上傳既有的語音檔,使用OpenAI語音轉文字的功能提供資料給Playground

下面是這個介面的一些功能

  1. 輸入現有文本供AI編輯:輸入一段現有的文本,然後要求模型對其進行編輯、修改或擴展。這讓您可以看到模型如何處理和改進您提供的文本,並且可以用於文本編輯和生成的場景。
  2. 使用溫度控制響應的隨機性: 溫度控制是一個重要的參數,它允許您調整模型生成文本的隨機性。較高的溫度值將增加生成文本的隨機性,而較低的溫度值將使生成文本更加確定和一致。這使得用戶可以根據需要調整生成文本的多樣性。
  3. 調整頻率以控制其相應的重複程度: 您可以使用不同的方法來調整生成文本中重複內容的頻率。這可以通過調整模型的參數來實現,以使生成的文本在某些情況下更具多樣性,或者在其他情況下更加一致。這樣,您可以根據具體的應用需求來調整生成文本的重複性。

這些功能和選項使用戶可以更好地控制模型的生成行為,以滿足不同的用例和需求。這使得OpenAI Playground成為一個有用的工具,用於測試、探索和改進自然語言處理應用,並理解模型的行為。

使用OpenAI語音轉文字功能

切到完整功能並且按麥克風的圖案,就可以上傳語音檔案,並使用Whisper轉成文字,這個功能已經開源了

OpenAI Playground的核心特性

支持多種型號的模型

OpenAI API 由具有不同功能和價格點的多種模型提供支援。您也可以透過微調,針對您的特定用例對我們的模型進行客製化

MODELDESCRIPTION
GPT-4 and GPT-4 Turbo一組改進 GPT-3.5 的模型,可以理解並產生自然語言或程式碼
GPT-3.5一組改進 GPT-3 的模型,可以理解並產生自然語言或程式碼
DALL·E
可以在自然語言提示下產生和編輯圖像的模型
TTS一組可以將文字轉換為聽起來自然的語音的模型
Whisper可以將音訊轉換為文字的模型
Embeddings一組可以將文字轉換為數字形式的模型
Moderation可以偵測文字是否敏感或不安全的微調模型
GPT base一組無需遵循指令即可理解並產生自然語言或程式碼的模型
Deprecated已棄用的型號的完整清單以及建議的替代品

我們也發布了開源模型,包括 Point-EWhisperJukeboxCLIP.

Posted on

免程式碼將ChatGPT串接到LINE對話

使用工具 – FancyAI

FancyAI網址: https://www.fancyai.co/

可輕鬆使用GPT大語言模型知識庫,介面化匯入文件(PDF, CSV, TXT)或網址,讓FANCY AI迅速掌握您的知識進行問答。只需30秒,即可與LINE官方帳號整合,建立分享知識Bot連結。更有視覺化的工作流程編排和對話紀錄功能!

AI大模型問答介面,可設定你專屬AI回答流程

FANCY AI 能力

  • AI ChatGPT知識客服: 結合你自己專屬知識,ChatGPT 24/7 的為您的用戶服務
  • 超快速精準匯入處理:自動分段,輸入,拆成問答,多種方式讓您處理的數據 (支持PDF,CSV,TXT,網址)
  • 簡單直覺操作AI大模型問答介面:讓你設定你專屬AI回答流程,可以自訂預設開場白,選擇性問題,個性化你的AI
  • 30秒串接好LINE官方帳號,分享連結:結合你的知識庫,LINE官方帳號直接用ChatGPT不間斷服務。

步驟一、創建OpenAI開發者使用的密鑰

首先要去你的OpenAI開發者平台,創建你的API Keys: https://platform.openai.com/api-keys。這樣其他應用程式才可以呼叫你的OpenAI帳號下的API(然後扣你的錢)

接著就是要付款給OpenAI,點此付款: https://platform.openai.com/account/billing/overview。單次可購買$5~$95美金(也就是最低約150左右)

OpenAI的API使用需要付費,價格資訊如下: https://openai.com/pricing

由上圖可知道,OpenAI的API計費單位為Token,下面會解釋甚麼叫做Token,也可以線上去測試某段文字的Token數量是多少,可以更精準地了解可能的花費。

可選擇模型的比較

甚麼是Token

在 API 處理提示之前,輸入會被分解為Tokens 。這些Tokens並未準確地在單字開始或結束的位置進行切割 – Tokens可以包含尾隨空格甚至子單字。

以下是一些幫助理解Token長度的有用經驗規則:

  • 1 個標記 ~= 4 個英文字符
  • 1 個令牌 ~= 3/4 個單字
  • 100 個標記 ~= 75 個單字
  • 1-2 句 ~= 30 個標記
  • 1 段 ~= 100 個標記
  • 1,500 個單字 ~= 2048 個標記

Token切割測試工具: https://platform.openai.com/tokenizer

步驟二、創建Line Bot帳號並為串接做準備

首先要申請一個Line API串接的開發者帳號: https://developers.line.biz/console/

創建帳號流程如下:

設定你的LINE BOT帳號為使用Webhook

接著這邊是在分享時未設定的部分,就是把預設的固定回復關掉,開啟 LINE Official Account Manager

打開Webhook並且關閉自動回應訊息,這樣所收到的訊息才會傳到我們的API裡面

步驟三、創建FancyAI帳號

創建帳號之後,首先要把帳號和你的OpenAI綁定,點OpenAI帳號後,把剛剛第一步驟創建的Key貼進去,這樣FancyAI才能夠呼叫你的OpenAI API

Fancy AI: https://www.fancyai.co/

新建一個應用,選擇簡單對話

設定與Line的串接 – 設定API秘鑰

Line Channel Access Token: 瀏覽剛剛創建的Line帳號的頁面MessageAPI -> Channel access token -> Issue將出現的字串複製進去

Line Channel Secret位於Basic settings下方

接著告訴Line要API的webhook位置: 選擇”應用>你的應用名字>Line API”

把這邊的webhook網址貼到剛剛LINE Developer的webhook設定位置

接著就可以測試你的機器人囉!!

Posted on

女工程師經驗分享

訪談介紹

Claire Chang目前擔任台北Women Who Code Taipei的活動主導人,經常組織活動,邀請優秀的女性分享她們的技術專長。她主持過眾多活動,並在眾多場合分享自己的經驗。她是一位經驗豐富的程式設計師、一位母親、一位妻子,也是慈善組織中積極貢獻的成員。

我們感謝Claire與我們分享她不論是在職場上或是家庭生活中,所擔任的各種角色的經歷。很少有人會如此大方地向學生分享自己的故事, 我們佩服她積極的生活態度也很感激她的慷慨協助。

欲進一步認識 Claire,請參訪她的部落格: https://claire-chang.com/

受訪影片

謝謝一群可愛的同學們的訪問和影片剪輯,當天不知道會被錄影和這樣大陣仗的被訪談,完全沒有化妝也沒有準備,所有內容都是真誠呈現唷!

談論女工程師的職場角色及心得

剛開始踏入職場的時候,我注意到男生通常更傾向於專注於技術研究,並且花費很多時間在這方面。他們似乎擁有更多後援和支持,即使工作時間結束,他們仍然會繼續深入研究技術。相較之下,女生可能會面臨更多挑戰,即使尚未進入家庭角色,她們的社交圈通常不會像男生那樣圍繞技術研究,而更傾向於外出玩樂、運動或逛街等活動。

然而,我在家庭角色轉換之後開始感受到自己在科技職場上的優勢。我丈夫現在負責照顧孩子,這讓我有更多的自由時間來深入研究技術。我也發現女生在團隊中扮演了不可或缺的軟化角色,特別是在團隊中主要由男性組成時。女生可以改善團隊氛圍,因為男性有時候可能會較為堅持和直接,而女生則可以帶來更多團隊凝聚力。

在團隊開發中,女生也更能夠關注技術以外的方面,如感受、想法和市場趨勢等。市場本身也是一個較為軟性的領域,需要考慮使用者的感受和體驗。女生在這些方面可能更具洞察力,並且擅長關注不同層面的事情。男生和女生各有其擅長之處,但當團隊主要由男性組成時,我們有時候可能會忽視女性的思維,這使平衡不同思維的重要性變得更加顯著,以確保觀點更全面。

雖然女性在科技領域中相對較少,但如果能贏得同事的信任,那麼他們就會更願意接受你的建議和意見。建立信任是關鍵,因為如果同事們認為你無關緊要,則不會理會你的觀點。因此,要在團隊中有所貢獻,首先必須贏得同事的信任。至於私下關係,無論男女都應該保持一定的距離,特別是在工作環境中,以確保不會對個人家庭和關係造成負面影響。

當別人知道你是女工程師時的反應

我發現人們對我在弄非營利組織的反應比較不同,這讓我覺得很有趣。有些人可能會想這個人有個特殊的孩子,他是不是生活很辛苦。每個人的反應都不一樣,有些人會佩服我,而有些人可能會對我產生懷疑。觀察這些不同的反應讓我可以猜測他們的背景和思維方式,這真的很有趣。

不過,當我告訴其他工程師時,他們的反應通常都很一致,大多數人都會說:“哇,好專業,好厲害!”。可能因為大多數人認為工程師是一個很需要專業能力的角色,而女性成為了那樣的角色時,其他人就會覺得這個女生很厲害、很強大。

你可能會想知道,是否有人因為我是女性而懷疑我的工程師能力。一開始確實有人這麼想,當我告訴他們我是家庭的經濟支柱時,他們會表示同情。但後來,我改變了自己的想法,不再讓別人影響我,也改變了他們的看法。對於工程師的技術能力來說,最重要的是自己對自己的自信,以及你在別人面前呈現出來的態度。如果有人對你的能力提出質疑,不必太在意,而是要相信自己的能力,後來他們可能會改變看法。

一個人可以給這個世界上帶來最大的價值是什麼

我覺得所謂的價值,其實從來都不是你要去給別人就可以給的。譬如說,我後來有個很深的體驗,這是為什麼,就是因為我先生其實在照顧我的小孩。因為我們尤其是剛開始,你們一定也想像的到,孩子真的是有很多狀況,老公帶孩子帶得很挫折。然後當時我看孩子的眼光還沒轉換過來的時候,我當然也會這麼覺得,而且他也會這樣想,那他就是會很不開心。

我想說的是,就是你想要拉別人的時候,那個時候我一直想要,因為我老公就是帶我的小孩,那我的小孩就是什麼都學不會,因為他就是重度智障,然後又自閉,所以就是你怎麼教他他都不會,然後你可能就是可是你又必須要照顧他,你不能不鳥他,對啊,或者把他丟到路上,不行沒有這種選項,就是你就必須要照顧他。

然後所以那時候他就是很低潮,然後那時候我一直想要去拉我的先生,然後我很想要去把他拉起來。但是我後來發現,就是你要對別人有貢獻並不是你自己能夠決定的,而是對方要不要。就是譬如你要把他拉起來,他就是想要在那個爛泥裡面,你真的拉不了他。對就是我們自己,我覺得我們看待我們的貢獻要換一個角度,我們要去看待我們怎麼樣去面對我們自己,我們有沒有做好我們自己本身應該要做的功課,而不是說去看那個,就是你要做的目標。

我覺得我們要把這個目標跟我們現在在做的事情分開來,就是目標是一回事,然後那我們現在在做的事情是一回事。這樣子把他們分開來,那我們其實專注在去檢討我們自己,有沒有做好我們該做的事情。當然就是你目標你還是要當一個參考啦,但重點還是在你相信你有沒有盡力。就譬如你已經很盡力的準備了一個考試,但是你考得還是很爛,就是這不代表說你就沒有能力,不要用結果去評斷你自己,我們其實要用自己的行為去評斷自己的價值,看自己有沒有對得起我自己應該做的這樣。

為什麼你願意如此敞開分享自己的故事?

其實這個當然還是有目的性的啦,就是說我們今天想要讓更多人了解我們的家庭狀況,因為我們現在其實當然在推廣的是叫做共融。對,那共融就是要讓別人來了解我們,那如果我們不願意曝光我們自己的話,其實永遠都躲在角落,其實沒有人會知道你在幹嘛,沒有人會知道你所遭遇的事情,所以你必須一定至少要有人願意去曝光,然後去讓別人看到你。

那當然就是自己要有一定的心靈堅強度,你才有辦法站出來,其實我們很多家長是很不願意的,而且很多家長就算是去參加特殊兒活動都不想要被人家知道。

Posted on

讓你的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美金免費免費
主要用途研究、資料分析、聊天程式碼開發、聊天多模態及與其他服務的串接應用網路搜尋、聊天研究、分析
Posted on

讓你的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

Posted on

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()

Posted on

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 的啟動和運行方式。

Posted on

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,就可以在本機運行可動的範例了

Posted on

幾個使用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()