1. サーバー環境の構成
1.1GPU ドライバーのインストール
GPU ドライバーをダウンロードする
https://www.nvidia.cn/geforce/drivers/
対応するグラフィックス カードのモデルとオペレーティング システムを選択し、[検索] をクリックします。
最新のダウンロードとインストールを選択するだけです(すべてのオプションのデフォルト設定が最適です)
ターミナルにコマンドを入力して、インストールが正しいかどうかを確認します
nvidia-smi
次の情報は、インストールが正しいことを示すために表示されます。赤いボックスは、サポートできる cuda の最新バージョンです。
1.2 CUDA のインストール
CUDA ツールキットをダウンロード
https://developer.nvidia.com/cuda-toolkit-archive
サポートされている最高バージョンまたは下位バージョンを選択してください
システムを選択し、ダウンロードをクリックします
すべての設定はデフォルトです。次のステップに進んでください
インストール中にエラーが発生する場合があります.c++ に問題がある場合は、Visual Studio をインストールできます.2022 コミュニティ エディションをインストールしました
https://visualstudio.microsoft.com/zh-hans/vs/
インストールオプションは次のとおりです。
インストールが完了したら、CUDA を再インストールします。
1.3 CUDNN のインストール
cudnnをダウンロード
https://developer.nvidia.com/rdp/cudnn-download
ダウンロードする対応するパッケージを選択します
ダウンロードが完了したら解凍します
パスの下の対応するディレクトリに配置します
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7
1.4 CUDA の検証
端末入力
nvcc -V
次の図は、インストールが正しく行われていることを示しており、赤いボックス内のバージョンは
1.4 アナコンダのインストール
アナコンダをダウンロード
https://www.anaconda.com/
Windows を例に、対応するシステムの Anaconda をダウンロードします。
インストール パスはカスタマイズ可能で、その他はデフォルトのままで問題ありませんが、環境変数の設定の手間を避けるために、次の点に注意してください
端末入力
conda activate base
ベース環境に入ると、インストールが正しいことを示す次の指示が表示されます
1.5 Anaconda を使用して yolov5 動作環境を作成する
1.5.1 pytorch-GPU のインストール
ターミナルで次のコマンドを入力して、yolov5 環境、python バージョン 3.8 を作成します (yolov5 には python バージョン > 3.7 が必要です。ここでは 3.8 をお勧めします)。
conda create -n yolov5 python=3.8
すべて入力して yes インストールに成功. 環境に入るコマンドは次のとおりです, 残りのcondaコマンドは自分で検索できます.
conda activate yolov5
その他の conda コマンドは Baidu で検索できます
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())
Running と表示され、インストールが正しいことを示します
True
True
1.5.2 yolov5 の実行に必要なパッケージをインストールする
yolov5 の rknn 対応バージョンを入手する
git clone https://github.com/airockchip/yolov5.git
Ancaondaのyolov5環境でyolov5プロジェクトのルートディレクトリに入り、pipでパッケージをインストール、-iでTsinghuaソースを高速利用
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
バージョンの非互換性の問題がある場合は、パッケージのバージョンを自分で変更できます (最小要件が満たされている場合)。
2. Yolov5 プロジェクトの修正
2.1 エラーを解決するために models/yolo.py を変更します。
それの約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)
エラーの問題を解決する
2.2 utils/datasets.py を変更します。
これは、独自の 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共通データセットの目的を達成
2.3 新しい data.yaml:
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']
2.4 新しい cfg.yaml
data ディレクトリに rknn.yaml を作成、内容は以下の通り(このファイルがモデル構造設定ファイル)
このプロジェクト バージョンの構造は古いモジュールを使用しているため、バックボーンとヘッド: yolov5 バージョン 6.0 の構造に変更してパフォーマンスを向上させました. バージョン 6.0 の出力は rknn と互換性がないため、このプロジェクトの検出レイヤーを使用して、この問題を解決します。もちろん、元のプロジェクトの構成ファイルを使用できます
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)
]
2.5 SPPF モジュールの追加
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))
2.6 モデル構築における SPPF モジュールの追加
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]:
2.7 エラーテンソルは numpy に変換できません
このエラーは、numpy バージョンが高すぎるために発生します。
最初に上位バージョンの numpy をアンインストールできます
pip uninstall numpy
次に、問題を解決するためにnumpy1.18.5をインストールします
pip install numpy==1.18.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.8 事前トレーニング済みの重みを使用しない
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')
2.9 ページファイルが小さすぎると操作が完了しない
OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\anaconda3\envs\Yolo\lib\site-packages\torch\lib\shm.dll" or one of its dependencies.
ドライブ文字に対応する仮想メモリを変更します。操作は次のとおりです。サイズは状況によって異なります。
コンピューターを再起動して、トレーニングを再開します
3.yolov5 モデルのトレーニング
Anaconda の yolov5 で yolov5 ルート ディレクトリに入ると、次のようにターミナルが実行され、モデル構成ファイルとデータセット ファイルを選択してトレーニングを開始します
python --cfg models/rknn.yaml --data/my.yaml
トレーニングが完了すると、runs フォルダーにトレーニング結果が表示されます. Weights は各ステージのモデルを保存し、results.png はトレーニング結果の表示です.
4.pt形式→onnx形式
Anaconda の yolov5 で、yolov5 のルート ディレクトリに入ると、ターミナルは次のように実行されます。
python models/export.py --weight xx.pt# 此处为需要转换模型的相对路径 当然也可以是绝对路径 如runs/train/exp/weight/best.pt
モジュールが存在しない場合は、requirements.txt に従ってインストールしてください。
5.onnx形式→rknn形式
5.1 仮想マシン環境のインストール
rknn-toolkit2 は現在 Linux のみをサポートしているため、仮想マシンを使用する必要があります (rknn-toolkit は 3588 をサポートしていません)。
ここでは仮想マシン ソフトウェアとして VMware を使用し、システムは Ubuntu 18.04 です. 20.04 バージョンは vm-toolkit をインストールした後にファイルをドラッグできないため、18.04 を使用することをお勧めします. 仮想マシンのインストールは繰り返されません.
5.1.1 アナコンダのインストール
公式ドキュメントには docker イメージが含まれており、直接プルして使用することができます. ここでは従来の方法を使用します.
Ubuntu 18.04 には python3.6 が付属しているため、競合を回避して操作を簡素化するために、引き続き Anaconda を使用して rknn 環境を作成します。
https://www.anaconda.com/
対応するオペレーティング システムをダウンロードし、ダウンロード後にメイン ディレクトリに配置して実行し、[はい] を押して完了します。
sudo sh ./Anaconda3-2022.05-Linux-x86_64.sh
注: 最後に、環境変数に追加するかどうかを尋ね、yes と答えます。
ターミナルを再度開くと、インストールが成功したことがわかります
5.1.2Anaconda は rknn 環境を作成し、rknn-toolkit2 をインストールします
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
正しく実行されていることは、インストールが正しいことを示します
5.2 モデル変換
公式デモを入手する
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
6.3588 プラットフォームの展開
3588 のメイン ディレクトリで公式デモを入手してください
git clone https://github.com/rockchip-linux/rknpu2.git
yolov5 ディレクトリに入る
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo
インクルード ファイルのヘッダー ファイル postprocess.h を変更します。
#define OBJ_CLASS_NUM 2 #这里的数字修改为数据集的类的个数
モデルディレクトリにある coco_80_labels_list.txt ファイルを修正し、独自のクラスに変更して保存します
red_jeep
missile_vehicle
変換したrknnファイルをmodel/RK3588ディレクトリに置きます
コンパイル、シェルの実行
bash ./build-linux_RK3588.sh
成功後にインストール ディレクトリを生成する
cd install/rknn_yolov5_demo_linux
推論が必要な写真をモデル ディレクトリに配置します。
走る
./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/test.jpg
結果は rknn_yolov5_demo_linux で取得されました。データの機密性の問題のため、ここでは別のデータ セットを使用して結果を表示しました。
他のビデオとカメラの推論は、公式のデモの実装を自分で変更できます