yolov5部署过程总结

Yolov5+Pytorch+Vscode+Python训练+C++部署全套流程

1、部署Yolov5训练环境

①安装anaconda

Anaconda官网https://www.anaconda.com/distribution下载安装包,然后双击安装

img img img

没有安装到C盘的必要,找个除C盘以外的位置即可,为了避免因为存在中文路径导致的报错,建议安装到全英文路径下。

img

这里可以先不用选Add sys path,只勾选Register。 推荐安装之后手动配置SysPath,避免配置导致后期使用上的问题

img

等待完成

img

最后两项都不需要选,点击Finish,完成安装

img
配置anaconda环境变量

首先,点击我的电脑,右键属性,打开系统设置。

image-20221201095657955

在打开的界面选择高级系统设置

image-20221201095758316

打开环境变量

image-20221201095917831

进入path,点击编辑

image-20221201100031769

将下图中所示的路径添加进去

img

之后可以简单通过cmd输入conda 命令检查下安装配置是否成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qBPmEZ8S-1672367501277)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\汇总笔记图片\anaconda安装成功图片.png)]

到了这一步,anaconda基本安装完成,接下来是配置相关环境

②配置anaconda环境

打开Prompt命令行方式使用conda cmd

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fNHatV9u-1672367501279)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\汇总笔记图片\anaconda14.png)]

通过以下命令行创建环境

  • conda create -n yolov5_bump python==3.8
    

    这里大概率会遇到Solving environment: failed的问题

    有说要换清华源的,有说要将https改成http的,我在安装的过程中都试过,换国内源反而安装不成功,如果又遇到同样问题的话可以考虑直接使用官方源创建环境。

    conda config --remove-key channels   换回conda默认源,在出现一些故障时可以使用
    conda config --show-sources   找到.condac文件并查看里面的镜像源
    

    这里把当时参考的一些博客也贴在下面

    (16条消息) 解决conda的“Solving environment: failed”问题_往西汪的博客-CSDN博客

    [(16条消息) conda创建环境过程中出现“Solving environment: failed”报错的解决办法_六子666的博客-CSDN博客_solving environment: failed]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ez6gPkbN-1672367501279)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\笔记图片\环境搭建成功.png)]

​ 创建完环境后,就可以使用以下命令激活刚刚配置好的环境,并且之所以在anaconda下配置环境就是因为anaconda可以将使用的环境与当前电脑环境分开,这样便可以在不同的环境下使用不同版本的python和其他版本的第三方库,有利于使用不同的环境去开发程序。

activate yolov5_bump

​ 输入以下命令,查看当前显卡驱动以及对应能够安装的最大版本的cuda和对应的cudnn

nvidia-smi

​ 也可以NVIDIA控制面板中找到对应的信息,我这边电脑能够支持的最大版本为11.6,不过之前用yolov3的时候用了cuda11.3,因此这里也就没有更新最新版本的cuda和对应的pytorch。如果你的电脑支持最新版的cuda和pytorch的话可以选择使用pytorch官网上根据选项卡提供的命令行去安装cuda和pytorch。如果和我一样的话可以取官网或者CSDN上找以前版本的安装命令。

conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch

​ 如果你能使用类似上面的命令行来安装cuda和pytorch的最好,如果你在尝试过还源,管理员权限之类的方法按了一天,按了好几遍也没有安装成功的话也可以放弃在线安装pytorch,选择使用离线安装的方法来安装相应软件。(离线安装的方法在后期训练的过程中可能会遇到一些Bug,不过比较容易解决。)

​ CSDN上有提供离线版本的pytorch和pytorchvision和torchaudio,根据电脑版本选择合适的版本即可(根据cuda版本,python版本以及电脑是Windows平台还是Linux平台选择对应的whl文件)

​ 在进入上一步配置好的虚拟系统中激活环境,然后进入到离线文件所在的路径。

如果离线文件不在C盘的话要先切换盘符,我放在了D盘,因此要想
d:	#切换盘符(#后面的内容为注释)
cd D:\3_desktop\Professional_software\anaconda3_pytorch #离线文件目录
dir	#查看当前文件夹下的文件(#后面的内容为注释)

#这里要先安装torch,再安装torchvision和torchaudio,注意安装顺序
pip install torch-1.2.0-cp37-cp37m-win_amd64.whl
pip install torchvision-0.4.0-cp37-cp37m-win_amd64.whl

参考博客:

(17条消息) anaconda离线安装pytorch_北四金城武的博客-CSDN博客_anaconda离线安装pytorch

​ 如果你是在线安装,那么基础环境已经搭建完成,如果是离线安装,那么还需要安装cuda和cudnn。

​ cuda和cudnn也可以通过离线和在线的安装方式安装(这里我是用在线方法安装的,离线CSDN上也有对应教程)

# 安装CUDA
conda install cudatoolkit=11.3 # 指定版本
# 安装cudnn,如果不指定版本,在安装CUDA之后,会自动匹配对应版本的cudnn安装
conda install cudnn

验证是否安装成功

#先进入python环境
>>python
#进入python环境
#然后是用导入torch库,调用里面的cuda检测函数来判断cuda是否安装成功
# Pytorch
import torch
print(torch.cuda.is_available())
#TensorFlow的话可以用下面的语句(虽然我没试过)
# Tensorflow
import tensorflow as tf
print(tf.test.is_gpu_available())

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WiTRFdBS-1672367501280)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\笔记图片\cuda配置成功.png)]

参考博客:

(17条消息) Anaconda虚拟环境中安装CUDA_HDD615的博客-CSDN博客_anaconda安装cuda

目前为止,yolov5所需要的基础环境已经搭建完成,剩下的便是需要配置yolov5所对应的第三方库。
③配置yolov5所需的第三方库

首先从github上下载yolov5的代码

下载地址如下:https://github.com/ultralytics/yolov5,我下载的是v5.0版本,注意5.0版本中的export.py函数导出C++模型的时候概率导出的模型无法正常使用,需要更换export.py。

然后下载yolov5对应的权重文件,用于测试以及后续的训练工作

下载地址如下:https://github.com/ultralytics/yolov5/releases,打开网页后下拉,找到Assets,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KKXCkLnb-1672367501280)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\汇总笔记图片\官方权重文件.png)]

然后使用vscode打开detect.py文件所在的文件夹(如果不想安装vscode的话也可以先进入到yolov5所在的文件夹,然后使用python detect.py运行程序)

这一步的目的是检测当前环境还缺少什么库,缺少啥使用pip或者conda安装对应的库(注意当后面安装完后发现import 某些库的时候报错,大概率是库的版本不对,或者当前库的版本和其他库会相互冲突,这时就需要将对应的库以及可能与其发生干扰的库进行卸载重装,应该就能解决问题)

如果感觉以上步骤太麻烦,也可以pip yolov5文件夹中的requirements.txt文件。

注意,在pip安装txt文件中的库之前,要先对文件中的语句进行部分修改。

这里修改了torch,torchvision(不修改的话会自动将上述内容中安装好的torch给卸载,然后安装CPU版本的torch,导致后面使用GPU的时候报错),以及pycocotools(这个东西有可能导致整个安装过程进行不下去,先注释掉,后面在手动安装,避免报错。)

# pip install -r requirements.txt

# base ----------------------------------------
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow
PyYAML>=5.3.1
scipy>=1.4.1
#torch>=1.7.0
#torchvision>=0.8.1
tqdm>=4.41.0

# logging -------------------------------------
tensorboard>=2.4.1
# wandb

# plotting ------------------------------------
seaborn>=0.11.0
pandas

# export ------这里是python导出模型时用到的库,有需求的话可以将#去掉,不过不去#也问题不大,后期手动安装也可以。
# coremltools>=4.1
# onnx>=1.8.1
# scikit-learn==0.19.2  # for coreml quantization

# extras --------------------------------------
thop  # FLOPS computation
#pycocotools>=2.0  # COCO mAP

修改完txt文件后,执行以下命令,便会自动安装需要的库并满足版本需求。

pip install -r requirements.txt

然后在手动安装pycocotools

#pip和conda两种方法二选一,pip速度更快,conda会安装一些配套库,会更稳定一点
#pip
pip install pycocotools
#conda
conda install pycocotools

以上安装完成后,运行detect.py文件,根据报错内容调整库版本,以及补充缺少的库。

注意:如果出现[ValueError: _getfullpathname: embedded null character in path]这种报错,大概率是库之间有冲突,我这里是在import seaborn的对应语句发生了error,后面卸载seaborn然后安装低一个版本的seaborn就能够解决问题。

如果程序能够正常运行且没有报错,则说明环境到此已经安装成功。

执行语句:

python detect.py --source data/images/bus.jpg --weights yolov5s.pt

如果能够跑成功,并且能够生成识别框(如下图)则说明安装成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cz9y2n3R-1672367501281)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\汇总笔记图片\检测效果图.png)]

并且,yolov5官方提供的detect.py程序也可以通过修改部分参数的方式进行摄像头检测。

具体操作可以参考一下博客:

yolov5调用usb摄像头及本地摄像头的方法实例 / 张生荣 (zhangshengrong.com)

检测效果如下图所示

image-20221201112230500

2、开始Yolov5训练

①训练集位置(这里一定要非常注意)

首先,文件路径不能有中文路径(存在中文路径大概会报gbk error)

其次,文件排列要有严格的顺序,下图中images和labels的文件下对应文件(文件名最好也不要更改,CSDN上有说因为images缺少s报错的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHeUwjWD-1672367501281)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\汇总笔记图片\训练集文件夹.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RpLiiKH-1672367501282)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\汇总笔记图片\图片位置.png)]

一定要按上面的顺序设置路径,如果不一样的话会出现No labels的问题。

然后如果出现

Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

的报错——这是因为离线安装torch时会出现两个libiomp5md.dll,要删除一个。通过文件搜索或者everything等搜索工具,搜索出来后删除一个即可{注意,是你创建的环境下存在两个dll文件,实际上你的电脑里不止两个,注意不要删错了。}

我这边的文件路径为:

D:\3_desktop\Professional_software\anaconda3\envs\yolov5_bump\Lib\site-packages\torch\lib

D:\3_desktop\Professional_software\anaconda3\envs\yolov5_bump\Library\bin
#我删除的为
D:\3_desktop\Professional_software\anaconda3\envs\yolov5_bump\Library\bin

还有另一种方法,不过我没试过。这里将参考博客贴在下面供参考

yolov5训练常见错误解决办法_pytorch_杭杭爸爸-DevPress官方社区 (csdn.net)

(17条消息) yolov5中OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized._EricWang789的博客-CSDN博客

②修改数据配置文件

打开data文件夹,将voc.yaml复制改成你要训练的名字然后修改以下内容

# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC/
# Train command: python train.py --data voc.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /VOC
#     /yolov5
#CSDN教程中第一次修改的yaml文件,用于提供路径信息

# download command/URL (optional)
#download: bash data/scripts/get_voc.sh——注释掉

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]——修改
train: D:\\3_desktop\\Professional_software\\anaconda3_pytorch\\train\\images\\train  # 370 images
val: D:\\3_desktop\\Professional_software\\anaconda3_pytorch\\train\\images\\val  # 370 images

# number of classes——修改
nc: 1

# class names
names: ['Bump']

打开models文件夹,将yolov5s.yaml复制改成你要训练的名字然后修改以下内容

# parameters
#模型配置文件,用于提供神经网络信息
nc: 1  # number of classes,修改的地方
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, C3, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

配置完数据集和数据格式文件后便可以开始模型的训练。

找到主目录下的train.py,找到主程序。,修改其中的

–weights:初始化的权重文件的路径地址
–cfg:模型yaml文件的路径地址
–data:数据yaml文件的路径地址

--weights:初始化的权重文件的路径地址
--cfg:模型yaml文件的路径地址
--data:数据yaml文件的路径地址
--epochs:训练轮次
--batch-size:喂入批次文件的多少
--img-size:输入图片尺寸
if __name__ == '__main__':
"""
    opt模型主要参数解析:
    --weights:初始化的权重文件的路径地址
    --cfg:模型yaml文件的路径地址
    --data:数据yaml文件的路径地址
    --hyp:超参数文件路径地址
    --epochs:训练轮次
    --batch-size:喂入批次文件的多少
    --img-size:输入图片尺寸
    --rect:是否采用矩形训练,默认False
    --resume:接着打断训练上次的结果接着训练
    --nosave:不保存模型,默认False
    --notest:不进行test,默认False
    --noautoanchor:不自动调整anchor,默认False
    --evolve:是否进行超参数进化,默认False
    --bucket:谷歌云盘bucket,一般不会用到
    --cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
    --image-weights:使用加权图像选择进行训练
    --device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
    --multi-scale:是否进行多尺度训练,默认False
    --single-cls:数据集是否只有一个类别,默认False
    --adam:是否使用adam优化器
    --sync-bn:是否使用跨卡同步BN,在DDP模式使用
    --local_rank:DDP参数,请勿修改
    --workers:最大工作核心数
    --project:训练模型的保存位置
    --name:模型保存的目录名称
    --exist-ok:模型目录是否存在,不存在就创建
"""
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/coco128.yaml', help='data.yaml path')
    parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=300)
    parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
    parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--notest', action='store_true', help='only test final epoch')
    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
    parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
    parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
    parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
    parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
    parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
    parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
    parser.add_argument('--project', default='runs/train', help='save to project/name')
    parser.add_argument('--entity', default=None, help='W&B entity')
    parser.add_argument('--name', default='exp', help='save to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--quad', action='store_true', help='quad dataloader')
    parser.add_argument('--linear-lr', action='store_true', help='linear LR')
    parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
    parser.add_argument('--upload_dataset', action='store_true', help='Upload dataset as W&B artifact table')
    parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval for W&B')
    parser.add_argument('--save_period', type=int, default=-1, help='Log model after every "save_period" epoch')
    parser.add_argument('--artifact_alias', type=str, default="latest", help='version of dataset artifact to be used')
    opt = parser.parse_args()

配置完就可以正式开始训练,使用vscode运行和,命令行python train.py是一样的效果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BiR5EK5-1672367501282)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\笔记图片\训练成功开始.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Te8ArPGB-1672367501283)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\笔记图片\训练完成.png)]

在训练过程中可能遇到:“OSError [WinError 1455]页面文件太小,无法完成操作”的错误内容,调大虚拟内存即可。

其他解决方式见下列参考博客:

(17条消息) 目标检测—教你利用yolov5训练自己的目标检测模型_SeeInDark的博客-CSDN博客_yolov5训练自己的模型

[(17条消息) 【深度学习】“OSError WinError 1455]页面文件太小,无法完成操作”解决方案_飘然的小泽的博客-CSDN博客_页面文件太小,无法完成操作

接下来,就能发现在runs\train\exp文件夹下发现可视化的训练图像和训练好道德权重。

3、Pytorch模型文件的移植

这里我采用的是将.pt模型转为torchscript文件的方法,其余转ONNX模型等方式由于我电脑的opencv是3.5版本,所以就没有考虑opencv+ONNX的移植方式。

要想正确使用torchscript文件关键点有两个,一个是C++环境的搭建,一个则是模型的转换。关于C++语句的编写,有大佬编写了一套配套的C++开发程序,直接使用即可,效果非常的好。

①C++环境的搭建

这里有很多相关的博客,这里就不在赘述了,以下是我搭建时参考的博客

Windows 下 C++ 中使用 YoloV5 - 知乎 (zhihu.com)

VS2019 配置 LibTorch 和 OpenCV - 知乎 (zhihu.com)

(17条消息) Visual Studio 2019 + LibTorch + CUDA11.6 环境配置_Xeon_CC的博客-CSDN博客_libtorch配置cuda

其中,如果你和我一样电脑不支持cuda11.6以上版本的话可以参考下列博客,下载历史版本的libtorch——注意高版本的pytorch和低版本的libtorch配套使用,反过来会报错

how could i get old version of libtorch , thanks · Issue #40961 · pytorch/pytorch (github.com)](https://github.com/pytorch/pytorch/issues/40961)

(17条消息) libtorch和pytorch版本对应___Ryan的博客-CSDN博客_查看libtorch版本

在配置cuda的时候如果报错的话可以考虑在链接器的命令行中添加下述代码

/INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z
/INCLUDE:?warp_size@cuda@at@@YAHXZ

参考博客:

(17条消息) Visual Studio 2019 + LibTorch + CUDA11.6 环境配置_Xeon_CC的博客-CSDN博客_libtorch配置cuda

②torchscript模型的导出

首先,yolov5(5.0版本的)export.py程序导出的模型在我的电脑上导出的时候会报错,无法执行totuple(),后来经过错误排查发现是官方程序的问题,建议使用下述程序进行模型的导出。

"""Exports a YOLOv5 *.pt model to ONNX and TorchScript formats

Usage:
    $ export PYTHONPATH="$PWD" && python models/export.py --weights ./weights/yolov5s.pt --img 640 --batch 1
"""

import argparse
import sys
import time

sys.path.append('./')  # to run '$ python *.py' files in subdirectories

import torch
import torch.nn as nn

import models
from models.experimental import attempt_load
from utils.activations import Hardswish, SiLU
from utils.general import set_logging, check_img_size

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='D:\\3_desktop\\Professional_software\\anaconda3_pytorch\\yolov5-5.0\\weights\\best_bump_221130.pt', help='weights path')  # from yolov5/models/
    parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='image size')  # height, width
    parser.add_argument('--dynamic', action='store_true', help='dynamic ONNX axes')
    parser.add_argument('--batch-size', type=int, default=1, help='batch size')
    opt = parser.parse_args()
    opt.img_size *= 2 if len(opt.img_size) == 1 else 1  # expand
    print(opt)
    set_logging()
    t = time.time()

    # Load PyTorch model
    # gpu
    model = attempt_load(opt.weights, map_location=torch.device('cuda'))  # load FP32 model
    labels = model.names

    # Checks
    gs = int(max(model.stride))  # grid size (max stride)
    opt.img_size = [check_img_size(x, gs) for x in opt.img_size]  # verify img_size are gs-multiples

    # Input
    # gpu
    img = torch.zeros(opt.batch_size, 3, *opt.img_size).to(device='cuda')  # image size(1,3,320,192) iDetection
    model.eval()
    # Update model
    for k, m in model.named_modules():
        m._non_persistent_buffers_set = set()  # pytorch 1.6.0 compatibility
        if isinstance(m, models.common.Conv):  # assign export-friendly activations
            if isinstance(m.act, nn.Hardswish):
                m.act = Hardswish()
            elif isinstance(m.act, nn.SiLU):
                m.act = SiLU()
        # elif isinstance(m, models.yolo.Detect):
        #     m.forward = m.forward_export  # assign forward (optional)
    model.model[-1].export = False  # set Detect() layer export=True
    y = model(img)  # dry run

    # TorchScript export
    try:
        print('\nStarting TorchScript export with torch %s...' % torch.__version__)
        f = opt.weights.replace('.pt', '.GPU_torchscript.pt')  # filename
        ts = torch.jit.trace(model, img)
        ts.save(f)
        print('TorchScript export success, saved as %s' % f)
    except Exception as e:
        print('TorchScript export failure: %s' % e)

    print('\nExport complete (%.2fs). Visualize with https://github.com/lutzroeder/netron.' % (time.time() - t))

程序参考博客:

(17条消息) YOLOv5 Windows环境下的C++部署(GPU)_qq_43349822的博客-CSDN博客_c++部署yolov5

ncdhz/YoloV5-LibTorch: 一个 C++ 版本的 YoloV5 封装库 (github.com)

上面这个网站就是一个大佬针对转换后的模型开发的调用程序,只需要在自己的项目中新建main.cpp, YoloV5.cpp和YoloV5.h,分别将YoloV5-LibTorch工程中的test文件夹中的test.cpp, src文件夹中的YoloV5.cpp和include文件夹中的YoloV5.h的代码复制到对应的main.cpp,YoloV5.cpp和YoloV5.h中。Main.cpp中设置的pt文件和coco.txt文件分别修改为上步转化的torchscript.pt和自己训练的类别。

参考博客:

(17条消息) Win10 c++调用yolov5的pytorch模型_water_93的博客-CSDN博客_c++调用yolov5

之后便可以在C++中使用yolov5训练好的权重,效果如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wtJM8RjQ-1672367501283)(D:\3_file\HFUT研究生课题记录\yolov5+pytorch的部署记录(Windows平台)\汇总笔记图片\检测效果图片.png)]

至此,yolov5的环境部署到模型训练和C++移植开发过程便全部结束了。

hz/YoloV5-LibTorch: 一个 C++ 版本的 YoloV5 封装库 (github.com)](https://github.com/ncdhz/YoloV5-LibTorch)

上面这个网站就是一个大佬针对转换后的模型开发的调用程序,只需要在自己的项目中新建main.cpp, YoloV5.cpp和YoloV5.h,分别将YoloV5-LibTorch工程中的test文件夹中的test.cpp, src文件夹中的YoloV5.cpp和include文件夹中的YoloV5.h的代码复制到对应的main.cpp,YoloV5.cpp和YoloV5.h中。Main.cpp中设置的pt文件和coco.txt文件分别修改为上步转化的torchscript.pt和自己训练的类别。

参考博客:

(17条消息) Win10 c++调用yolov5的pytorch模型_water_93的博客-CSDN博客_c++调用yolov5

之后便可以在C++中使用yolov5训练好的权重,效果如下图所示:

[外链图片转存中…(img-wtJM8RjQ-1672367501283)]

至此,yolov5的环境部署到模型训练和C++移植开发过程便全部结束了。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值