直接使用
请打开基于YOLOX模型图像检测示例,并点击右上角 “ 在DSW中打开” 。
EasyCV图像检测-YOLOX
本文将以YOLOX模型为例,介绍如何基于easyCV进行目标检测模型训练和预测。
YOLO系列的开发主要包括V1(2015),V2(2016),V3(2018),V4 (2020)以及V5(2020)等一系列版本。YOLO 是由Joseph Redmon 和 Ross Girshick 在 2015 年的 You Only Look Once: Unified, Real-Time Object Detection (Link) 中提出的单阶段目标检测网络。YOLO系列以其响应速度快、精度高、结构简单、部署方便等特点受到工程研究人员的青睐。同时,YOLO系列由于需要人工设定样本正负,导致模型存在泛化能力差的问题。针对此类问题,旷视科技研究院BaseDetection团队结合学术界的先进成果和工程实践提出了YOLOX.
YOLOX在YOLO系列地基础上汲取近些年学术界目标检测地最新功效并承继YOLO系列简单部署的特性.除此之外,YOLOX设计了Decoupled Head、Data Aug、Anchor Free和SimOTA部件。其代码目前支持各个平台(MegEngine、TensorRT、ONNX、OpenVino 和 ncnn)的部署。
在EasyCV中,我们提供了在COCO2017数据集上多种规格的预训练模型(Link)可用于下游任务的fintune。
本文将介绍如何在pai-dsw基于EasyCV快速使用YOLOX进行图像检测模型的训练、推理。
运行环境要求
PAI-Pytorch 1.8镜像, GPU机型 P100 or V100, 内存 32G
安装依赖包
1、获取torch和cuda版本,并根据版本号修改mmcv安装命令,安装对应版本的mmcv和nvidia-dali
import torch import os os.environ['CUDA']='cu' + torch.version.cuda.replace('.', '') os.environ['Torch']='torch'+torch.version.__version__.replace('+PAI', '') !echo $CUDA !echo $Torch
# install some python deps ! pip install --upgrade tqdm ! pip install mmcv-full==1.4.4 -f https://download.openmmlab.com/mmcv/dist/$CUDA/$Torch/index.html ! pip install http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/third_party/nvidia_dali_cuda100-0.25.0-1535750-py3-none-manylinux2014_x86_64.whl
2、安装EasyCV算法包 注:在PAI-DSW docker中预安装了pai-easycv库,可跳过该步骤
!pip install pai-easycv # !pip install http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyCV/pkgs/whl/2022_6/pai_easycv-0.3.0-py3-none-any.whl
3、简单验证
from easycv.apis import *
图像检测模型训练&预测
下面示例介绍如何利用cifar10数据,使用ResNet50模型快速进行图像分类模型的训练评估、模型预测过程(需要修改)
数据准备
可以下载COCO2017数据,也可以使用我们提供了示例COCO数据
! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/data/small_coco_demo/small_coco_demo.tar.gz && tar -zxf small_coco_demo.tar.gz
重命名数据文件,使其和COCO数据格式完全一致
!mkdir -p data/ && mv small_coco_demo data/coco
data/coco格式如下
data/coco/ ├── annotations │ ├── instances_train2017.json │ └── instances_val2017.json ├── train2017 │ ├── 000000005802.jpg │ ├── 000000060623.jpg │ ├── 000000086408.jpg │ ├── 000000118113.jpg │ ├── 000000184613.jpg │ ├── 000000193271.jpg │ ├── 000000222564.jpg │ ... │ └── 000000574769.jpg └── val2017 ├── 000000006818.jpg ├── 000000017627.jpg ├── 000000037777.jpg ├── 000000087038.jpg ├── 000000174482.jpg ├── 000000181666.jpg ├── 000000184791.jpg ├── 000000252219.jpg ... └── 000000522713.jpg
训练模型
下载示例配置文件, 进行YOLOX-S模型训练
! rm -rf yolox_s_8xb16_300e_coco.py ! wget https://raw.githubusercontent.com/alibaba/EasyCV/master/configs/detection/yolox/yolox_s_8xb16_300e_coco.py
为了适配小数据,我们对配置文件yolox_s_8xb16_300e_coco.py做如下字段的修改,减少训练epoch数目,加大打印日志的频率
total_epochs = 3 #optimizer.lr -> 0.0002 optimizer = dict( type='SGD', lr=0.0002, momentum=0.9, weight_decay=5e-4, nesterov=True) # log_config.interval 1 log_config = dict(interval=1)
注意: 如果是使用COCO完整数据训练,为了保证效果,建议使用单机8卡进行训练; 如果要使用单卡训练,建议降低学习率optimizer.lr
为了保证模型效果,我们在预训练模型基础上finetune, 执行如下命令启动训练
!python -m easycv.tools.train yolox_s_8xb16_300e_coco.py --work_dir work_dir/detection/yolox/yolox_s_8xb16_300e_coco --load_from http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyCV/modelzoo/detection/yolox/yolox_s_bs16_lr002/epoch_300.pth
导出模型
导出YOLOX 模型用于预测, 执行如下命令查看训练产生的模型文件
# 查看训练产生的pt文件 ! ls work_dir/detection/yolox/yolox_s_8xb16_300e_coco/*.pth
在导出模型前,需要对配置文件进行修改,指定nms的得分阈值
model.test_conf 0.01 -> 0.5
model = dict( type='YOLOX', num_classes=80, model_type='s', # s m l x tiny nano test_conf=0.5, nms_thre=0.65)
执行如下命令进行模型导出
!cp yolox_s_8xb16_300e_coco.py yolox_s_8xb16_300e_coco_export.py && sed -i 's#test_conf=0.01#test_conf=0.5#g' yolox_s_8xb16_300e_coco_export.py !python -m easycv.tools.export yolox_s_8xb16_300e_coco_export.py work_dir/detection/yolox/yolox_s_8xb16_300e_coco/epoch_3.pth work_dir/detection/yolox/yolox_s_8xb16_300e_coco/yolox_export.pth
预测
下载测试图片
!wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/data/small_coco_demo/val2017/000000017627.jpg
导入模型权重,并预测测试图片的检测结果
import cv2 from easycv.predictors import TorchYoloXPredictor output_ckpt = 'work_dir/detection/yolox/yolox_s_8xb16_300e_coco/yolox_export.pth' detector = TorchYoloXPredictor(output_ckpt) img = cv2.imread('000000017627.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) output = detector.predict([img]) print(output)
# view detection results %matplotlib inline from matplotlib import pyplot as plt image = img.copy() for box, cls_name in zip(output[0]['detection_boxes'], output[0]['detection_class_names']): # box is [x1,y1,x2,y2] box = [int(b) for b in box] image = cv2.rectangle(image, tuple(box[:2]), tuple(box[2:4]), (0,255,0), 2) cv2.putText(image, cls_name, (box[0], box[1]-5), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,255), 2) plt.imshow(image) plt.show()