---
# System prepended metadata

title: YOLOX安裝及實作
tags: [YOLOX, YOLO, Windows]

---

# 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才会开启