---
title: '論文實驗 - openCV tracker 三種架構之比較'
disqus: hackmd
---
論文實驗 - openCV tracker 三種架構之比較
===
文件版本.:v0.0.1
進度:尚未完成
[TOC]
## 1. 筆記解說
主要解決問題,如下圖,再多個追蹤也只再1個core上執行,例如下圖示追蹤3人
也只用一個core來跑

主要是參考 參考文獻 [Multi-object tracking with dlib](https://www.pyimagesearch.com/2018/10/29/multi-object-tracking-with-dlib/)
### 實驗流程
主要是透過 yolov4 將 frame 內人物框出(得出 bounding box 資訊),
再比較下列三種方法,以下皆使用 CSRT 演算法
```
(1) opencv multi-tracker 單核執行追蹤
(2)opencv single-traker 分配給各個核心(即便人數>邏輯核心數目-2,也
會開出與人數相同之process)
(3) opencv multi-tracker 分配給計算好大小的核心(process數目最多開到邏輯核心數-2)
```
切割影片 尚未完成
## 2. 測試要求
```gherkin=
此為測試目前能使用到的最高版本,太高在tracker方面會出問題
$ conda activate tracker
$ pip install opencv-python==4.4.0.40
$ pip install opencv-contrib-python==4.4.0.40
```
注意 yolov4 使用需至 yolo 官網下載如下資料
```
wget https://github.com/AlexeyAB/darknet/tree/master/cfg/yolov4.cfg
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
```
## 3. 各架構解說
### (1) 首先偵測出當前 frame 的 person 位置,會獲得 bounding box 資訊
yolov4 => 自動框出人物取的 bounding box 等資訊
### (2) 接下來的使用三種架構來對影片人物進行追蹤( openCV tracker 都是使用 CSRT )
#### 方法1. 使用單一個邏輯核心執行
:::info
為並發運算 Concurrent Computing
:::

主要是使用 openCV 的 multi-tracker 方法
此方法只會在單一個邏輯核心上執行 openCV multi-tracker,多人需追蹤時會依靠 multi-thread 來達成
其作用為跟下面兩種架構進行比較
#### 方法2. 使用多個 邏輯核心 執行
注意下方 邏輯核心-1的用意留1個邏輯核心給 OS 使用
:::info
為並行運算 parallel Computing
:::

##### 若偵測的人物 大於或等於 電腦的 邏輯核心-1 :
宣告大小為 電腦的 邏輯核心-1 數目的 process pool
讓 OS 分配 openCV tracker 在哪個 邏輯核心 上執行追蹤任務
**(1個 邏輯核心 負責執行 *一個人物* 的追蹤)**
其他超出數目的追蹤任務必須等待指定的 邏輯核心 追蹤任務完成才會創立新的process進行追蹤
##### 若偵測的人物 小於 電腦的 邏輯核心-1:
宣告為該偵測人物數目的 process pool
讓 OS 分配 openCV tracker 在哪個 邏輯核心 上執行追蹤任務
#### 方法3. 使用多個 邏輯核心 + multi-thread 執行
:::info
為並行運算 parallel Computing + 並發運算 Concurrent Computing
:::

##### 若偵測的人物 大於或等於 電腦的 邏輯核心-1:
宣告大小為 電腦的 邏輯核心-1 數目的 process pool
讓 OS 分配 openCV multi tracker 在哪個 邏輯核心 上執行追蹤任務
**(1個 邏輯核心 負責執行 *多個人物* 的追蹤)**
例如下圖追蹤人物為30人超出 邏輯核心:11 的數目,會安排下方的追蹤配置

前面的8個 邏輯核心 負責追蹤3人,後面的3個 邏輯核心 每個只需追蹤2人
##### 若偵測的人物 小於 電腦的 邏輯核心-1:
宣告為該偵測人物數目的 process pool
讓OS分配 openCV multi-tracker 在哪個 邏輯核心 上執行追蹤任務
## 3. 執行結果
#### 執行結果1
顯示最快的為方法3
其速度比原始的方法1平均快1.758秒


#### 執行結果2
顯示最快的為方法2
其速度比原始的方法1平均快12.765秒


#### 執行結果3
顯示最快的為方法3
其速度比原始的方法1平均快11.048秒


#### 執行結果4
顯示最快的為方法3
其速度比原始的方法1平均快21.559秒
注意方法2在多個追蹤時速度+過大的影片size時 速度會至減慢跟方法1只差2秒

## 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
```

若要改變frame size 請修改入下檔案
```
$ vim one_logical_core_cv_multi_tracker.py
```

執行指令
```
$ ./run_one_logical_core_cv_multi_tracker.sh
```
### 執行方法2的指令:
若要改變觀察影片請修改如下檔案
```
$ vim run_process_pool_cv_tracker.sh
```
若要改變frame size 請修改入下檔案
```
$ vim process_pool_cv_tracker.py
```

執行指令
```
$ ./run_process_pool_cv_tracker.sh
```
### 執行方法3的指令:
若要改變觀察影片請修改如下檔案
```
$ vim run_process_pool_cv_multi_tracker.sh
```
若要改變frame size 請修改入下檔案
```
$ vim process_pool_cv_multi_tracker.py
```

執行指令
```
$ ./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
```

294是所有core 再執行這process的使用率總和
## 7. 其他指令
cpu 可並行處理的數量公式

[這張圖的討論區](https://stackoverflow.com/questions/19225859/difference-between-core-and-processor)
```
Threads per core X cores per socket X sockets
```

```
grep 'cpu cores' /proc/cpuinfo | uniq
```

```
nproc --all
```
[參考網站](https://www.cyberciti.biz/faq/check-how-many-cpus-are-there-in-linux-system/)
## 8. 指定的processer重複問題
目前無解

## 9. 參考文獻
https://github.com/AlexeyAB/darknet
[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)

[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)

[
Difference between core and processor](https://stackoverflow.com/questions/19225859/difference-between-core-and-processor)

[下圖分配給各個core與使用單一core的資料來源](https://www.geeksforgeeks.org/synchronization-pooling-processes-python/)


下圖的[資料來源](https://www.linkedin.com/pulse/understanding-physical-logical-cpus-akshay-deshpande)

[指定一個 process 運作 ](https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes)

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`