![](https://hackmd.io/_uploads/SkrBFSMY2.png) 來源>https://github.com/Megvii-BaseDetection/YOLOX/blob/main/assets/logo.png # 使用Python IDLE環境安裝 [參考來源](https://medium.com/ai-for-k12/python-%E7%9A%84-virtualenv-%E8%99%9B%E6%93%AC%E7%92%B0%E5%A2%83%E5%AE%89%E8%A3%9D%E8%88%87%E4%BD%BF%E7%94%A8-8645f5884aac) ## (建議)更新pip ```python= pip3 install --upgrade pip ``` ![](https://hackmd.io/_uploads/r1yLCSGYh.jpg) 這裡我已經有先安裝(更新),所以在這邊顯示already satisfied ## 查看當前環境 ```python= pip3 list ``` ![](https://hackmd.io/_uploads/SJ3G1Uzth.jpg) pip當前版本為23.1.2 ## Step 1:安裝virtualenv ```python= pip3 install virtualenv ``` ![](https://hackmd.io/_uploads/SJQ0k8MY3.jpg) 這裡我已經有先安裝(更新),所以在這邊顯示也already satisfied ## Step 2:到目標資料夾 ```c= d: //切換D曹 cd D:\YOLOX_TEST //移動到YOLOX_TEST資料夾(需先創好) ``` ## Step 3:建立虛擬環境 ```python= virtualenv env02 ``` ![](https://hackmd.io/_uploads/rk8UXIMY3.jpg) 建好之後會有一個env02的資料夾 ## Step 4 : 啟動虛擬環境 ```c= cd env02\Scripts activate //啟動 ``` ## (補充)離開虛擬環境 ```c= deactivate ``` # YOLOX 環境 [參考來源1](https://hackmd.io/@ytg9xX-YRdGzl4AA7L8t_A/HktxHvhOh#%E5%95%8F%E9%A1%8C) [參考來源2](https://d246810g2000.medium.com/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E8%B3%87%E6%96%99%E9%9B%86%E8%A8%93%E7%B7%B4-yolox-c02548734a48) ## Step 1 : 下載 ```python= git clone https://github.com/Megvii-BaseDetection/YOLOX.git ``` ## Step 2 : 安裝套件 ```python= cd YOLOX pip3 install -r requirements.txt # pip3 install -v -e . # or python3 setup.py develop ``` * 測試pytorch GPU ```python= python import torch torch.cuda.is_available() exit() # True 代表可以使用GPU # False 代表只能使用CPU ``` * 如需使用GPU,pytorch預設安裝CPU版,需卸載重安裝 ```python= # 卸載 pip uninstall torch torchvision # 去官網根據CUDA版本裝 # 以 cuda 11為例 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 ``` ## Step 3 : 測試(預測) [權重下載](https://github.com/Megvii-BaseDetection/YOLOX#benchmark) 在YOLOX創一個weights資料夾把權重丟到裡面 ```python= # 圖片 python tools/demo.py image -n yolox-s -c weights/yolox_s.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu] # 影片 python tools/demo.py video -n yolox-s -c weights/yolox_s.pth --path /path/to/your/video --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu] # 後面選擇 gpu or cpu ``` 補充(用預設權重跑跑看webcam) ``` #需修改demo.py ``` * 可能會發生 ModuleNotFoundError: No module named 'yolox'的問題 解法在下面 -f 後面放參數設定的檔案,這邊使用官方的預設參數 exps/default/yolox_s.py -c 後面放預測時使用的 weight 檔,這邊使用官方的預訓練模型 yolox_s.pth --path 後面放你要預測的圖片路徑,也可以放想要預測的資料夾路徑,這邊使用官方提供的照片assets/dog.jpg --conf 後面放 confidence 的 threshold,這邊使用 0.25 --nms 後面放非極大值抑制 (Non-Maximum Suppression) 的 threshold,這邊使用 0.45 --tsize 後面放你要將影像 resize 成多大丟進模型裡預測,這邊使用 640 --save_result 如果要將預測結果存下來可以加這個 --device 要用什麼 device 預測,可選 cpu 或 gpu,這邊使用 gpu # 訓練 ## 測試訓練環境 [參考midnightla大神](https://ithelp.ithome.com.tw/articles/10305905) 利用coco128資料集測試訓練環境 ### 部屬Coco128 [coco128](https://drive.google.com/file/d/16N3u36ycNd70m23IM7vMuRQXejAJY9Fs/view) * 將coco128資料集解壓縮,並移到YOLOX下的datasets資料夾內。 ![](https://hackmd.io/_uploads/rJD3sKfKh.jpg) * 資料集結構如下圖 ![](https://hackmd.io/_uploads/HyHWnFfK3.png) * 下載[預訓練模型YOLOX-s權重](https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth),並放到YOLOX資料夾內或在cmd執行以下指令 ``` # 下載預訓練權重 wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth ``` ### yolox-s.py參數檔 * 開啟yolox-s.py:./YOLOX/exps/example/custom/yolox-s.py ![](https://hackmd.io/_uploads/B11kRKMF3.jpg) * 確認參數 ```python= # 資料集與COCO格式標籤路徑 self.data_dir = "datasets/coco128" self.train_ann = "instances_train2017.json" self.val_ann = "instances_val2017.json" # 資料集類別數量(coco128有71個類別) self.num_classes = 71 # 模型迭代次數 self.max_epoch = 300 # 影響資料前處理速度,通常使用4或8 self.data_num_workers = 4 ``` * coco_classes.py:去`YOLOX\yolox\data\datasets\coco_classes.py`將COCO_CLASSES = ( ) 中的類別,修改成coco128的71個類別。 ![](https://hackmd.io/_uploads/Hy9R0FfY3.jpg) * 開始訓練 ```= python tools/train.py -f exps/example/custom/yolox_s.py -d 1 -b 64 --fp16 -o -c yolox_s.pth ``` ==-d 太大可能會導致GPU不夠用報錯== * windows環境下可能會遇到以下問題 1. ModuleNotFoundError: No module named 'yolox' 2. Error building extension 'fast_cocoeval' 3. AttributeError: module 'yolox.layers.fast_coco_eval_api' has no attribute 'InstanceAnnotation' **解法會統整在下面問題** * Demo測試 ``` python tools/demo.py image -f exps/example/custom/yolox_s.py -c YOLOX_outputs/coco128/best_ckpt.pth --path assets/ --conf 0.25 --nms 0.5 --tsize 640 --save_result --device gpu #注意路徑 ``` # 訓練自己model * 建議將資料格式整理如下,才不須改額外程式 ``` |----YOLOX | |----datasets | | |----VOCdevkit | | | |----VOC2007 | | | | |----Annotations #放置*xml | | | | |----JPEGImages #放置圖片 | | | | |----ImageSets | | | | | |----Main | | | | | | |----trainval.txt | | | | | | |----val.txt ``` * trainval.txt 和 val.txt格式如下 > 只需檔名,不用附檔名 ![](https://hackmd.io/_uploads/SJ_bcczYn.jpg) * 類別更改 修改yolox\data\datasets\voc_classes.py,改成自己類別 ``` VOC_CLASSES = ( "car", "person", "truck", "motorbike", "bicycle", "bus", "spc" ) ``` * 訓練中模型儲存 ``` # save history checkpoint or not. # If set to False, yolox will only save latest and best ckpt. self.save_history_ckpt = True ``` 只有==一圈存一次==和==只存最佳==和==最後==模型 * 更改幾圈存一次,修改`YOLOX\yolox\core\trainer.py` ``` class Trainer: ... if self.save_history_ckpt: if self.epoch % 次數 == 0: self.save_ckpt(f"epoch_{self.epoch + 1}", ap=ap50_95) ``` * 修改訓練資料集設定檔 * 複製一份 `exps/example/yolox_voc/yolox_voc_s.py`,進行修改 > YOLOX\exps\default ``` self.num_classes = 7 # 改成自己的類別數量 # 依據模型所以用預權重模型更改 # 以下為yolox_s self.depth = 0.33 self.width = 0.50 # 更改尺寸 # 更改voc路徑 ``` * 訓練 ``` python tools/train.py -f D:\YOLOX\exps\example\yolox_voc\自己修改的.py -d 1 -b 16 --fp16 -o -c yolox_s.pth ``` * (補充)斷點訓練 [參考](https://blog.csdn.net/weixin_44570845/article/details/127191019) >-c latest_ckpt.pth –resume –start_epoch=斷點圈數 ``` python tools/train.py -f D:\YOLOX\exps\example\yolox_voc\自己修改的.py -d 1 -b 16 --fp16 -o -c YOLOX_outputs/yolox_voc_s/latest_ckpt.pth --resume --start_epoch=250 ``` * 使用tensorboard查看訓練狀況 ```python tensorboard --logdir=#tensorboard資料夾路徑 ``` ![](https://hackmd.io/_uploads/r1GAY-SK3.png) 開啟瀏覽器http://localhost:6006/ ## 驗證模型 >-f 訓練時的設定檔 -c 訓練完的權重 ``` # 圖片 python tools/demo.py image -f D:\YOLOX\exps\example\yolox_voc\自己修改的.py -c /path/to/your/yolox_s.pth --path /path/to/your/image --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu] # 影片 python tools/demo.py video -f D:\YOLOX\exps\example\yolox_voc\自己修改的.py-c /path/to/your/yolox_s.pth --path /path/to/your/video --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu] ``` # 轉換成Tensorrt [參考來源](https://github.com/Megvii-BaseDetection/YOLOX/tree/main/demo/TensorRT/python) > 將pytorch權重轉換成Tensorrt ## 安裝Tensorrt :::info 需先辦nvidia帳號 cuda/cudnn/Tensorrt版本要互相對應 ::: - [官網](https://developer.nvidia.com/nvidia-tensorrt-download)下載,根據作業系統安裝Tensorrt - 解壓縮後進到`TensorRT-8.6.1.6/python/`,根據python版本安裝 ```shell= # 以Windows和python3.8為例 pip install tensorrt-8.6.1-cp38-none-win_amd64.whl ``` ## 安裝torch2trt [Github](https://github.com/NVIDIA-AI-IOT/torch2trt) ```shell= git clone https://github.com/NVIDIA-AI-IOT/torch2trt cd torch2trt python setup.py install ``` ## 轉換指令 ```shell= # 原始的權重 python tools/trt.py -n 模型名稱 -c <轉換的權重.pth> # 自己訓練的 python tools/trt.py -f <訓練的.py> -c <轉換的權重.pth> ``` 權重會生成在`YOLOX_outputs/訓練的檔名/` - model_trt.engine (for C++ demo) - model_trt.pth ## 驗證指令 加上`--trt`會去根據訓練的.py找model_trt.pth ``` python demo.py image -f <訓練的.py> --trt --save_result --path <圖片/圖片資料夾路徑> ``` # 問題 ## Q1 : AttributeError: module ``` AttributeError: module ‘torch._C‘ has no attribute ‘_cuda_setDevice ``` * 解法 pytorch 預設是安裝CPU版 -> 改裝GPU版 ## Q2 : ModuleNotFoundError: No module named 'yolox'(demo.py) ``` Traceback (most recent call last): File "tools/demo.py", line 14, in <module> from yolox.data.data_augment import ValTransform ModuleNotFoundError: No module named 'yolox' ``` * 解法 : ``` # 在tools/demo.py import yolox之前加入YOLOX專案路徑,看是哪個檔案報錯 import sys sys.path.append("D:\YOLOX_TEST\env02\Scripts\YOLOX") ``` ![](https://hackmd.io/_uploads/S1zjywMKh.jpg) ## Q3 : ModuleNotFoundError: No module named 'yolox'(train.py) ``` File "tools/train.py", line 13, in <module> from yolox.core import launch ModuleNotFoundError: No module named 'yolox' ``` * 解法 ``` # 在tools/train.py import yolox之前加入YOLOX專案路徑,看是哪個檔案報錯 import sys sys.path.append("D:\YOLOX_TEST\env02\Scripts\YOLOX") ``` ## Q4 : Error building extension ``` Error building extension 'fast_cocoeval' ``` * 解法 修改YOLOX\yolox\layers\jit_ops.py fast_cocoeval -> 改成fast_coco_eval_api ``` # 原始 class FastCOCOEvalOp(JitOp): def __init__(self, name="fast_cocoeval"): super().__init__(name=name) # 更改 class FastCOCOEvalOp(JitOp): def __init__(self, name="fast_coco_eval_api"): super().__init__(name=name) ``` ## Q5 : AttributeError: module ``` AttributeError: module ‘yolox.layers.fast_coco_eval_api’ has no attribute ‘InstanceAnnotation’ ``` * 解法 修改YOLOX\yolox\evaluators\coco_evaluator.py ``` #原from yolox.layers import COCOeval_opt as COCOeval from pycocotools.cocoeval import COCOeval ``` ## Q6 : windows 會遇到的路徑問題 * 解法 ![](https://hackmd.io/_uploads/rkYIwZrKh.jpg) 多加了282行,annopath 需要另外串起來 ## Q7 : tensorboard 只顯示val ![](https://hackmd.io/_uploads/B1x09-rK2.png) *解法 資料集太小,會導致預設程式跑不到下面 ```python= def after_epoch(self):#會跑 ... def before_iter(self):#會跑 ... def after_iter(self):#不會進這段程式 """ `after_iter` contains two parts of logic: * log information * reset setting of resize """ # log needed information ``` 把資料集改大及即可 >coco128資料集本身太小也會只顯示val 不會有loss...等資訊 [在此非常感謝07大神指導](https://hackmd.io/@ytg9xX-YRdGzl4AA7L8t_A/HktxHvhOh#%E5%95%8F%E9%A1%8C)