# YOLOX安裝及實作 ###### tags: `YOLO` `Windows` `YOLOX` [YOLOX Github](https://github.com/Megvii-BaseDetection/YOLOX) ## python環境 ### venv建立 ``` python -m venv <path/venv_dir> ``` ## 進入venv Windows ```cmd \path\venv_dir\Scripts\activate ``` Linux ```bash source path/venv_dir/bin/activate ``` ## pip ### 更新pip ```bash python -m pip install -U pip ``` :::info ``` TypeError: expected str, bytes or os.PathLike object, not int ``` 出現上述錯誤時加上`--no-cache-dir`重新更新 ::: ## YOLOX環境 [參考來源](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) ### 下載 ``` git clone https://github.com/Megvii-BaseDetection/YOLOX.git ``` ### 安裝套件 ``` cd YOLOX pip3 install -r requirements.txt # pip3 install -v -e . # or python3 setup.py develop ``` - 測試pytorch GPU ``` import torch torch.cuda.is_available() # True 代表可以使用GPU # False 代表只能使用CPU ``` - 如需使用GPU,pytorch預設安裝CPU版,需卸載重安裝 ``` # 卸載 pip uninstall torch torchvision # 去官網根據CUDA版本裝 # 以 cuda 11為例 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 ``` ### 測試 [權重下載](https://github.com/Megvii-BaseDetection/YOLOX#standard-models) ``` # 圖片 python tools/demo.py image -n yolox-s -c /path/to/your/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 /path/to/your/yolox_s.pth --path /path/to/your/video --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu] ``` ### 訓練 [參考來源](https://blog.csdn.net/qq_39056987/article/details/119002910) - 資料集格式可使用`voc`和`coco`格式 - VOC > 建議將資料格式整理如下,才不須改額外程式 ``` |----YOLOX | |----datasets | | |----VOCdevkit | | | |----VOC2007 | | | | |----Annotations #放置*xml | | | | |----JPEGImages #放置圖片 | | | | |----ImageSets | | | | | |----Main | | | | | | |----trainval.txt | | | | | | |----val.txt ``` - `trainval.txt` 和 `val.txt`格式如下 > 只需檔名,不用附檔名 ``` 20230323-151958_frame552_0 ``` - 類別更改 修改`yolox\data\datasets\voc_classes.py`,改成自己類別 ```python= VOC_CLASSES = ( "car", "person", "truck", "motorbike", "bicycle", "bus", "spc" ) ``` <br> - 訓練中模型儲存 ``` # 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\yolox\exp\yolox_base.py ``` 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\aa.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\aa.py -d 1 -b 16 --fp16 -o -c YOLOX_outputs/yolox_voc_s/latest_ckpt.pth --resume --start_epoch=250 ``` - 使用tensorboard查看訓練狀況 ``` tensorboard --logdir=D:\YOLOX\YOLOX_outputs\yolox_s\tensorboard ``` 輸出 ``` TensorBoard 2.13.0 at http://localhost:6006/ (Press CTRL+C to quit) ``` 開啟瀏覽器`http://localhost:6006/` ## 驗證模型 > -f 訓練時的設定檔 > -c 訓練完的權重 ``` # 圖片 python tools/demo.py image -f D:\YOLOX\exps\example\yolox_voc\aa.py -c /path/to/your/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 -f D:\YOLOX\exps\example\yolox_voc\aa.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] ``` ## 問題 1. `AttributeError: module ‘torch._C‘ has no attribute ‘_cuda_setDevice` ``` pytorch 預設是安裝CPU版 -> 改裝GPU版 ``` 2. `ModuleNotFoundError: No module named 'yolox'` ``` # 在import yolox之前加入YOLOX專案路徑,看是哪個檔案報錯 import sys sys.path.append("D:\YOLOX") ``` 3. `Error building extension 'fast_cocoeval'` [來源](https://blog.csdn.net/qq_44732456/article/details/127654523) - 修改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) ``` 4. `AttributeError: module 'yolox.layers.fast_coco_eval_api' has no attribute 'InstanceAnnotation'` [來源](https://blog.csdn.net/qq_44732456/article/details/127654523) - 修改YOLOX\yolox\evaluators\coco_evaluator.py ``` #from yolox.layers import COCOeval_opt as COCOeval from pycocotools.cocoeval import COCOeval ``` L1_loss在Mosaic阶段是关闭的,关闭Mosaic才会开启