2024年12月11日 星期三

C# 用Yolo做目標檢測

Purpose:
因為最近在做Data Labeling的工作, 想說利用C#導入YOLO Model 辨識物件偵測的演算法, 來做圖片的影像辨識!
開發環境:
1. Microsoft Visual Studio Community 2022 (64 位元) - Current版本 17.12.3
2. NuGet - YoloSharp Package
3. NuGet -Microsoft.ML.OnnxRuntime Package

圖一: NuGet Package
圖二: 程式效果
圖三: 程式效果
圖四: 程式效果
Yolo (You only look once)
Yolo 是屬於物件偵測 (object detection)類神經網路演算法。物件偵測是屬於電腦視覺中比較簡單的任務,可以在一張圖片中找到某些特定的物體,同時物件偵測不僅要求我們識別這些物體的種類,同時要求我們標出這些物體的位置。

VS2022 程式介面與架構
介面安排如下:
圖五: 程式物件Layout
圖六:程式coding
Program is put into Github respository !
https://docs.ultralytics.com/zh/models/yolo11/#overview

2024年12月2日 星期一

Data Labeling 學習

機器學習依賴大量高質量的資料來實現革命性的應用。要更好地理解資料標註的重要性,必須了解不同類型的機器學習:監督式學習、非監督式學習和強化學習。
監督式學習是最常見也是最強大的機器學習應用之一,從垃圾郵件檢測到自駕車檢測人、車和其他障礙物都有使用。監督式學習使用大量有標籤的數據來訓練模型,以準確地分類數據或預測結果。
為了創建高品質的監督式學習模型,您需要大量具有高質量標籤的數據。那麼,如何標記數據呢?首先,您需要確定誰將標記您的數據。建立標記團隊有幾種不同的方法,每種方法都有其優點、缺點和考慮因素。讓我們首先考慮是最好讓人類參與標記過程,完全依賴自動化數據標記,還是結合兩種方法。

CVAT(Computer Vision Annotation Tool)
CVAT(Computer Vision Annotation Tool)是一個開源的計算機視覺標註工具,它提供了一個方便易用的界面,用於創建和維護標註數據集。CVAT具有強大的功能,可以標註圖像和視頻數據,並支持不同的標註類型,如邊界框、遮罩和關鍵點等。它是一個非常有用的工具,尤其是對於計算機視覺項目和研究人員來說。
訓練電腦視覺模型需要許多標注過的圖片,而這些過程會消耗大量的時間。為了節省時間,有人致力於開發好用的影像標註軟體,其中之一是 Computation Vision Annotation Tool(CVAT) 。原本由Intel開發,然後在2022年轉為由OpenCV維護的開源專案。
CVAT的用途非常廣泛,它可以應用於各種領域,包括目標檢測、物體追蹤、行為識別等。對於機器學習和深度學習模型的訓練來說,標註數據集是非常重要的一步,CVAT提供了一個方便且高效的方式來標註數據,以幫助模型更好地理解和學習圖像和視頻數據。



2024年9月1日 星期日

Tektronix MSO64B C# GUI Application

Purpose:
為了長時間去偵測TekTronix的MSO64B量到的數據並記錄下來, 因此才有這個專案產生. 利用C#寫的GUI來做這個動作!
Fundamental:
TEKTRONIX太克
6B 系列MSO 混合訊號示波器
GUI:
包含連接儀器控制, 儀器channel顯示控制, 個別channel 顯示 和即時儲存量測資料

Demo:



2024年8月13日 星期二

C# 利用ffmpeg將WebCAM影像Streaming to RTSP server

Purpose:
利用C#架構一個RTSP 影像streaming的環境.包含WebCAM控制, FFMpeg使用 and Emgu.CV的應用 
Fundamental:
RTSP
即時串流協定(Real Time Streaming Protocol,RTSP)是一種網路應用協定,專為娛樂和通訊系統的使用,以控制串流媒體伺服器。該協定用於建立和控制終端之間的媒體對談。媒體伺服器的客戶端發布VCR命令,例如播放,錄製和暫停,以便於即時控制從伺服器到客戶端(影片點播)或從客戶端到伺服器(語音錄音)的媒體流。
FFmpeg
FFmpeg 是一個開放原始碼的自由軟體,它包含了音訊和視訊多種格式的錄影、轉檔、串流功能,同時也是一個音訊與視訊格式轉換函式庫(Library),許多開源的工具都是基於 FFmpeg 打造的。

Reference:
感謝分享:包含 RTSP windows server 和一些相關軟體介紹與下載!!
public void StartRTSP(string path)
    {
       
        if (_RTSPPara._process != null && !_RTSPPara._process.HasExited)
            return;

        _RTSPPara._process = new Process();
        _RTSPPara._process.StartInfo.UseShellExecute = false;
        _RTSPPara._process.StartInfo.FileName = @path;
        _RTSPPara._process.StartInfo.Arguments = "";
        _RTSPPara._process.StartInfo.RedirectStandardInput = true;
        _RTSPPara._process.StartInfo.RedirectStandardOutput = true;
        _RTSPPara._process.StartInfo.RedirectStandardError = true;
        _RTSPPara._process.EnableRaisingEvents = true;
        _RTSPPara._process.StartInfo.CreateNoWindow = true;
        try
        {
            var started = _RTSPPara._process.Start();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
        }

        _RTSPPara._process.BeginErrorReadLine();
        _RTSPPara._process.BeginOutputReadLine();
    }


public void StartFFmpeg(string path, string webname)
    {
        string rtspServer = "rtsp://localhost:8554/test";
        string ffmpegCommand =
                $"-f dshow -i video=\"{webname}\" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp {rtspServer}";
        if (_FFmpegPara._process != null && !_FFmpegPara._process.HasExited)
            return;

        _FFmpegPara._process = new Process();
        _FFmpegPara._process.StartInfo.UseShellExecute = false;
        _FFmpegPara._process.StartInfo.FileName = @path;
        _FFmpegPara._process.StartInfo.Arguments = ffmpegCommand;
        _FFmpegPara._process.StartInfo.RedirectStandardInput = true;
        _FFmpegPara._process.StartInfo.RedirectStandardOutput = true;
        _FFmpegPara._process.StartInfo.RedirectStandardError = true;
        _FFmpegPara._process.EnableRaisingEvents = true;
        _FFmpegPara._process.StartInfo.CreateNoWindow = true;
        _FFmpegPara._process.StartInfo.Verb = "RunAs";
        try
        {
            var started = _FFmpegPara._process.Start();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
        }

        _FFmpegPara._process.BeginErrorReadLine();
        _FFmpegPara._process.BeginOutputReadLine();
    }

        private void button7_Click(object sender, EventArgs e)
        {

            if (FFmpeg._FFmpegPara.RunisFinish == true)
            {
                //button5.BackColor = Color.AliceBlue;
                button7.BackColor = Color.Green;
                WebCAM[0].show_screen = true;
                myVideoCapture = new VideoCapture("rtsp://127.0.0.1:8554/test");
                myVideoCapture.ImageGrabbed += imageGrabbedEvent;
                myVideoCapture.Start();
            }
            else if (WebCAM[0].run == true)
            {
                //button5.BackColor = Color.Green;
                button7.BackColor = Color.AliceBlue;
                if (myVideoCapture != null)
                {
                    myVideoCapture.ImageGrabbed -= imageGrabbedEvent;
                    Thread.Sleep(500);
                    myVideoCapture.Dispose();
                }

            }
        }

        public void imageGrabbedEvent(object sender, EventArgs arg)
        {
            try
            {
                TEmgu._EmguPara.ImageSource = myVideoCapture.QueryFrame().ToImage<Bgr, byte>();
            }
            catch (Exception Ex)
            {

            }
            if (TEmgu._EmguPara.ImageSource != null)
            {

                imageBox1.Image = TEmgu._EmguPara.ImageSource.Resize(imageBox1.Width, imageBox1.Height, Emgu.CV.CvEnum.Inter.Linear);

            } //----if (TEmgu._EmguPara.ImageSource != null)
           

        }