下载GPU驱动
https://www.nvidia.cn/geforce/drivers/
选择对应的显卡型号以及操作系统,点击搜索

选择最新的下载安装即可(所有选项默认设置最好)

终端输入命令查看是否安装正确
nvidia-smi
出现以下信息表明安装正确,其中红框为可以支持的cuda最高版本

下载CUDA Toolkit
https://developer.nvidia.com/cuda-toolkit-archive
选择最高支持的版本或者更低版本

选择系统等后点击下载

一切设置都默认即可,直接下一步
安装过程中可能出现失败,如出现关于c++的问题,可以通过安装Visual Studio,我安装的是2022社区版
https://visualstudio.microsoft.com/zh-hans/vs/
安装选择如下


安装完成后重新安装CUDA
下载cudnn
https://developer.nvidia.com/rdp/cudnn-download
选择对应的包下载

下载完成后解压

放入该路径下对应的目录
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7
终端输入
nvcc -V
显示如下图表明安装正确,红色框内为其版本

下载Anaconda
https://www.anaconda.com/
下载对应系统的Anaconda,以windows为例
安装路径可自定义,其他默认即可,需要注意的是,需要勾选如下,可以免除配置环境变量的麻烦

终端输入
conda activate base
进入base环境,出现如下说明安装正确

终端输入如下命令,创建yolov5环境,python版本3.8(yolov5要求python版本>3.7,这里建议使用3.8)
conda create -n yolov5 python=3.8
一路回车以及yes即可安装成功,进入该环境命令如下,其余conda命令可自行搜索
conda activate yolov5
其余conda命令可自行百度搜索
打开pytorch官网
https://www.pytorch.org
选择对应操作系统以及CUDA版本的pytorch(这里的CUDA版本不能高于上面查看到的CUDA版本)

复制Run this Command中的命令(建议使用下面的命令,以解决版本问题)进入Anaconda的yolov5环境,输入该命令,随后等待安装完成即可,若安装失败,可自行换源解决
conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch
conda添加清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
# 设置搜索时显示通道地址
conda config --set show_channel_urls yes
安装完成后,在yolov5环境下输入
python
进入python中输入
import torch
print(torch.cuda.is_available())
print(torch.backends.cudnn.is_available())
运行显示为则表明安装正确
True
True
获取yolov5的rknn友好版本
git clone https://github.com/airockchip/yolov5.git
在Ancaonda的yolov5环境下进入yolov5项目的根目录,pip安装包,-i 使用清华源更快
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
等待安装完成即可
其包含的包如下,确保安装完成base(训练运行需要的包),logging(日志),export(模型导出与格式转换)中包含的包:
# pip install -r requirements.txt
# base ----------------------------------------
Cython
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
pillow
PyYAML>=5.3
scipy>=1.4.1
tensorboard>=2.2
torch>=1.6.0
torchvision>=0.7.0
tqdm>=4.41.0
# logging -------------------------------------
# wandb
# coco ----------------------------------------
# pycocotools>=2.0
# export --------------------------------------
# coremltools==4.0
# onnx>=1.8.0
# scikit-learn==0.19.2 # for coreml quantization
# extras --------------------------------------
# thop # FLOPS computation
# seaborn # plotting
若出现版本不兼容问题,可以自行修改包的版本(满足最低要求的情况下)
其中的153行左右:
def _initialize_biases(self, cf=None): # initialize biases into Detect(), cf is class frequency
# https://arxiv.org/abs/1708.02002 section 3.3
# cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.
m = self.model[-1] # Detect() module
for mi, s in zip(m.m, m.stride): # from
b = mi.bias.view(m.na, -1) # conv.bias(255) to (3,85)
b[:, 4] += math.log(8 / (640 / s) ** 2) # obj (8 objects per 640 image)
b[:, 5:] += math.log(0.6 / (m.nc - 0.99)) if cf is None else torch.log(cf / cf.sum()) # cls
mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)
修改为:
def _initialize_biases(self, cf=None): # initialize biases into Detect(), cf is class frequency
# https://arxiv.org/abs/1708.02002 section 3.3
# cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.
m = self.model[-1] # Detect() module
for mi, s in zip(m.m, m.stride): # from
b = mi.bias.view(m.na, -1) # conv.bias(255) to (3,85)
with torch.no_grad():
b[:, 4] += math.log(8 / (640 / s) ** 2) # obj (8 objects per 640 image)
b[:, 5:] += math.log(0.6 / (m.nc - 0.99)) if cf is None else torch.log(cf / cf.sum()) # cls
mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)
解决报错问题
这里是为了兼容自己的yolov4数据集,可以不做修改
其中的342行左右:
def img2label_paths(img_paths):
# Define label paths as a function of image paths
sa, sb = os.sep + 'images' + os.sep, os.sep + 'labels' + os.sep # /images/, /labels/ substrings
return [x.replace(sa, sb, 1).replace(os.path.splitext(x)[-1], '.txt') for x in img_paths]
修改为:
def img2label_paths(img_paths):
# Define label paths as a function of image paths
sa, sb = os.sep + 'JPEGImages' + os.sep, os.sep + 'labels' + os.sep # /images/, /labels/ substrings
return [x.replace(sa, sb, 1).replace(os.path.splitext(x)[-1], '.txt') for x in img_paths]
为了兼容yolov4使用的数据集,达到v4与v5公用数据集的目的
在data目录下创建my,yaml,内容如下(该文件为数据集的信息),可自行设置自己的数据。
# 训练,验证,测试集路径,其中xxx表示数据盘中的某个数据集
train: /media/ubuntu/data/datasets/xxx/2007_train.txt
val: /media/ubuntu/data/datasets/xxx/2007_train.txt
test: /media/ubuntu/data/datasets/xxx/2007_train.txt
# 类的个数
nc: 2
# 类名
names: ['red_jeep', 'missile_vehicle']
在data目录下创建rknn.yaml,内容如下(该文件为模型结构配置文件)
由于该项目版本的结构使用的是较为旧的模块,我们修改为了yolov5 6.0版本的backbone,head:结构以提高性能,其中由于6.0版本的输出与rknn不兼容,使用该项目的detect层解决这个问题。当然可以使用原项目的配置文件
nc: 2 # 类的个数
depth_multiple: 0.33 # 深度倍率
width_multiple: 0.50 # 通道倍率
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 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 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, 6, 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, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 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)
]
打开models文件下的common.py文件,添加SPPF类,该文件下的激活函数已经修改为Relu,故不再做这个操作
class SPPF(nn.Module):
# Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
def __init__(self, c1, c2, k=5): # equivalent to SPP(k=(5, 9, 13))
super().__init__()
c_ = c1 // 2 # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_ * 4, c2, 1, 1)
self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)
def forward(self, x):
x = self.cv1(x)
with warnings.catch_warnings():
warnings.simplefilter('ignore') # suppress torch 1.9.0 max_pool2d() warning
y1 = self.m(x)
y2 = self.m(y1)
return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))
修改models/yolo.py中的def parse_model函数219行
if m in [Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3]:
修改为
if m in [Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3, SPPF]:
这个错误是由于numpy版本过高导致
可以先卸载高版本numpy
pip uninstall numpy
再安装numpy1.18.5即可解决问题
pip install numpy==1.18.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
修改train.py,去除使用预训练模型
parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
更改为:
parser.add_argument('--weights', type=str, default='', help='initial weights path')
OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\anaconda3\envs\Yolo\lib\site-packages\torch\lib\shm.dll" or one of its dependencies.
修改对应盘符的虚拟内存,操作如下,大小可以看情况而定:

重启电脑,重新开始训练即可
在Anaconda的yolov5,进入yolov5根目录,终端运行如下,选择模型配置文件和数据集文件即可开始训练
python --cfg models/rknn.yaml --data/my.yaml
训练完成后在runs文件夹下可以查看训练结果,weights保存了各阶段的模型,results.png为训练结果展示


在Anaconda的yolov5,进入yolov5根目录,终端运行如下
python models/export.py --weight xx.pt# 此处为需要转换模型的相对路径 当然也可以是绝对路径 如runs/train/exp/weight/best.pt
若出现模块不存在的情况,只需要按照requirements.txt安装即可
由于rknn-toolkit2目前只支持linux,故而需要使用到虚拟机(rknn-toolkit不支持3588)
这里的虚拟机软件我使用的是VMware,系统为Ubuntu18.04,由于20.04版本存在vm-toolkit安装后无法拖动文件的情况,所以建议使用18.04,虚拟机的安装不再赘述
官方文件中含有docker镜像,可以直接拉取使用,我们这里使用传统方式
由于Ubuntu18.04自带python3.6,为了避免冲突,简化操作,这里继续使用Anaconda创建rknn环境
https://www.anaconda.com/
下载对应操作系统,下载好后放在主目录下,运行,一路回车yes即可完成
sudo sh ./Anaconda3-2022.05-Linux-x86_64.sh
注意:最后询问是否添加到环境变量,回复yes
重新打开终端就可以看到,说明安装成功

rknn-toolkit2有python3.6 python3.8两个版本的包,我们这里选择python3.8
conda create -n rknn puthon=3.8
获取rknn-toolkit2安装包并进入改项目根目录
git clone https://github.com/rockchip-linux/rknn-toolkit2.git
cd rknn-toolkits-1.3.0
在Anaconda的rknn环境下安装rknn-toolkit2的依赖包
pip3 install -r requirements_cp38-1.3.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
安装rknn-toolkit2,若存咋版本不匹配问题,可以卸载包后重新安装其他版本
pip3 install package/rknn_toolkit2-1.3.0_11912b58-cp38-cp38-linux_x86_64.whl
测试安装是否成功
cd /examples/onnx/yolov5
python3 test.py
运行正确表明安装正确
获取官方demo
git clone https://github.com/rockchip-linux/rknpu2.git
进入yolov5模型转换目录
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5
在onnx目录下放入以及转换好的onnx模型
打开onnx2rknn.py,修改如下:
1.目标平台名
platform = 'rk3588'
2.需要转化的onnx模型
MODEL_PATH = './onnx_models/best.onnx'
随后在rknn环境下运行,会生成新的rknn目录以及其目录下的rknn模型,随后对其修改名字即可,也可在py文件中修改,不是重点
python3 onnx2rknn.py
在3588的主目录上获取官方demo
git clone https://github.com/rockchip-linux/rknpu2.git
进入yolov5目录
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo
修改include文件中的头文件postprocess.h
#define OBJ_CLASS_NUM 2 #这里的数字修改为数据集的类的个数
修改model目录下的coco_80_labels_list.txt文件,改为自己的类并保存
red_jeep
missile_vehicle
将转换后的rknn文件放在model/RK3588目录下
编译,运行shell
bash ./build-linux_RK3588.sh
成功后生成install目录
cd install/rknn_yolov5_demo_linux
在model目录下放入需要推理的图片
运行
./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/test.jpg
在rknn_yolov5_demo_linux获取到结果,因为数据涉密问题这里我用了另一个数据集做结果展示

其他视频以及摄像头推理可以自行修改官方demo实现
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport: