These are the homeworks of the course "Computer Vision Implementation" in my college.
該課程為「影像處理實務」之進階課程,而「影像處理實務」之作業檔案在此。
- VS 2019
- OpenCV 4.5.5 (CMake Build)
- C++ CLR (.Net Framework)
- Google Colab
- Python 3
- PyTorch
TensorFlow(之後補上)
- Using OpenCV open video and transfer it to Gray (影片灰階)
- 使用 OpenCV 將影片檔讀進來,並運用 pictureBox 及 OpenCV 算幀數並顯示。
- 將每幀轉換為灰階。
- Morphology Operation (形態學影像處理)
- 非套 OpenCV 的 Function,自己寫的演算法。
- 基本形態學影像處理
- Dilation
- Erosion
- Opening
- Closing
- 可自訂 Structure Element 大小
- Moving Object Segmentation(移動物切割)
- 除了avi開檔套用OpenCV的開檔方式,其他非套 OpenCV 的 Function,皆為自己寫的演算法。
- 背景相減法(Background Subtraction)
- 相鄰相減法(Frame Difference)
- 移動物框選
- 使用圖學理論中的「Connected-component labeling」演算法。使用非遞迴式 BFS 實作。
- 程式碼中也有遞迴式 DFS 的實作版本。因為最一開始是用遞迴寫,但後來發現有些案例會 Overflow(其實還蠻常的),所以才改成非遞迴式 BFS。
- 顯示二值化影像以便瞭解與除錯。
- Demo
- Background Subtraction
- Frame Difference
- using OpenCV sample "vtest.avi"
- Fire Detection(火焰偵測)
- 基本功能延伸上一項「移動物切割」的程式。
- 移動物切割,可選擇下列兩種方式之一:
- 背景相減法(Background Subtraction)
- 相鄰相減法(Frame Difference)
- 物件框選(這邊是火焰物件框選)。
- 移動物切割,可選擇下列兩種方式之一:
- 先做移動物切割,再判斷火焰像素,並將火焰像素以 (B : 0, G : 0, R : 255) 標示於二值化影像上,方便除錯與處理。
- 二值化影像,白色區域代表移動物物件,紅色區域代表火焰像素。
- 判斷火焰像素時,基於 RGB 色彩模型 + HSI 色彩模型做以下規則:
- Rule 1: R > R_T
- Rule 2: R >= G > B
- Rule 3: S >= (255 - R)* S_T / R_T
- Rule 4: I > I_T
- 並用 S 判斷環境亮暗
- 20 <= S <= 100 代表較亮環境
- 30 <= S <= 100 代表較暗環境
- 當為較亮環境:(Rule 1 && Rule 2 && Rule 3) == True,即為火焰像素。
- 當為較暗環境:(Rule 1 && Rule 2 && Rule 3 || Rule 4) == True,即為火焰像素。
- R_T、S_T、I_T 為自行設定的閥值(位於程式碼中 FlameThresholdVal.h 內部調整),通常 R_T = 115~135, S_T = 55~65, I_T = 205~215 即可應付多種情況。
- Problems:
- 使用 Frame Difference 作為移動物切割方法時,會有些不穩定。
- 還未能完整將火焰偵測正確,即使為紅色像素的非火焰物件,程式仍有極大機率誤判。
- 有些小像素也是如此...
- 有機會未來再修改!
- 夜晚的火焰,容易受環境光影響。
- Demo
- 基本功能延伸上一項「移動物切割」的程式。
- Deep Learning : Image Classification(深度學習─圖像分類)
- 目前只有寫 PyTorch 的版本,TensorFlow之後有寫再補上。
- 以 PyTorch 官方的「圖像分類」教學修改而成。
- 使用 Cifar-10 的資料集訓練。
- 該教學的準確率僅約 50% 左右。
- 參考 AlexNet 的架構所修改而成,共8層(1-5 層為卷積層,6-8 為全連接層)。其中:
- 第一、二、五個 卷積層(Convolutional Layers) 後使用大小 3x3、stride=2 的 Maxpooling
- 第一、二個 全連接層(Fully Connected Layers) 後使用 Dropout,隨機關閉神經元,藉此讓模型不過度依賴某些特徵,增強模型的泛化能力。
- 在輸出前,先用log型的Softmax函數(有提升準確率,但這個影響沒有很大)。
- 訓練前的設定:
- 損失函數使用 CrossEntropy。
- 訓練 25 輪,其實到 10 多輪左右就有到 80% 以上了,抓 25 是因為較穩定,不過也上不太去了。
- 優化器(optimizer)改用 Adam。
- 最終訓練出的準確率約 82% 左右。
- 目前只有寫 PyTorch 的版本,TensorFlow之後有寫再補上。