github下载地址:https://github.com/Megvii-BaseDetection/YOLOX 安装apex:
参考 linux:
为了性能和完整的功能,建议通过CUDA和c++扩展来安装Apex
$ git clone https://github.com/NVIDIA/apex
$ cd apex
$ pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
Apex 同样支持 Python-only build (required with Pytorch 0.4) via
$ pip install -v --no-cache-dir ./
Windows:
Windows支持是实验性的,建议使用Linux。
如果你能在你的系统上从源代码构建Pytorch,采用pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" .
pip install -v --no-cache-dir .(没有CUDA/ c++扩展)更可能有效。
如果您已经在Conda环境中安装了Pytorch,请确保在相同的环境中安装Apex。
服务器下跑yolox(比较简单)
1、准备数据集:
2.修改配置文件:
文件地址YOLOX-main\yolox\exp\yolox_base.py
3、修改exp/example/yolox_voc/yolox_voc_s.py文件
修改yolox/data/dataloading中
修改yolox/data/datasets/voc_classes.py
加入数据集
数据集格式如下:
需要放在datasets目录下哦
train
训练yolox_s的命令行:
python train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 32 --fp16 -o -c weights/yolox_s.pth
如果我想训练yolox_l、yolox_m…怎么办?
方法1
可以在exps文件下的yolox_voc文件下新建文件…例如想训练yolox_l,新建文件yolox_voc_l.py,复制yolox_voc_s的内容,修改如下:
只修改这里就好了。
训练命令:
python train.py -f exps/example/yolox_voc/yolox_voc_l.py -d 1 -b 32 --fp16 -o -c weights/yolox_l.pth
方法2
yolox/exp/build.py中写好了name
python train.py -n yolox-nano -d 1 -b 32
Windows下跑yolox
首先介绍下我的pytorch版本为1.7.0,因此该版本相较于刚出的yolox一定会有很多问题,那么总结下问题:
1.silu问题,pytorch1.7是没有silu的,因此全部换成relu,一般yolox/models/network_block.py有、yolox_head.py有、yolo_pafpn.py…记不清了,哪里报错就去哪里就可。开始想添加silu的代码的,但是发现要修改的地方好多,就放弃了哈哈哈。
2.报错
RuntimeError: Providing a bool or integral fill value without setting the optional `dtype` or `out` arguments is currently unsupported. In PyTorch 1.7, when `dtype` a
nd `out` are not set a bool fill value will return a tensor of torch.bool dtype, and an integral fill value will return a tensor of torch.long dtype.
RuntimeError:当前不支持在未设置可选’dtype’或’out’参数的情况下提供布尔值或整数填充值。
在yolo_head.py文件中,修改如下:
后面想加入Transformer的时候遇到了错误:
Input image size (6464) doesn’t match model (448448).
也就是训练时输入成了64,但是我的exp中yolox_base已经修改好了,后面调试代码发现:utils/model_utils.py中,这里的输入为64,改掉这里即可。
检测框中文显示
但是,我们目前的检测物体中,中文的受众面更广,直接采用该代码会出现乱码现象:
为此调整代码:
找到YOLOX-main\yolox\utils\visualize.py
修改第40行代码
def vis(img, boxes, scores, cls_ids, conf=0.5, class_names=None):
for i in range(len(boxes)):
box = boxes[i]
cls_id = int(cls_ids[i])
score = scores[i]
if score < conf:
continue
x0 = int(box[0])
y0 = int(box[1])
x1 = int(box[2])
y1 = int(box[3])
color = (_COLORS[cls_id] * 255).astype(np.uint8).tolist()
text = '{}:{:.1f}%'.format(class_names[cls_id], score * 100)
txt_color = (0, 0, 0) if np.mean(_COLORS[cls_id]) > 0.5 else (255, 255, 255)
font = cv2.FONT_HERSHEY_SIMPLEX
txt_size = cv2.getTextSize(text, font, 0.4, 1)[0]
cv2.rectangle(img, (x0, y0), (x1, y1), color, 2)
txt_bk_color = (_COLORS[cls_id] * 255 * 0.7).astype(np.uint8).tolist()
cv2.rectangle(
img,
(x0, y0 + 1),
(x0 + txt_size[0] + 1, y0 + int(1.5*txt_size[1])),
txt_bk_color,
-1
)
#打印汉字
img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# font=plt.rcParams['font.sans-serif'] = ['SimHei']
font = ImageFont.truetype('STFANGSO.TTF', 10, encoding="utf-8")
draw = ImageDraw.Draw(img_pil)
draw.text((x0, y0), text, txt_color, font=font)
img = cv2.cvtColor(np.asarray(img_pil), cv2.COLOR_RGB2BGR)
# cv2.putText(img, text, (x0, y0 + txt_size[1]), font, 0.4, txt_color, thickness=1)
return img
输入:
python 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 [gpu]
补充:
后续yolox的部署和测试可以看下面这个:
yolox的部署和测试 以及yolox系列的模型可视化:
yolox的模型可视化包括nano