YOLOX训练、测试、部署(python,C++)与改进

Yolox模型架构


模型结构由backbonex、neck、head组成

backbone:CSPDarknet53

neck:PAFPN

head:Decoupled Head、Anchor Free、SimOTA

1. Yolox 环境搭建


根目录yolox

1.1 创建并激活环境


使用的环境为conda的yolox, python 3.8

激活环境

conda activate yolox

1.2 安装代码库的文件


  • 切换到根目录下,终端上

pip install -r requirements.txt
python3 setup.py develop

1.3 下载安装apex


apex github地址

git@github.com:NVIDIA/apex.git
  • 切换到apex目录下,安装

python3 setup.py install

1.4 下载pycocotools


pip3 install cython
pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'

2. 创建自己的数据集


VOC数据集

目录

VOCdevkit # 放在./datasets下

___VOC2007

_____Annotations(存放所有图片对应的xml标签)

_____ImageSets (划分训练集、验证集、测试集的txt文件)

_____JPEGImages (存放所有图片,格式为png/jpg)

训练集和测试集生成的代码如下

# coding = utf-8
# -*- coding:utf-8 -*-
import os
import random

xml_file_path = '/home/zw100/Deep Learning/yolox/datasets/VOCdevkit/VOC2007/Annotations'
txt_save_path = '/home/zw100/Deep Learning/yolox/datasets/VOCdevkit/VOC2007/ImageSets/Main'
def generate_trainval_test(xml_file_path, txt_save_path):
    test_percent = 0.1
    xml_files = os.listdir(xml_file_path)
    num_of_xml_files = len(xml_files)

    test_num = int(num_of_xml_files * test_percent)

    list = range(num_of_xml_files)

    test = random.sample(list, test_num)

    f_test = open(txt_save_path+'/test.txt', 'w')
    f_train = open(txt_save_path+'/trainval.txt', 'w')

    for i in list:
        name = xml_files[i][:-4] + '\n' # q去掉.xml,即[:-4]
        if i in test:
            f_test.write(name)
        else:
            f_train.write(name)

    f_train.close()
    f_test.close()

if __name__ == '__main__':
    generate_trainval_test(xml_file_path, txt_save_path)

3. 修改代码


3.1 exps目录


  1. ./exps/example/yolox_voc/yolox_voc_s.py

  • self.num_classes --->你自己的目标检测的类别数,本文为检测猫狗,所以self.num_classes = 2.

3.2 yolox目录


  1. yolox/data/datasets/voc_classes.py

  • VOC_CLASSES--->改成自己要检测的目标,本文为猫狗检测,所以

VOC_CLASSES={"cat", "dog"}

  1. voc.py

  • self._imgpath根据自己的图片是png还是jpg格式更改,本文是png,所以改为

self._imgpath = os.path.join("%s", "JPEGImages", "s%.png")

4. 训练


需要在yolox的官网下载yolox_s.pth预训练权重文件,Yolox github官网

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0-b 4--fp16  -c yolox_s.pth

-c后面接yolox_s.pth的路径,本文直接放在根目录下

5. 测试


  • 直接测试图片集,即test_txt对应的图片

利用tools下的eval.py进行测试

修改eval.py,将-c对应的pth改成训练集训练出来的best_ckpt.pth路径,如

如:

python tools/eval.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0 -b 4 --fp16  -c YOLOX_outputs/yolox_voc_s/best_ckpt.pth
  • 测试单个图片

利用tools下的demo.py进行测试

python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_s.py -c YOLOX_outputs/yolox_voc_s/best_ckpt.pth --path assets/class01.jpg --conf 0.25--nms 0.45--tsize 640--save_result --device [cpu/gpu]

6. 部署


yolox是先通过tools/trt.py脚本把ONNX模型解析然后序列化到model_trt.engin文件中,最后再通过c++代码从该文件中加载模型去进行推理

  • 可以通过python解析onnx

  • 也可以通过c++解析onnx

6.1 python版tensorRT推理


  • 运行tools/trt.py,会在实验结果output(如YOLOX_outputs/yolox_s_add_kaiyang-736-1312-125-new3)下生成model_trt.engin

  • 并且复制model_trt.engine到demo/cpp(c++)下

python tools/trt.py -f /path/to/your/yolox/exps/yolox_s.py -c your_ckpt.pth #example
python tools/trt.py -f exps/example/yolox_voc/yolox_voc_s_service_area_add_kaiyang.py -c YOLOX_outputs/yolox_s_addkaiyang-736-1312-125-new3/best_ckpt.pth
  • 然后运行demo推理图片

python tools/demo.py image -f exps/default/yolox_s.py --trt --save_result# example
python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_s_service_area_add_kaiyang.py --path datasets/VOCdevkit/VOC2007/TestImage --trt --save_result

infer_time = 0.003左右

6.2 c++版tensorRT推理


  • 切换到demo/TensorRT/cpp目录下

  • 编写CMakeLists.txt,包括cuda路径,TensorRT路径

  • 新建bulid,并cmake

cd build
cmake ..
make

若在此过程编译失败例如找不到CUDA,卸载重装cuda其他不变动(cuda)

  • 运行demo

./yolox ../model_trt.engine -i ../../../../assets/dog.jpg
./yolox ../model_trt.engine -i ../../../../datasets/VOCdevkit/VOC2007/TestImage
./yolox ../model_trt.engine -i ../../../../datasets/VOCdevkit/VOC2007/JPEGImages/1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++部署一个Python项目,有几种方法可以实现。 1. 使用Python C API:Python提供了一个C API,允许你在C++代码中嵌入和执行Python代码。你可以使用这个API来加载和运行Python脚本,调用Python函数等。这种方法需要你熟悉C++Python的交互,需要手动编写一些C++代码来实现PythonC++的通信。 2. 使用Boost.Python:Boost.Python是一个C++库,它提供了一个简单的接口来将C++代码与Python代码集成。你可以使用Boost.Python来编写C++代码,将Python函数封装为C++函数,并在C++中调用它们。这个库可以简化PythonC++之间的交互,但仍然需要一些C++Python的知识。 3. 使用Cython:Cython是一个将Python代码转换为C或C++代码的工具。你可以使用Cython将你的Python项目编译成一个C++扩展模块,然后在C++中链接和调用它。这种方法可以提高性能,并且对于已有的Python项目来说比较方便,因为你不需要修改太多的代码。 4. 使用SWIG:SWIG是一个用于将C、C++等语言与脚本语言(如Python)进行集成的工具。你可以使用SWIG来生成C++代码,使其能够在C++中调用Python函数和对象。这个方法需要一些额外的配置和代码生成步骤,但可以实现较好的交互性。 根据你的具体需求和项目特点,选择适合的方法进行C++Python的集成和部署。每种方法都有不同的优缺点,需要根据实际情况来进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值