# pose detection部屬
# 如何標註數據集(COCO標註格式數據集&yolo格式)
- 使用[labelme](https://github.com/wkentaro/labelme/releases)
- 避免儲存images二進制信息,把file-save with image data關掉
### 轉成MS COCO格式
- 一個json文件,包含所有數據集全部標註
- categories列表裡面的每一個元素,代表一類框包含該類框的關鍵點類別名稱(框的類別),跟連接關係
- images裡面代表一張圖像包含該圖像的文件名、寬、高、圖像id
- annotations裡面包含每一個元素,代表一個框包含框內的目標檢測、實例分割、關鍵點檢測標註
- 寫完,還沒包起來
### 轉成yolo格式
- dataset
- images
- train
- 0001.jpg
- val
- 0005.jpg
- labels
- train
- 0001.txt
- val
- 0005.txt
- txt文件格式含意
```python=
cls_id cx cy w h x1 y1 v1 x2 y2 v2 x3 y3 v3.....
```
- cx cy w h:框的中心點和寬高
- x1 y1 v1 x2 y2 v2 x3 y3 v3 : 按關鍵點類別順序排序(固定)
- 所有座標都要寬高歸一化
- 通常框的類別都是一個,所以通常為0
- 寫完,還沒包起來
# DownTop算法
## openpose
## 須完成事項(因為官方源碼不是pytorch,所以不能像yolo直接用,可能要自己寫)
### 1.需要能夠訓練(pytorch):check
:ballot_box_with_check: 完成
- 源碼後處理涉及c++使用(windows不好弄)
- 自己抓其他源碼架構(目前只抓backbone VGG19版本,是論文中使用的backbone),建立純python openpose版本
- 目前所有代碼放在nexuni_pose_detection資料夾裡面,直接複製就可以訓練,視覺化,後處理等等,不需要調用c++(還需要檢測fps, 目前公司沒有攝像頭,要等)。
- 目前後處理代碼在./validation/body.py
### 2.能夠在windows,linux部署訓練(官方repo不好在windows部屬,也沒有pytorch源碼)
:ballot_box_with_check: 完成
- 優化訓練代碼,新增能夠載入預訓練模型權重(不知道為什麼原始training沒寫)
- 訓練代碼是./train/train_VGG19.py,會需要配置一些文件
- 可以使用預訓練模型路徑,還有一些常見參數(目前預訓練模型放在./train/weights/)
- 目前是用coco資料集,未來要用自己的資料要重寫dataloader(資料集放在./coco)
- 配置好之後就可以執行該檔案訓練
### 3.能夠視覺化圖片(前處理、後處理要掌握)。對不同的接口要能夠實時輸出圖片(camera、imagefile、usb)
:ballot_box_with_check: 完成
- 目前可以使用rtsp、usb、圖片資料及測試,代碼在./validation/running_by_different_device.py
### 4.盡量不要用多種語言(不好部屬,openpose後處理源碼有調用c++,很煩,最好能夠換python)
:ballot_box_with_check:
- 目前能夠使用python(pytorch)達成訓練、測試、視覺化
### 5.可接分類器(要能夠抓不同部位座標,進行訓練,可採用一般分類器,不一定要nn)
:question: 可以實現,還沒寫代碼
- 目前想法:採用一般分類器,跟原模型分成兩階段(ex : openpose + lightgbm)。來做姿態分類(需要測試)
- 已經寫好輸出不同關鍵點座標pipeline,可以隨意調用不同部位座標,以利作後續分類處理及其他應用(./validation/get_keypoints.py)
### 6.構建自己資料集(視情況,看應用場景模型表現)
:ballot_box_with_check: 完成
- 寫了一個labelme轉換mscoco形式的代碼可以將自己資料集轉換成coco格式,可以訓練(coco api讀取沒問題,應該是可以訓練,因為openpose也是用coco api讀檔)
- coco資料及格式
- images
- annotation
- person_keypoints_val2014.json
- 最好用coco api讀取資料
- from pycocotools.coco import COCO
- coco = COCO(anno_path) # 讀取json路徑
- coco = coco.imgs # 後面要讀取的圖片idx
- [42, 73, 74, 133, 136, 139, 143, 164, 192, 196、、、]
- coco.getCatIds(catNms=['person']) : 獲取人的圖片idx
- 如果要獲取keypoints詳細資料
- det = self.coco
- ann_ids = det.getAnnIds(imgIds=img_id)
- anns = det.loadAnns(ann_ids)
- [195946, 253933, 1225755, 1733076, 1747768, 1751664] # 有可能有,但不代表keypoints有東西,有可能是其他檢測的資訊
- ann["keypoints"][0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...]# 這個情況要跳過
- ann["keypoints"][38, 181, 2, 0, 0, 0, 37, 166, 2, 0, 0, 0, 10, 171, ...]# 這個情況有keypoints,要處理reshape([-1, 3]
- 三個為一組,順序為x、y、可視度(0、1、2)
- 獲取bbox資訊
- for ann in anns:
- xmin, ymin, w, h = ann['bbox']
- 建立dataset info
- box : [0.84, 114.71, 53.54, 257.7]
- image_path : 'C:\\Users\\User\\deep-learning-for-image-processing\\pytorch_keypoint\\coco2014\\val2014\\COCO_val2014_000000000136.jpg'
- image_id : 136
- image_width : 500
- image_height : 374
- obj_origin_hw : [257.7, 53.54]
- obj_index : 0
- score : 1
- keypoints
- visible
### 8.推理速度問題
- tensorRT(還沒學)
- 使用torch.cuda.synchronize()進行同步推理,因為cuda一般有異步推理
# 單階段算法
## YOLOv8
- paper:https://arxiv.org/abs/2204.06806
### 1.需要能夠訓練(pytorch):check
:ballot_box_with_check: 完成
### 2.能夠在windows部署訓練
:ballot_box_with_check: 完成
### 3.能夠視覺化圖片(前處理、後處理要掌握)。對不同的接口要能夠實時輸出圖片(camera、imagefile、usb)
- 還沒寫,確定寫得出來
### 5.可接分類器(要能夠抓不同部位座標,進行訓練,可採用一般分類器,不一定要nn)
:question: 可以實現,還沒寫代碼
### 6.構建自己資料集(視情況,看應用場景模型表現)
:ballot_box_with_check: 完成
- 使用labelme標記數據集,轉換成yolov8格式,並且可以訓練
### 5.可接分類器
- 看起來沒問題
### 封裝各種函數
- 調用攝像頭、圖片集,usb、mp4
- 把畫圖函數寫好,可以調用處理一偵一偵
- 先寫mp4的
# TopDown算法類
## RTMpose(下周有空看論文還有實現)
- paper:https://arxiv.org/abs/2303.07399
- based papers
- [HRNet](https://arxiv.org/abs/1908.07919)
- [SimCC](https://arxiv.org/abs/2107.03332)