
來源>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
```

這裡我已經有先安裝(更新),所以在這邊顯示already satisfied
## 查看當前環境
```python=
pip3 list
```

pip當前版本為23.1.2
## Step 1:安裝virtualenv
```python=
pip3 install virtualenv
```

這裡我已經有先安裝(更新),所以在這邊顯示也already satisfied
## Step 2:到目標資料夾
```c=
d: //切換D曹
cd D:\YOLOX_TEST //移動到YOLOX_TEST資料夾(需先創好)
```
## Step 3:建立虛擬環境
```python=
virtualenv env02
```

建好之後會有一個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資料夾內。

* 資料集結構如下圖

* 下載[預訓練模型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

* 確認參數
```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個類別。

* 開始訓練
```=
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格式如下
> 只需檔名,不用附檔名

* 類別更改
修改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資料夾路徑
```

開啟瀏覽器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")
```

## 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 會遇到的路徑問題
* 解法

多加了282行,annopath 需要另外串起來
## Q7 : tensorboard 只顯示val

*解法
資料集太小,會導致預設程式跑不到下面
```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)