yolov5 は、rknn モデルと 3588 プラットフォームのデプロイメントをトレーニングおよび生成します

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 で取得されました。データの機密性の問題のため、ここでは別のデータ セットを使用して結果を表示しました。

ここに画像の説明を挿入

他のビデオとカメラの推論は、公式のデモの実装を自分で変更できます

おすすめ

転載: blog.csdn.net/m0_51714298/article/details/125916417