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