---
# System prepended metadata

title: pose detection部屬

---

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

