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