--- title: 'openCV tracker分給各個核心運算研究' disqus: hackmd --- openCV tracker 分給各個核心運算 PROCESS POOL 之研究(ubuntu18.04) === 文件版本.:v0.0.1 [TOC] ## 1. 筆記解說 主要解決問題,如下圖,再多個追蹤也只再1個core上執行,例如下圖示追蹤3人 也只用一個core來跑 ![](https://i.imgur.com/xLRdmUB.png) 主要是參考 參考文獻 [Multi-object tracking with dlib](https://www.pyimagesearch.com/2018/10/29/multi-object-tracking-with-dlib/) ,主要是透過 MobileNetSSD 將 frame 內人物框出(得出 bounding box 資訊),再利用 **multiprocessing PROCESS POOL** 方法將 frame 與要追的目標等資訊利用各個邏輯核心生成 process(非multi thread) 去執行 openCV tracker ,規劃出兩種架構跟原始的 openCV multi-tracker 做出比較 ## 2. 各架構解說 ### (1) 首先偵測出當前 frame 的 person 位置,會獲得 bounding box 資訊 MobileNetSSD => 自動框出人物取得bounding box等資訊 已經從此程式分解出用法,可參考此 [github](https://github.com/masteree108/mobileNetSSD_test) 跑單張圖片執行結果 ![](https://i.imgur.com/GWjqzoz.jpg) ### (2) 接下來的使用三種架構來對影片人物進行追蹤( openCV tracker 都是使用 CSRT ) #### 方法1. 使用單一個邏輯核心執行 :::info 為並發運算 Concurrent Computing ::: ![](https://i.imgur.com/AJJmpPZ.png) 主要是使用 openCV 的 multi-tracker 方法 此方法只會在單一個邏輯核心上執行 openCV multi-tracker,多人需追蹤時會依靠 multi-thread 來達成 其作用為跟下面兩種架構進行比較 #### 方法2. 使用多個 邏輯核心 執行 注意下方 邏輯核心-1的用意留1個邏輯核心給 OS 使用 :::info 為並行運算 parallel Computing ::: ![](https://i.imgur.com/Jp58az6.png) ##### 若偵測的人物 大於或等於 電腦的 邏輯核心-1 : 宣告大小為 電腦的 邏輯核心-1 數目的 process pool 讓 OS 分配 openCV tracker 在哪個 邏輯核心 上執行追蹤任務 **(1個 邏輯核心 負責執行 *一個人物* 的追蹤)** 其他超出數目的追蹤任務必須等待指定的 邏輯核心 追蹤任務完成才會創立新的process進行追蹤 ##### 若偵測的人物 小於 電腦的 邏輯核心-1: 宣告為該偵測人物數目的 process pool 讓 OS 分配 openCV tracker 在哪個 邏輯核心 上執行追蹤任務 #### 方法3. 使用多個 邏輯核心 + multi-thread 執行 :::info 為並行運算 parallel Computing + 並發運算 Concurrent Computing ::: ![](https://i.imgur.com/DAYyeoO.png) ##### 若偵測的人物 大於或等於 電腦的 邏輯核心-1: 宣告大小為 電腦的 邏輯核心-1 數目的 process pool 讓 OS 分配 openCV multi tracker 在哪個 邏輯核心 上執行追蹤任務 **(1個 邏輯核心 負責執行 *多個人物* 的追蹤)** 例如下圖追蹤人物為30人超出 邏輯核心:11 的數目,會安排下方的追蹤配置 ![](https://i.imgur.com/Tv71lbI.png) 前面的8個 邏輯核心 負責追蹤3人,後面的3個 邏輯核心 每個只需追蹤2人 ##### 若偵測的人物 小於 電腦的 邏輯核心-1: 宣告為該偵測人物數目的 process pool 讓OS分配 openCV multi-tracker 在哪個 邏輯核心 上執行追蹤任務 ## 3. 執行結果 #### 執行結果1 顯示最快的為方法3 其速度比原始的方法1平均快1.758秒 ![](https://i.imgur.com/DAdKeqT.png) ![](https://i.imgur.com/7R8diQo.png) #### 執行結果2 顯示最快的為方法2 其速度比原始的方法1平均快12.765秒 ![](https://i.imgur.com/FbQ36Sq.png) ![](https://i.imgur.com/jhcD6Zq.png) #### 執行結果3 顯示最快的為方法3 其速度比原始的方法1平均快11.048秒 ![](https://i.imgur.com/w2Bt6ql.png) ![](https://i.imgur.com/f8DKg0I.png) #### 執行結果4 顯示最快的為方法3 其速度比原始的方法1平均快21.559秒 注意方法2在多個追蹤時速度+過大的影片size時 速度會至減慢跟方法1只差2秒 ![](https://i.imgur.com/m5SZmCW.png) ## 4. 範例程式與測試影片下載 請至此 [github](https://github.com/masteree108/process_pool_MOT) 位置 下載 code ``` $ git clone https://github.com/masteree108/process_pool_MOT.git or $ git clone git@github.com:masteree108/process_pool_MOT.git ``` 測試影片可至[此網址](https://drive.google.com/drive/folders/1UAoMQ07fZSa4XdDvKyOZhzxBrBSE1cxo?usp=sharing)下載 ## 5. 範例程式執行 ### 執行方法1的指令: 若要改變觀察影片請修改如下檔案 ``` $ vim run_one_logical_core_cv_multi_tracker.sh ``` ![](https://i.imgur.com/Ean0qbI.png) 若要改變frame size 請修改入下檔案 ``` $ vim one_logical_core_cv_multi_tracker.py ``` ![](https://i.imgur.com/DNFMG58.png) 執行指令 ``` $ ./run_one_logical_core_cv_multi_tracker.sh ``` ### 執行方法2的指令: 若要改變觀察影片請修改如下檔案 ``` $ vim run_process_pool_cv_tracker.sh ``` 若要改變frame size 請修改入下檔案 ``` $ vim process_pool_cv_tracker.py ``` ![](https://i.imgur.com/mIrTUCG.png) 執行指令 ``` $ ./run_process_pool_cv_tracker.sh ``` ### 執行方法3的指令: 若要改變觀察影片請修改如下檔案 ``` $ vim run_process_pool_cv_multi_tracker.sh ``` 若要改變frame size 請修改入下檔案 ``` $ vim process_pool_cv_multi_tracker.py ``` ![](https://i.imgur.com/CpnOCKM.png) 執行指令 ``` $ ./run_process_pool_cv_multi_tracker.sh ``` ## 6. 觀察 cpu loading 指令 ( ubuntu ) 除了用top htop 等 command也能觀察之外,執行下列的指令 還能看到樹狀結構 ### 觀察方法2的指令: ``` $ ps axu | grep [m]ulti_object_tracking_fast.py | awk '{print $2}' | xargs -n1 -I{} ps -o sid= -p {} | xargs -n1 -I{} ps --forest -o user,pid,ppid,cpuid,%cpu,%mem,stat,start,time,command -g {} or 執行 script 如下 $ ./watch_cpu_loading_PPCT.sh ``` ### 觀察方法3的指令: ``` $ ps axu | grep [p]rocess_pool_cv_multi_tracker.py | awk '{print $2}' | xargs -n1 -I{} ps -o sid= -p {} | xargs -n1 -I{} ps --forest -o user,pid,ppid,cpuid,%c pu,%mem,stat,start,time,command -g {} or 執行 script 如下 $ ./watch_cpu_loading_PPCMT.sh ``` ![](https://i.imgur.com/Za2rpIE.png) 294是所有core 再執行這process的使用率總和 ## 7. 其他指令 cpu 可並行處理的數量公式 ![](https://i.imgur.com/oBlRyrO.png) [這張圖的討論區](https://stackoverflow.com/questions/19225859/difference-between-core-and-processor) ``` Threads per core X cores per socket X sockets ``` ![](https://i.imgur.com/prnS3go.png) ``` grep 'cpu cores' /proc/cpuinfo | uniq ``` ![](https://i.imgur.com/KrsYtUx.png) ``` nproc --all ``` [參考網站](https://www.cyberciti.biz/faq/check-how-many-cpus-are-there-in-linux-system/) ## 8. 指定的processer重複問題 目前無解 ![](https://i.imgur.com/HFKHVtP.png) ## 9. 參考文獻 [Multi-object tracking with dlib](https://www.pyimagesearch.com/2018/10/29/multi-object-tracking-with-dlib/) [關於 multiprocessing module1](https://docs.python.org/3.4/library/multiprocessing.html#module-multiprocessing) [關於 multiprocessing module2](https://sebastianraschka.com/Articles/2014_multiprocessing.html) [A Hands on Guide to Multiprocessing in Python](https://towardsdatascience.com/a-hands-on-guide-to-multiprocessing-in-python-48b59bfcc89e) [the pool class](https://sebastianraschka.com/Articles/2014_multiprocessing.html#the-pool-class) ![](https://i.imgur.com/xLOptsq.png) [multiprocess 多進程組件Pool](https://www.itread01.com/content/1521659196.html) [【Python教學】淺談 Multi-processing pool 使用方法](https://www.maxlist.xyz/2020/03/20/multi-processing-pool/) [cv2.dnn.blobFromImage()函数用法](https://blog.csdn.net/weixin_42216109/article/details/103010206) [CPU Cores VS Threads - Explained](youtube.com/watch?v=hwTYDQ0zZOw&feature=youtu.be) ![](https://i.imgur.com/JvM2qLd.png) Logical cores are the number of Physical cores times the number of threads that can run on each cores. https://www.quora.com/What-is-the-difference-between-core-and-logical-processor [ Difference between core and processor](https://stackoverflow.com/questions/19225859/difference-between-core-and-processor) ![](https://i.imgur.com/GT4W80Q.png) [下圖分配給各個core與使用單一core的資料來源](https://www.geeksforgeeks.org/synchronization-pooling-processes-python/) ![](https://i.imgur.com/Vhydeco.png) ![](https://i.imgur.com/sj661Mi.png) 下圖的[資料來源](https://www.linkedin.com/pulse/understanding-physical-logical-cpus-akshay-deshpande) ![](https://i.imgur.com/ZlmnMHh.png) [指定一個 process 運作 ](https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes) ![](https://i.imgur.com/ZYkKMCL.png) 03/29 https://docs.python.org/zh-cn/3/library/multiprocessing.html SharedArray 可再process 之間傳輸資料 但 cv2.MultiTracker 無法傳輸 https://pypi.org/project/SharedArray/ ''' delete share array if this process close method is not right 56 for name in sa.list(): 57 shm_name = name.name.decode('utf-8') 58 sa.delete(shm_name) ''' https://medium.com/analytics-vidhya/using-numpy-efficiently-between-processes-1bee17dcb01 https://www.pyimagesearch.com/2019/09/09/multiprocessing-with-opencv-and-python/ ###### tags: `study`, `VoTT`