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

https://paperswithcode.com/sota
“SOTA” 是 “State-of-the-Art” 的縮寫,意為 “最先進技術”。在計算機科學和人工智能領域,SOTA模型指的是當前被認為是在某個特定任務或領域內表現最優秀的模型或方法。這些模型通常代表了當前領域內的最高水平,並在諸如自然語言處理、計算機視覺、語音識別等各種任務中發揮著重要作用。
請參考此說明: https://docs.docker.com/cloud/aci-integration/
會跳出瀏覽器登入Azure的帳號和docker做連接
docker login azure
docker context create aci myacicontext
使用docker context ls
可以檢視現在有哪些context
docker --context myacicontext run -p 80:80 nginx
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
這是 Swift 的條件編譯(Conditional Compilation)的一個示例,它允許你根據特定的條件選擇性地編譯代碼。在這段代碼中,它確定代碼是在 iOS 模擬器中運行還是在實際的 iOS 裝置上運行。
#if targetEnvironment(simulator)
self.videoCapturer = RTCFileVideoCapturer(delegate: videoSource)
#else
self.videoCapturer = RTCCameraVideoCapturer(delegate: videoSource)
#endif
Swift的空值會是nil
在 Swift 中,協議(Protocol
)定義了一套規範或合約,但不提供具體的實現。任何型別(如 class
、struct
或 enum
)都可以遵循(implement)這些協議,並為協議中的要求提供具體的實現。
例如,我們可以定義一個表示可序列化對象的 Serializable
協議:
protocol Serializable {
func serialize() -> String
}
然後,我們可以讓某個 struct
或 class
遵循這個協議:
struct Person: Serializable {
var name: String
var age: Int
func serialize() -> String {
return "\(name),\(age)"
}
}
Delegate
是一種設計模式,允許一個物件將某些決策或功能外包給另一個物件。在 Swift 中,Delegate
通常是通過協議來實現的。這意味著當一個類想要成為另一個類的代理時,它必須遵循一個特定的協議。
例如,假設我們有一個 Downloader
類,當下載完成時,我們希望通知另一個物件。我們可以定義一個 DownloaderDelegate
協議:
protocol DownloaderDelegate: AnyObject {
func didFinishDownloading(data: Data)
}
然後,Downloader
類可以有一個 delegate
屬性:
class Downloader {
weak var delegate: DownloaderDelegate?
func download() {
// 下載過程...
// 完成後通知代理:
delegate?.didFinishDownloading(data: someData)
}
}
其他類(例如 ViewController)可以遵循 DownloaderDelegate
協議並成為 Downloader
的代理,以響應下載完成事件。
這兩個概念在 iOS 和 Swift 開發中都是核心的,用於很多不同的場景和功能。
在 Swift 中,類別 (class)、結構體 (struct)、列舉 (enum)、或者協定 (protocol) 都可以使用 extension
來增加功能。這是 Swift 中一個非常強大的功能,使得你可以將類別或結構體的定義分散到多個區塊,使其更具組織性和可讀性。
以下是使用 extension
的一些常見原因:
extension
來組織你的程式碼,將相似的功能或者與某個特定主題相關的方法放在一起。extension
來隔離所有與該協定相關的實現。extension
,並將它們放在不同的檔案中,以便於重用或者模組化。在你給出的例子中,原始的 WebRTCClient
類別可能已經有了一些基本功能。然後,通過使用 extension
,增加了關於視頻控制的功能。這種方式可以讓每個 extension
專注於一個特定的功能或者主題,從而使得整體的程式碼更加清晰和有組織性。
總的來說,Swift 中的 extension
功能允許我們對既有的類別或其他資料結構進行進一步的擴展,這樣可以使得程式碼更具組織性、可讀性,並且更容易維護。
分開寫 extension
和將其寫在一起,從功能的角度來看,並沒有區別。不過,程式碼的組織方式往往是為了達到更好的可讀性和易於維護。將不同的功能或與特定主題相關的方法分開在不同的 extension
中,可以幫助讀者和開發者更快地了解該區塊的主要功能,也更容易定位和修改相關的代碼。
guard
是 Swift 語言中的一個控制流結構,用於提前退出(early exit)方法或函數的執行,當某些條件不成立時。它是為了減少嵌套(nested)的深度和提高程式碼的可讀性。
以下是 guard
的一些特點:
guard
之後必須跟一個條件,如果這個條件為 false
,則執行 else
裡面的代碼。else
裡面必須有一個轉移控制語句,例如 return
、break
、continue
或 throw
,以確保退出當前的執行流程。guard
的條件為 true
,則會繼續執行 guard
之後的代碼。例如:
guard let dataToSend = alert.textFields?.first?.text?.data(using: .utf8) else {
return
}
這段代碼試圖從 alert
的第一個文本欄位中獲取文本,然後將其轉換為 UTF-8
編碼的 Data
對象。如果其中任何一步失敗(例如,文本欄位為 nil
、文本為空或轉換失敗),則整個條件為 false
,並執行 else
裡面的 return
語句,從當前函數或方法中提前退出。
使用 guard
而不是嵌套的 if-let
可以使程式碼更加整潔、易讀,特別是當有多個條件需要檢查時。
在Swift中,$0, $1, $2, … 是在閉包中使用的隱式名稱,代表閉包的第一個、第二個、第三個…參數。
peerConnection.transceivers
.compactMap { return $0.sender.track as? T }
.forEach { $0.isEnabled = isEnabled }
這裡有兩個閉包:一個是用於 compactMap 的閉包,另一個是用於 forEach 的閉包。
下面是四種常見的計算機視覺任務的簡要介紹:
分類任務是將輸入圖像分為不同的類別或類別之一。例如,給定一張圖像,分類任務的目標是確定圖像中顯示的對像是什麼,比如貓、狗、汽車、飛機等。這通常涉及訓練一個分類器,以便它能夠識別圖像中的特定特徵並將其歸類到正確的類別中。
語義分割任務是為圖像中的每個像素分配一個類別標籤,從而實現像素級別的分類。與分類任務不同,語義分割不僅關注對象的類型,還考慮了對象的位置和邊界。這在許多應用中很有用,比如圖像分割、醫學圖像分析等。
語義分割是一種計算機視覺任務,旨在將圖像中的每個像素分配給預定義的語義類別。在語義分割中,每個像素都被標記為屬於某個特定的類別,如人、車、樹等。語義分割遵循像素級別的分類,因此通常使用像素級別的掩碼(即”masks”)來表示圖像中每個類別的區域。這些分割掩碼是二進製圖像,其中每個像素要嘛屬於某個類別,要嘛不屬於。
有名模型: U-Net
和實例分割最大的不同是他的輸入會是兩張圖片,一張為原圖,一張為掩碼的圖
目標檢測任務涉及在圖像中識別並定位多個不同類別的對象。相比於分類任務,目標檢測不僅需要標識對象的類別,還需要確定它們的位置和邊界框。常見的目標檢測算法可以提供每個檢測到的對象的邊界框和類別信息。具代表性的演算法包括Faster R-CNN, YOLO, SSD等
這篇文章介紹了許多我們常用的物件偵測模型: https://zhuanlan.zhihu.com/p/38709522
實例分割任務結合了目標檢測和語義分割的概念,不僅要對每個對象進行分類,還需要在像素級別區分出每個對象的邊界。實例分割旨在識別圖像中的每個獨立實例並為每個實例分配獨特的標籤,從而在一個圖像中區分出不同的對象。
例如: COCO Segmentation
COCO(Common Objects in Context)是一個廣泛使用的圖像識別和分割數據集,其中包含了多種物體類別的圖像以及每個圖像中物體的分割標註。 COCO Segmentation 數據集中的分割信息通常是用多邊形輪廓來表示物體的形狀。這種分割方法在標註上更靈活,可以準確地表示物體的複雜形狀,但同時也需要更多的標註工作。
https://ffmpeg.org/download.html
ffmpeg的指令如下
ffmpeg -f lavfi -i color=c=0x00ff00:s=800x450 -vf "settb=AVTB, setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)', drawtext=text='STREAM2-%{localtime}.%{eif\:1M*t-1K*trunc(t*1K)\:d}':x=100:y=100:fontsize=32:fontcolor=white" -c:v libx264 -f flv rtmp://192.168.189.11/live/test2
ffmpeg -f dshow -rtbufsize 200M -i video=OBS-Camera -pix_fmt yuv420p -c:v libx264 -profile:v baseline -level:v 3.1 -preset:v ultrafast -s 480x270 -g 240 -an -f flv -y rtmp://172.16.46.89/live/0101_dealerPC1
ffplay -fflags nobuffer -flags low_delay -rtmp_buffer 0 -rtmp_live live -framedrop -infbuf %desc%
ffmpeg -f dshow -rtbufsize 1M -i video="OBS Virtual Camera" -f flv -i rtmp://172.17.22.89/live/test1 -filter_complex "[0:v]colorkey=0x00ff00:0.3:0.2[keyed];[1:v][keyed]overlay[o]" -map "[o]" -c:v h264_nvenc -f flv rtmp://127.0.0.1/live/test3
set ffmpegBin=C:\apps\ffmpeg\
set PATH=%PATH%;%ffmpegBin%
set camName="OBS Virtual Camera"
set camBufferSize=1000
set desc=rtmp://127.0.0.1:1935/live/demo
set codec=libx264
set fps=24
set /a "keyint=%fps%*5"
set x264opts=keyint=120:min-keyint=%fps%:scenecut=0
set preset=medium
set profile=baseline
set level=3.1
set resolution=800x450
set bitrate=700
:: publish stream
ffmpeg -f dshow -rtbufsize %camBufferSize%M -i video=%camName% ^
-vf format=yuv420p ^
-vcodec %codec% -x264-params %x264opts% ^
-preset %preset% -profile:v %profile% -level:v %level% ^
-tune:v zerolatency ^
-s %resolution% ^
-r %fps% ^
-b:v %bitrate%k -minrate %bitrate%k -maxrate %bitrate%k -bufsize %bitrate%k ^
-an ^
-f flv %desc%
`-r` 轉成多少 fps
`-y` (global) Overwrite output files without asking.
`-i` 輸入檔案
`-c:v` video codec
`-profile:v` video profile, streaming 用 baseline
`-level:v` video level, streaming 用 3.1
`-preset:v` 編碼速度 streaming 用 ultrafast
`-b:v` 設定 bitrate, 例如 700k 486k
`-s` 尺寸
`-g` GOP size (-4 24 -g 240 相當於 Keyframe frequency = 10s)
`-an` 不需要 audio
`-f flv` flv 格式
`-f dshow -i video=OBS-Camera` window 使用 direct show來抓 camera
`-rtbufsize 200M` 設定 buffer size 避免 drop frame
`-re` 串流轉碼會變慢 因為要求 encoder 根據 native frame rate 讀檔按維持品值,要做串流轉發不要延遲時要拿掉。
https://www.wowza.com/docs/how-to-restream-using-ffmpeg-with-wowza-streaming-engine
FFREPORT 環境變數設好 ffmpeg 就會根據設定存log
linux format for date
https://www.opencli.com/linux/linux-date-format-shell-script
ffprobe -v quiet -show_streams -select_streams v:0 input.flv
ffprobe -show_frames input.flv | grep pict_type | grep -n I
FME 設定 24fps, keyframe frequency = 10s
在理想狀況,會每 240 frame 插入一個 i-frame
example:
1:pict_type=I
241:pict_type=I
481:pict_type=I
721:pict_type=I
961:pict_type=I
1201:pict_type=I
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尋找這兩個檔案
然後複製到anaconda3>DLLs.
GITHUB: https://github.com/albumentations-team/albumentations
官方文檔: https://albumentations.ai/docs/getting_started/transforms_and_targets/
Albumentations 是一個流行的計算機視覺數據增強庫,專門設計用於圖像分類、目標檢測、分割等任務。它提供了豐富的圖像增強技術,可以幫助您在訓練深度學習模型時提升模型的性能和魯棒性。 Albumentations 支持多種常用的深度學習框架,如PyTorch和TensorFlow。
以下是 Albumentations 的一些特點和功能:
以下是一個使用 Albumentations 的簡單示例,演示如何將一些常見的增強操作應用於圖像數據:
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()
官方網站: 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
文檔: https://docs.roboflow.com/
Roboflow 是一個用於計算機視覺項目的平台,它旨在幫助開發人員和團隊更輕鬆地構建、訓練和部署計算機視覺模型。 Roboflow 提供了一系列工具和功能,使您能夠有效地處理圖像數據、訓練機器學習模型,並將這些模型集成到您的應用程序中。以下是 Roboflow 的一些主要特點和功能:
這個功能是我覺得Roboflow大勝labelImg的原因,當團隊有很多人要負責標記時,這個工具可以非常方便的檢視、確認、共同標記。
Roboflow可以直接匯入以標記好的檔案,可以在線上去觀察以標記的資料的標記樣態,這些都是labelImg沒有辦法做到的,我們可以直接把含有標記和圖片的資料夾拉近網頁裡面,他會問你是否資料夾內的檔案全部放入,選擇Upload
就會可以看到已經標記好的狀況,我覺得這個功能在使用別人標記的圖檔時非常重要,才可以知道別人是如何去標記圖片的
Roboflow 提供了豐富的在線數據增強工具,用於處理圖像數據,改善數據集的多樣性,提高模型的泛化能力。數據增強是在保持圖像語義信息的前提下,通過應用各種變換和處理來生成多樣性的圖像,從而增加模型對於不同場景的適應能力。以下是 Roboflow 在線數據增強工具的一些功能和特點:
按Generate可以做圖像預處理並選擇資料增強的方法,不過這邊圖片要輸出的若太多,就會要升級方案,免費方案沒辦法輸出破千張
選擇Deploy頁籤,可以線上建模,並可以看到在測試資料及上的偵測狀況,我覺得最酷的是這一切都完全使用點、按就可以達成,完全no code
在物件偵測領域,YOLOv8作為最新一代的深度學習模型,以其卓越的性能和效率贏得了廣泛關注。本文將深入探討YOLOv8的模型訓練過程,解析關鍵性能指標,並分享優化策略,幫助您更好地掌握這一強大工具。
在開始YOLOv8模型訓練之前,我們首先需要了解遷移學習的重要性。遷移學習允許我們利用預訓練模型的知識,大大縮短訓練時間並提高模型性能。對於YOLOv8,我們可以從官方提供的預訓練模型開始,根據自己的數據集進行微調。
from ultralytics import YOLO
# 載入預訓練的YOLOv8模型
model = YOLO('yolov8n.pt')
# 使用自定義數據集進行訓練
results = model.train(data='custom_dataset.yaml', epochs=100, imgsz=640)
在物件偵測任務中,幾個關鍵指標對於評估模型性能至關重要:
為了更直觀地監控YOLOv8模型的訓練過程,我們可以使用Tensorboard這一強大的視覺化工具。Tensorboard能夠實時展示訓練損失、驗證指標等關鍵數據,幫助我們及時調整訓練策略。
# 在訓練命令中添加Tensorboard支持
results = model.train(data='custom_dataset.yaml', epochs=100, imgsz=640, project='YOLOv8_training', name='experiment1')
以下為官網的一個範例程式
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)
範例中三種載入方式的比較
ultralytics\cfg\models\v8
)YOLOv8 模型的每個類別中有五個模型
YOLOv8n | YOLOv8s | YOLOv8m | YOLOv8l | YOLOv8x |
YOLOv8 使用了以下預訓練模型:
IoU(Intersection over Union)是一個用於評估目標檢測和分割任務的常用指標。它主要用於衡量預測的目標與實際目標之間的重疊程度。在機器學習和計算機視覺領域中,IoU通常用於衡量模型的預測準確度,特別是在處理像目標檢測、物體定位和分割等任務時。
IoU的計算方式是將預測的目標區域(通常是矩形框或分割區域)與實際目標區域的交集面積除以它們的聯集面積。公式如下:
其中,交集是預測區域和實際區域的重疊部分,聯集是預測區域和實際區域的整體合併部分。
在目標檢測中,當模型預測的目標框與實際目標框之間的IoU值越高,表示模型的預測越準確。通常,當IoU超過一個預定的閾值(例如0.5或0.7)時,可以將該預測視為成功檢測。這種指標可以用於計算Precision-Recall曲線以及平均精度(Average Precision)等性能指標。
在分割任務中,IoU用於衡量模型預測的分割區域與實際分割區域之間的相似度。當分割區域的IoU越高,表示模型的分割結果越準確。
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) 是指 “Mean Average Precision across IoU 0.50 to 0.95 for Large Objects”,意思是在 IoU 從 0.50 到 0.95 範圍內,針對較大目標計算的平均精度值的均值。這個指標更全面地評估了模型在不同重疊度下的性能。
precision(B) 是針對較大目標計算的精確率,即模型在預測中有多少是正確的,相對於所有預測中的正確和錯誤。它是衡量模型預測的準確性的指標之一。
recall(B) 是針對較大目標計算的召回率,即模型正確預測的目標數與實際目標數之比。它表示模型能夠檢測到多少實際目標。召回率是衡量模型識別能力的指標之一。
dfl_loss 是一種在YOLO目標檢測中引入的特殊損失函數,它是基於焦點損失(Focal Loss)的改進。焦點損失的主要目標是應對樣本不平衡問題,即正負樣本比例嚴重失衡。在目標檢測中,負樣本(即不含目標的區域)遠遠多於正樣本(含有目標的區域)。 dfl_loss 試圖通過放大難以分類的正樣本的損失,來應對這種不平衡,從而使模型更關注難以識別的目標。
這是用於衡量預測框位置的損失函數。在目標檢測中,模型不僅要預測目標的類別,還要預測框的位置,即邊界框的中心坐標、寬度和高度。 box_loss 的目標是使模型的位置預測更接近真實目標框的位置。這有助於確保檢測到的框與真實目標框的位置相匹配,從而提高目標定位的準確性。
cls_loss 用於分類目標的類別。在YOLO中,每個檢測框需要預測它所屬的目標類別。 cls_loss 的作用是確保模型的類別預測盡可能準確。這對於準確地將檢測框與正確的目標類別關聯非常重要,從而實現了目標分類的準確性。
這邊深藍色的是使用YOLOv8m.pt做預訓練模型、淺藍色的是使用YOLOv8n,深藍色的跑了2個多小時(100次),淺藍色的因為懶得跑完只做了60幾次。橘色的是別人訓練的歷程。
為什麼自己訓練的結果即使所有資料集都一樣卻有不同的狀況,需要進一步去了解。