- 此專案為中正大學軟體工程課程用,題目為漁工過勞檢測系統,透過使用者介面選擇資料夾,會歷遍資料夾影片並分析漁工工作狀態並計算時間,如有超時,會寄送電子郵件提醒使用者。
[TOC]
- tensorflow==2.1.2
- h5py==2.10.0
- scipy
- scikit-learn
- opencv-contrib-python
- pandas
- schedule
- pillow
- matplotlib
//安裝套件指令(從req檔案) 如有需要請另外安裝 如numpy...
pip install -r requirements.txt
gpu環境
- 此專案的opencv跟tensorflow套件預設使用CPU跑 如需要以GPU跑可參考CUDA跟cuDNN安裝指南跟opencv編譯指南
CUDA
cuDNN
CUDA&cuDNN安裝教學
opencv編譯GPU版本教學
- 我們用的是OpenPose開發中的COCO model來當作我們的姿勢預測模型,能夠分析出圖片的人並找出關鍵點
OpenPose github
COCO model下載
source
下載完解壓縮後將pose_deploy_linevec.prototxt
和pose_iter_440000.caffemodel
丟到model/coco/
資料夾即可
COCO model 執行結果
想執行 COCO model元件,可以執行COCO_model.py
,會產生範例圖片跟預測結果,實際人數和期望值人數可以到test/
資料夾執行 COCO_model_test.py(下面有更詳細解釋)
$ python COCO_model.py
- 有了上述的姿勢預測,我們能透過輸入影片,來擷取幀並預測,產生訓練資料,給之後的action model測試
- 在檔案
Capturevideotoimage.py
有三個函式可做使用,資料生成是用下面第1個函式
# 輸入影片和動作,產生關鍵點資料到csv檔
transform_to_traindata(self, filename, action)
# 輸入影片,預測工時
transform_and_predict(self, filename)
# 輸入影片,預測工時,可自訂工作跟休息要跳過的時間
test_predict(self, filename, rest_skiptime, work_skiptime)
我們目前只有分work跟rest兩種動作,會將特徵寫入trans_to_train/pose_data.csv
- 我們將動作預測模型寫在
action_model.py
,裡面實作各種函式包括訓練、預測、資料轉型...
gen_lstm_model(self) # 產生lstm模型
load_data(self, filename) # load檔案轉成訓練格式
train_lstm_model(self, model, X_train, y_train, X_test, y_test) # 訓練並儲存
load_lstm_model(self, filename) # load現成的模型
predict(self, dataset, lstm_model) # 預測
直接執行action_model.py
,會做訓練的動作
- 使用者可以透過執行
trigger.py
,產生GUI且選擇資料夾,程式會自動驅動各元件去做影片分析。
$ python trigger.py
- Open a Directory : 可開啟要分想分析的影片的資料夾,程式會歷遍裡面的影片逐一分析。
- Edit Receiver Email : 設定接收過勞提醒的email帳號,會產生
EmailList.txt
,需填寫在裡面。 - Send Email : 手動按下可發送信件到
EmailList.txt
裡的所有信箱(測試發送功能用)。 - Login Email : 填寫要當發送者的email帳戶和密碼。
- Run : 按下後開始分析。
- Reset : 將目前累積的時間寫到
log.txt
- 下面為顯示目前進度跟所在資料夾位置
會顯示目前在分析的檔案,和分析累計時間(完成1個影片才會更新1次)
以上的[Time]work/video
顯示的是進度的時間(範例影片只有10秒故可忽略結果)
目前程式有2種情況會記錄目前的累積時間到log.txt
並把Current Work Time
跟Current Video Time
歸0,此按鈕為手動
第2種情況是每天的23:59分會自動紀錄
- 我們採用的分析策略適合長時間影片(20分鐘以上),如果是低於1分鐘的短片會效果不佳或是沒效果
- 如果要在分析時切換資料夾,只能關掉程式重新選擇
- 分析無法暫停,只能關掉並重新
Current Work Time
跟Current Video Time
在分析完單支影片才會更新,無法實時更新- 當
Current Work Time
大於8小時,就會自動發送信件。
切換到test/
資料夾,執行
$ python COCO_model_test.py expected_keypoint_cnt
這個測試會把 test/test_images 下 day 和 night 資料夾內的圖檔作姿勢預測分析 COCO model 會分析 18 種姿勢特徵,下圖為只要判斷到大於 "expected_keypoint_cnt" 姿勢特徵就算偵測到一個人,下圖為大於一半姿勢特徵(9種)在白天和晚上的準確率: 測試結果:白天比晚上的效果來得好
切換到 test/
資料夾,執行
$ python predictor_test.py video_to_test_path rest_skiptime work_skiptime
video_to_test_path: 要分析的影片 rest_skiptime: 若偵測到休息,影片要前進的時間(單位為秒) work_skiptime: 若偵測到工作,影片要前進的時間(單位為秒)
該模型測試了2個長影片(24分鐘和39分鐘,影片都是在白天拍攝),以下為分析影片是否在工作或休息的機率圖
-
24 分鐘影片(大部分時間都在工作) 若偵測到休息,影片則前進30秒 若偵測到工作,影片則前進
-
39 分鐘影片(大部分時間都在工作) 若偵測到休息,影片則前進30秒 若偵測到工作,影片則前進
測試結果:若偵測到工作,影片則前進1分鐘對長影片的分析效果較佳
換到 test/
資料夾,請先打開 app_test.py 檔案找到 test_gui_login_email_button
函數並把裡面的 your_email_address
和 your_email_address_password
改成你合法的信箱和信箱密碼,執行
$ python app_test.py
Login Email 按鈕:按下 Login Email 按鈕輸入剛剛修改的合法信箱和密碼
Edit Receiver Email 按鈕:按下 Edit Receiver Email 按鈕輸入接收者的信箱(一行一個信箱),第一第二個信箱請輸入終端的提示訊息的信箱(為了測試),其他行數可以是其他信箱
Send Email 按鈕:按下 Send Email 按鈕會發送超時訊息到 Edit Receiver Email 設定的接收者
Run 按鈕:按下後會開始分析選擇的資料夾內所有未分析過的影片,若工作累計時數超過預設工作時數上限(8小時)就會發送工作超時訊息給 EmailList.txt 內設定的信箱
測試結果:OK