1. 研究の背景と意義
人工知能技術の継続的な発展に伴い、高速道路の交通管理においてインテリジェント検査システムが果たす役割はますます重要になっています。高速道路の点検は、道路交通の安全と円滑を確保するために重要な役割を果たしていますが、従来の点検方法は主に人手による点検であり、非効率的であり、漏れが発生しやすいものでした。コンピュータビジョンに基づいたインテリジェントな検査システムは、検査の自動化と効率化を実現し、高速道路の交通管理レベルを大幅に向上させます。
現在、深層学習に基づくターゲット検出アルゴリズムは、コンピュータビジョンの分野で目覚ましい成果を上げています。中でもYOLO(You Only Look Once)アルゴリズムは、高速かつ正確な特性により注目を集めています。ただし、従来の YOLO アルゴリズムには、高速道路の検査タスクを処理する場合にいくつかの問題があります。まず、YOLO アルゴリズムは小さなターゲットに対する検出効果が低く、検出を見逃しやすいです。第 2 に、YOLO アルゴリズムはターゲットの位置を正確に測ることができず、誤検出が発生しやすいです。これらの問題は、高速道路インテリジェント検査システムの精度と信頼性に重大な影響を与えます。
上記の問題を解決するために、研究者らは、YOLOv5 を改善するための CBAM (畳み込みブロック アテンション モジュール) 空間アテンション メカニズムに基づく高速道路インテリジェント検査システムを提案しました。 CBAM 空間アテンション メカニズムは、特徴マップのチャネルと空間アテンションを重み付けすることでターゲット検出アルゴリズムのパフォーマンスを向上できる効果的な特徴拡張方法です。 CBAM 空間注意メカニズムを YOLOv5 アルゴリズムに適用すると、小さなターゲットの検出能力とターゲットの位置決めの精度が効果的に向上します。
この研究の重要性は主に次の側面に反映されています。
-
高速道路インテリジェント検査システムの精度の向上: CBAM 空間注意メカニズムを導入し、高速道路検査タスクにおける YOLOv5 アルゴリズムのパフォーマンスを向上させることにより、システムの小さなターゲットの検出能力とターゲットの位置決めの精度を向上させることができます。これにより、検出漏れや誤検出が大幅に減少し、検査システムの精度と信頼性が向上します。
-
高速道路の交通管理の効率を向上させる: 従来の手作業による検査方法は、多くの人的資源と時間の投資を必要とし、非効率的であり、漏れが発生しやすいものです。 CBAM 空間注意メカニズムに基づいて改良された YOLOv5 アルゴリズムは、自動化された効率的な検査を実現し、高速道路の交通管理の効率を大幅に向上させます。これにより人的資源の無駄が削減され、高速道路の交通管理レベルが向上します。
-
高速道路交通分野でのディープラーニングの応用を促進する: ディープラーニング技術はコンピュータービジョンの分野で大きな進歩を遂げましたが、高速道路交通分野での応用は比較的少数です。この研究では、CBAM 空間注意メカニズムと YOLOv5 アルゴリズムを組み合わせて、インテリジェントな高速道路検査システムの開発のための新しいアイデアと方法を提供します。これにより、高速道路交通分野におけるディープラーニング技術の適用が促進され、交通管理のインテリジェント化と情報化が促進されます。
要約すると、CBAM 空間注意メカニズムに基づいて YOLOv5 高速道路インテリジェント検査システムを改善することには、重要な研究上の意義と実用化の価値があります。検査システムの精度と効率を向上させ、高速道路交通分野でのディープラーニング技術の適用を促進することで、高速道路交通管理に大きな改善と発展をもたらすでしょう。
2. 映像デモンストレーション
3. ビデオデモンストレーション
CBAM空間注意メカニズムに基づいて改良されたYOLOv5高速道路インテリジェント検査システム
4. データセットの収集、ラベル付け、整理
写真集
まず、必要な画像を収集する必要があります。これは、既存のデータセットの使用など、さまざまな方法で実現できます。
ラベル付けには labelImg を使用します
labelImg は、VOC および YOLO 形式をサポートするグラフィカル画像注釈ツールです。以下は、labelImg を使用して VOC 形式の画像にラベルを付ける手順です。
(1) labelImg をダウンロードしてインストールします。
(2) labelImg を開き、「Open Dir」を選択して画像ディレクトリを選択します。
(3) 対象オブジェクトのラベル名を設定します。
(4) 画像上に長方形の枠を描き、対応するラベルを選択します。
(5) アノテーション情報を保存すると、画像ディレクトリに画像と同じ名前の XML ファイルが生成されます。
(6) すべての画像にラベルが付けられるまで、このプロセスを繰り返します。
YOLO形式に変換
YOLO は txt 形式のアノテーションを使用するため、VOC 形式を YOLO 形式に変換する必要があります。これは、さまざまな変換ツールまたはスクリプトを使用して実現できます。
ここでは、Python スクリプトを使用して XML ファイルを読み取り、それを YOLO で必要な txt 形式に変換する簡単な方法を示します。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
classes = [] # 初始化为空列表
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
def convert(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0
y = (box[2] + box[3]) / 2.0
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def convert_annotation(image_id):
in_file = open('./label_xml\%s.xml' % (image_id), encoding='UTF-8')
out_file = open('./label_txt\%s.txt' % (image_id), 'w') # 生成txt格式文件
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
cls = obj.find('name').text
if cls not in classes:
classes.append(cls) # 如果类别不存在,添加到classes列表中
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
bb = convert((w, h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
xml_path = os.path.join(CURRENT_DIR, './label_xml/')
# xml list
img_xmls = os.listdir(xml_path)
for img_xml in img_xmls:
label_name = img_xml.split('.')[0]
print(label_name)
convert_annotation(label_name)
print("Classes:") # 打印最终的classes列表
print(classes) # 打印最终的classes列表
データフォルダー構造を整理する
データセットを次の構造に編成する必要があります。
-----data
|-----train
| |-----images
| |-----labels
|
|-----valid
| |-----images
| |-----labels
|
|-----test
|-----images
|-----labels
次のことを確認してください。
すべてのトレーニング イメージは data/train/images ディレクトリにあり、対応するラベル ファイルは data/train/labels ディレクトリにあります。
すべての検証イメージは data/valid/images ディレクトリにあり、対応するラベル ファイルは data/valid/labels ディレクトリにあります。
すべてのテスト イメージは data/test/images ディレクトリにあり、対応するラベル ファイルは data/test/labels ディレクトリにあります。
このような構造により、データ管理、モデルのトレーニング、検証、テストが非常に便利になります。
5. コアコードの説明
5.1 common.py
class CBAMBottleneck(nn.Module):
# Standard bottleneck
def __init__(self, c1, c2, shortcut=True, g=1, e=0.5,ratio=16,kernel_size=7): # ch_in, ch_out, shortcut, groups, expansion
super(CBAMBottleneck,self).__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_, c2, 3, 1, g=g)
self.add = shortcut and c1 == c2
self.channel_attention = ChannelAttention(c2, ratio)
self.spatial_attention = SpatialAttention(kernel_size)
def forward(self, x):
x1 = self.cv2(self.cv1(x))
out = self.channel_attention(x1) * x1
out = self.spatial_attention(out) * out
return x + out if self.add else out
class C3CBAM(C3):
# C3 module with CBAMBottleneck()
def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
super().__init__(c1, c2, n, shortcut, g, e)
c_ = int(c2 * e) # hidden channels
self.m = nn.Sequential(*(CBAMBottleneck(c_, c_, shortcut) for _ in range(n)))
class ChannelAttention(nn.Module):
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
self.relu = nn.ReLU()
self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.f2(self.relu(self.f1(self.avg_pool(x))))
max_out = self.f2(self.relu(self.f1(self.max_pool(x))))
out = self.sigmoid(avg_out + max_out)
return out
class SpatialAttention(nn.Module):
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
padding = 3 if kernel_size == 7 else 1
self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
x = torch.cat([avg_out, max_out], dim=1)
x = self.conv(x)
return self.sigmoid(x)
class CBAM(nn.Module):
# CSP Bottleneck with 3 convolutions
def __init__(self, c1, c2, ratio=16, kernel_size=7): # ch_in, ch_out, number, shortcut, groups, expansion
super(CBAM, self).__init__()
self.channel_attention = ChannelAttention(c1, ratio)
self.spatial_attention = SpatialAttention(kernel_size)
def forward(self, x):
out = self.channel_attention(x) * x
out = self.spatial_attention(out) * out
return out
common.py は共通モジュールのプログラム ファイルです。このファイルには、YOLOv5 のトレーニングと推論プロセスをサポートするために一般的に使用されるモジュールと関数がいくつか含まれています。
この文書の主な内容は次のとおりです。
- ロギング、数学、警告、numpy、パンダ、リクエスト、トーチ、PIL など、いくつかの必要なモジュールとライブラリがインポートされます。
- Conv、CBAMBottleneck、C3CBAM、ChannelAttend、SpatialAttend、CBAM、autopad、DetectMultiBackend など、一般的に使用される関数とクラスを定義します。
- これらの関数とクラスは、主に、畳み込み、アテンション メカニズムなど、モデルの構築と推論プロセスの一部の操作に使用されます。
一般に、common.py ファイルは YOLOv5 プロジェクトの共通モジュールであり、モデルの構築と推論プロセスをサポートするために一般的に使用されるいくつかの関数とクラスを提供します。
5.2 モデル.py
import torch
import torch.nn as nn
import torch.nn.functional as F
class ComplexSpatialAttentionModule(nn.Module):
def __init__(self, channel):
super(ComplexSpatialAttentionModule, self).__init__()
self.query_conv = nn.Conv2d(channel, channel // 8, 1)
self.key_conv = nn.Conv2d(channel, channel // 8, 1)
self.value_conv = nn.Conv2d(channel, channel, 1)
self.softmax = nn.Softmax(dim=-1)
self.out_conv = nn.Conv2d(channel, channel, 1)
def forward(self, x):
B, C, H, W = x.size()
query = self.query_conv(x)
key = self.key_conv(x)
value = self.value_conv(x)
query = query.view(B, -1, H * W).permute(0, 2, 1)
key = key.view(B, -1, H * W)
attention = self.softmax(torch.bmm(query, key))
value = value.view(B, -1, H * W)
out = torch.bmm(value, attention.permute(0, 2, 1))
out = out.view(B, C, H, W)
out = self.out_conv(out) + x
return out
これは、model.py という名前のプログラム ファイルで、nn.Module から継承するモジュールである ComplexSpatialAttendanceModule という名前のクラスを定義します。
このモジュールは、入力特徴マップを処理するための複雑な空間注意メカニズムを実装するために使用されます。初期化関数では、クエリ、キー、値を生成し、アテンションの重みを計算するために、いくつかの畳み込み層とソフトマックス層が定義されています。出力チャネルの数を調整するために、出力畳み込み層も定義されます。
順伝播関数では、最初に入力特徴マップの次元が抽出され、次に畳み込みネットワークを使用してクエリ、キー、および値が生成されます。次に、行列の乗算を容易にするためにクエリとキーの形状を変更し、クエリとキーのドット積を計算してから、ソフトマックス関数を適用してアテンションの重みを取得します。次に、Value の形状を変更して行列の乗算を実行し、アテンション ウェイトを使用して合計に重み付けを行います。最後に、出力の形状を元の特徴マップ サイズに戻し、出力畳み込み層を使用してチャネル数を調整し、元の入力特徴マップ (残留接続) を追加します。最後に、処理された特徴マップが返されます。
このモジュールは画像処理などのタスクに使用でき、空間注意メカニズムを導入することで、画像内の重要な特徴を抽出し、その表現能力を向上させることができます。
5.3 ui.py
class YOLOv5Detector:
def __init__(self, weights_path, data_path):
self.weights_path = Path(weights_path)
self.data_path = Path(data_path)
self.model = None
self.stride = None
self.pt = None
def load_model(self, device='', half=False, dnn=False):
device = select_device(device)
model = DetectMultiBackend(self.weights_path, device=device, dnn=dnn, data=self.data_path)
stride, names, pt, jit, onnx, engine = model.stride, model.names, model.pt, model.jit, model.onnx, model.engine
half &= (pt or jit or onnx or engine) and device.type != 'cpu' # FP16 supported on limited backends with CUDA
if pt or jit:
model.model.half() if half else model.model.float()
self.model = model
self.stride = stride
self.pt = pt
def detect(self, img, imgsz=(640, 640), conf_thres=0.05, iou_thres=0.1, max_det=1000, device='', classes=None, agnostic_nms=False, augment=False, half=False):
cal_detect = []
device = select_device(device)
names = self.model.module.names if hasattr(self.model, 'module') else self.model.names
im = letterbox(img, imgsz, self.stride, self.pt)[0]
im = im.transpose((2, 0, 1))[::-1]
im = np.ascontiguousarray(im)
im = torch.from_numpy(im).to(device)
im = im.half() if half else im.float()
im /= 255
if len(im.shape) == 3:
im = im[None]
pred = self.model(im, augment=augment)
pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
for i, det in enumerate(pred):
if len(det):
det[:, :4] = scale_coords(im.shape[2:], det[:, :4], img.shape).round()
for *xyxy, conf, cls in reversed(det):
c = int(cls)
label = f'{
names[c]}'
lbl = names[int(cls)]
if lbl in ['person','car','bus','truck',"D00", "D10", "D20", "D40",'prohibited','Speed limit 5','Speed limit 15','Speed limit 20','Speed limit 60']:
cal_detect.append([label, xyxy,float(conf)])
return cal_detect
このプログラムファイルは、YOLOv5に基づいたターゲット検出プログラムです。 PyQt5 を使用して、画像をロードしてオブジェクト検出を実行できるグラフィカル ユーザー インターフェイスを作成します。プログラム ファイルには、モデルのロード、ターゲット検出アルゴリズムの実行、検出結果の処理などのための他の多くのモジュールと関数が含まれています。具体的には、プログラム ファイル内の主な機能は次のとおりです。
- argparse、platform、shutil、time、numpy、cv2、torch などの必要なライブラリとモジュールをインポートします。
- ファイル パス、デバイス タイプなど、いくつかのグローバル変数と定数が定義されています。
- いくつかの補助関数は、モデルのロード、ターゲット検出アルゴリズムの実行などのために定義されています。
- main 関数 run は、ターゲット検出アルゴリズムを実行するために定義されます。
- 入力画像に対してターゲット検出を実行し、検出結果を画像上に描画するための補助関数 det_yolov5 が定義されています。
- 画像をロードし、オブジェクト検出のために det_yolov5 関数を呼び出すためのグラフィカル ユーザー インターフェイスを作成しました。
一般に、このプログラム ファイルは、画像をロードしてターゲット検出を実行し、画像上に検出結果を描画できる、YOLOv5 に基づくターゲット検出アプリケーションを実装します。
5.4 モデル\experimental.py
class CrossConv(nn.Module):
# Cross Convolution Downsample
def __init__(self, c1, c2, k=3, s=1, g=1, e=1.0, shortcut=False):
# ch_in, ch_out, kernel, stride, groups, expansion, shortcut
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, (1, k), (1, s))
self.cv2 = Conv(c_, c2, (k, 1), (s, 1), g=g)
self.add = shortcut and c1 == c2
def forward(self, x):
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
class Sum(nn.Module):
# Weighted sum of 2 or more layers https://arxiv.org/abs/1911.09070
def __init__(self, n, weight=False): # n: number of inputs
super().__init__()
self.weight = weight # apply weights boolean
self.iter = range(n - 1) # iter object
if weight:
self.w = nn.Parameter(-torch.arange(1., n) / 2, requires_grad=True) # layer weights
def forward(self, x):
y = x[0] # no weight
if self.weight:
w = torch.sigmoid(self.w) * 2
for i in self.iter:
y = y + x[i + 1] * w[i]
else:
for i in self.iter:
y = y + x[i + 1]
return y
class MixConv2d(nn.Module):
# Mixed Depth-wise Conv https://arxiv.org/abs/1907.09595
def __init__(self, c1, c2, k=(1, 3), s=1, equal_ch=True):
super().__init__()
groups = len(k)
if equal_ch: # equal c_ per group
i = torch.linspace(0, groups - 1E-6, c2).floor() # c2 indices
c_ = [(i == g).sum() for g in range(groups)] # intermediate channels
else: # equal weight.numel() per group
b = [c2] + [0] * groups
a = np.eye(groups + 1, groups, k=-1)
a -= np.roll(a, 1, axis=1)
a *= np.array(k) ** 2
a[0] = 1
c_ = np.linalg.lstsq(a, b, rcond=None)[0].round() # solve for equal weight indices, ax = b
self.m = nn.ModuleList([nn.Conv2d(c1, int(c_[g]), k[g], s, k[g] // 2, bias=False) for g in range(groups)])
self.bn = nn.BatchNorm2d(c2)
self.act = nn.LeakyReLU(0.1, inplace=True)
def forward(self, x):
return x + self.act(self.bn(torch.cat([m(x) for m in self.m], 1)))
class Ensemble(nn.ModuleList):
# Ensemble of models
def __init__(self):
super().__init__()
def forward(self, x, augment=False, profile=False, visualize=False):
y = []
for module in self:
y.append(module(x, augment, profile, visualize)[0])
# y = torch.stack(y).max(0)[0] # max ensemble
# y = torch.stack(y).mean(0) # mean ensemble
y = torch.cat(y, 1) # nms ensemble
return y, None # inference, train output
このプログラム ファイルは YOLOv5 の実験モジュールであり、主にいくつかの実験的なネットワーク層とモデルが含まれています。
ファイルには次のクラスが定義されています。
- CrossConv: クロスコンボリューション ダウンサンプリング レイヤー。入力特徴マップのダウンサンプリングに使用されます。
- 合計: 複数のレイヤーの加重合計。複数のレイヤーの特徴マップを重み付けして融合するために使用されます。
- MixConv2d: さまざまなスケールでの畳み込み演算のための混合深度畳み込み層。
- アンサンブル: 複数のモデルを統合するために使用されるモデル コレクション。
さらに、このファイルはモデルの重みをロードするための補助関数 try_load も定義します。
ファイル全体は YOLOv5 の実験モジュールであり、いくつかの新しいネットワーク層とモデルを実装して YOLOv5 のパフォーマンスと効果を向上させるために使用されます。
6. システムの全体構成
全体的な機能とアーキテクチャの概要:
このプロジェクトは、CBAM 空間注意メカニズムに基づいて改良された YOLOv5 ハイウェイ インテリジェント検査システムです。これには、ターゲット検出タスクのトレーニング、推論、インターフェイス表示などの機能を実装するために使用される複数のプログラム ファイルが含まれています。主なプログラム ファイルには、モデル定義、データ処理、インターフェイスの表示と検証などが含まれます。
次の表は、各ファイルの機能をまとめたものです。
ファイルパス | 機能概要 |
---|---|
共通.py | YOLOv5 のトレーニングと推論プロセスをサポートするために、一般的に使用されるいくつかのモジュールと関数が含まれています。 |
モデル.py | ComplexSpatialtentionModule クラスは、複雑な空間アテンション メカニズムを実装し、入力特徴マップを処理するために定義されます。 |
ui.py | 画像をロードし、ターゲット検出のためにターゲット検出関数を呼び出すためのグラフィカル ユーザー インターフェイスを作成しました。 |
val.py | カスタム データ セットでトレーニングされた YOLOv5 モデルの精度を検証し、モデルの精度と mAP インジケーターを計算するために使用されます。 |
モデル\common.py | YOLOv5 モデルの構築および推論プロセスにおける一部の操作で一般的に使用されるモジュールと関数を定義します。 |
モデル\実験.py | YOLOv5 のパフォーマンスと効果を強化するためのいくつかの実験的なネットワーク層とモデルが含まれています。 |
モデル\tf.py | モデルの各コンポーネントの定義と補助関数を含む、YOLOv5 モデルの TensorFlow バージョンを実装します。 |
モデル\yolo.py | YOLOv5 モデルの各レイヤーと検出レイヤーは定義され、完全な YOLOv5 モデルを構築するために使用されます。 |
モデル_初期化_.py | モデルモジュールを初期化するために使用されます。 |
utils\activations.py | Mish、Swish など、いくつかの活性化関数が定義されています。 |
utils\augmentations.py | ランダム クロッピング、ランダム フリッピングなど、いくつかのデータ拡張機能が定義されています。 |
utils\autoanchor.py | 自動アンカー ボックス ジェネレーターは、データセットに適したアンカー ボックスを生成するように定義されています。 |
utils\callbacks.py | 一部のコールバック関数は、モデルの保存、ログの記録など、トレーニング プロセス中に一部の操作を実行するように定義されています。 |
utils\datasets.py | トレーニング データと検証データをロードして処理するためのデータセット クラスを定義します。 |
utils\downloads.py | データとモデルをダウンロードするためのいくつかの関数を定義します。 |
utils\general.py | IoU の計算、構成ファイルの解析など、いくつかの一般的な関数が定義されています。 |
utils\loss.py | YOLOv5 の損失関数など、いくつかの損失関数が定義されています。 |
utils\metrics.py | 精度の計算、mAP の計算など、いくつかの評価指標が定義されています。 |
utils\plots.py | トレーニングおよび検証中に結果を視覚化するために、いくつかのプロット関数が定義されています。 |
utils\torch_utils.py | モデルの読み込み、モデルの保存など、PyTorch に関連するいくつかの補助関数を定義します。 |
utils_init_.py | utils モジュールを初期化するために使用されます。 |
utils\aws\resume.py | AWS S3からトレーニングを再開する関数を定義します。 |
utils\aws_init_.py | utils.aws モジュールを初期化するために使用されます。 |
utils\flask_rest_api\example_request.py | サンプルリクエストを送信するための関数を定義します。 |
utils\flask_rest_api\restapi.py | Flask ベースの REST API は、モデルのデプロイと呼び出しのために定義されています。 |
utils\loggers_init_.py | utils.loggers モジュールを初期化するために使用されます。 |
utils\loggers\wandb\log_dataset.py | データセット情報を記録するための関数を定義します。 |
utils\loggers\wandb\スイープ.py | ハイパーパラメータの検索結果をログに記録する関数を定義します。 |
utils\loggers\wandb\wandb_utils.py | WandB ロギングに関連するいくつかの補助関数を定義します。 |
utils\loggers\wandb_init_.py | utils.loggers.wandb モジュールを初期化するために使用されます。 |
上記は各ファイルの機能の概要であり、CBAM 空間注意メカニズムに基づいて改良された YOLOv5 高速道路インテリジェント検査システムのさまざまなコンポーネントと機能を構成します。
7. CBAMモジュールによって改善されたYOLOv5sの車両、歩行者、亀裂、交通標識の検出モデル
CBAM モジュールの「プラグ アンド プレイ」構造により、モジュールの使用に非常に便利です。挿入場所に明確な規定はありません。原則として、CBAM モジュールはネットワーク内のどこにでも挿入できます。一般的なアプリケーション例では、アテンション モジュールは特徴融合操作と組み合わされることがよくありますが、ネットワーク内のどの位置に挿入するとより良い結果が得られるかをさらに判断するには実験が必要です。ネットワーク内のすべての機能融合操作が CBAM モジュールと融合されると、ネットワークの計算量が大幅に増加し、おそらくネットワークが過剰適合される可能性があり、それによりネットワーク モデルのパフォーマンスがむしろ低下し、目的に反します。したがって、CBAM モジュールはネットワーク内の主要な場所に埋め込む必要があります。以下に、CBAM モジュール挿入位置の実験計画設計について詳しく紹介します。
YOLOv5s は、図に示すように、入力端子、バックボーン ネットワーク Backbone、Neck ネットワーク、Head 出力端子の 4 つの部分で構成されます。このうち、入力側では、ネットワークに入力された画像に対してモザイクデータの強調や適応スケーリングなどの前処理を実行し、データセットを強化し、モデルのデータセットに対する学習能力を向上させ、一般化を改善することを目的としています。ネットワークモデルの能力。入力画像は加工後の静止画像データであり、画像の特徴を抽出するためのコンボリューションやプーリングなどの演算は行われないため、入力側にアテンションモジュールを導入する必要がない。
バックボーン ネットワークの 4 つのコンポーネントの構造を研究した結果、特徴融合操作は 4 つの構造すべてに存在しますが、特徴融合を実現するには C3 構造が主な役割を果たしていることがわかりました。残りの 3 つの部分は主に特徴抽出と特徴の融合です。したがって、ネットワーク内で重要な役割を果たす C3 構造が選択され、CBAM モジュールと統合されます。 C3 構造の残差ブランチにはボトルネック構造が含まれており、最初に畳み込み残差演算が実行されて深い特徴が抽出され、次に加算演算が特徴融合のために実行されます。ボトルネック構造の追加操作の前に CBAM モジュールが挿入される場合、残差操作のボトルネック層構造は、CBAM モジュールのチャネル アテンション モジュールの構造と似ています。2 つの類似した構造は直列に接続されており、効果は限定的です、効果が低下する可能性もあり、CBAM モジュールの役割にも影響します。追加操作で特徴融合が実行された後、特徴マップ レイヤーの数が削減されるため、ネットワーク パラメーターが削減され、計算量が削減されます。 CBAM モジュールが追加操作の後に組み込まれる場合、ネットワークは各レベルの特徴に基づいてスペースとチャネルの重要性を学習でき、このようにして 2 つの部分がそれぞれの役割を実行し、ネットワークの検出パフォーマンスを効果的に向上させることができます。 。したがって、CBAM モジュールを C3 構造のボトルネック構造に埋め込むことを選択した後、融合後に C3_CBAM モジュールが得られ、その構造図が図に示されています。次に、バックボーン ネットワークの C3 構造を C3_CBAM モジュールに置き換えて、YOLOv5s_B ネットワーク モデルを取得します。
トレーニングと亀裂認識のためにさまざまなサイズの画像を比較すると、次の結論が導き出されます。
(1) トレーニング セットで使用される画像のサイズが異なり、トレーニングされた画像のサイズが異なります。ネットワーク モデルは、同じサイズの画像データ セットを使用してトレーニングされたネットワーク モデルも異なるため、2 つのモデル間で同じ画像の抽出結果に大きな違いが生じます。
( 2) 同じネットワークモデルであっても、画像を予測した場合、元の画像と分割された画像の予測結果も異なります。一般に、入力画像のサイズに近いサイズの画像の抽出効果は大きくなります。ネットワーク モデルが最適です。
(3) この実験では、データ セットがどのように変化しても、テスト画像のサイズが変化しても、最も理想的で安定した予測効果は 600×600 サイズです。画像。したがって、この記事では、その後の実験トレーニングと予測に 600×600 サイズの画像を使用することにしました。
8.CBAM空間注意メカニズム
近年、ディープラーニング研究の人気に伴い、アテンション メカニズムは画像認識、音声認識、自然言語処理などの分野でも広く使用されており、アテンション メカニズムはディープラーニングのタスクにおいて決定的な役割を果たしています。 。 効果。注意のメカニズムは人間の視覚システムから借用されたもので、たとえば、人間の目は写真を見るとき、写真内の重要な情報に焦点を合わせ、その他の目に見える情報を無視する傾向があります。ディープラーニングにおける注意メカニズムは人間の視覚の注意メカニズムと似ており、グローバルデータをスキャンすることで、大量のデータの中から現在のタスクにとってより重要で注目すべき情報を選択し、割り当てます。アテンションリソースは、この情報からさらに必要な詳細情報を取得し、その他の無駄な情報を抑制するために使用されます。深層学習では、特定のパフォーマンスは、関心のある領域に高い重みを与えることであり、ネットワークを学習して調整した後、最適な重み配分が得られ、ネットワーク モデルの注目を形成し、ネットワークの学習能力が強化されます。 . ネットワークのコンバージェンスを高速化します。
注意メカニズムは通常、ソフト アテンション メカニズムとハード アテンション メカニズムに分類できます [4-5]。情報を選択する際、ソフトアテンション機構は入力情報から一つを選択するだけでなく、すべての入力情報を使用しますが、それぞれの情報に対応する重み分布が異なり、それをネットワークモデルに入力して計算します。メカニズムは入力情報の 1 つをランダムに選択するか、最も高い確率で情報を選択しますが、このステップは通常微分不可能であるため、ハード アテンション メカニズムのトレーニングがより困難になります。したがって、ソフト アテンション メカニズムはより広く使用されており、原理によれば、ソフト アテンション メカニズムは、チャネル アテンション メカニズム (チャネル アテンション)、空間アテンション メカニズム (空間アテンション)、および混合ドメイン アテンション メカニズム (混合アテンション) に分類できます。
チャネル アテンション メカニズムの本質は、各機能チャネルの重要性を確立し、関心のあるチャネルに焦点を当て、興味のないチャネルの役割を弱めることです。空間的アテンションの本質は、モデルを確立することです。空間情報全体の重要性を認識し、空間内の関心のある領域に焦点を当て、残りの関心のない領域の役割を弱めます。ハイブリッド注意は、チャネル注意と空間注意を同時に使用し、その 2 つの部分を使用します。は順次または並行して実行され、チャネルの特徴と空間の特徴に同時に注意を払う注意モデルを形成します。
畳み込みブロック アテンション モジュール (CBAM) は、一般的に使用されるハイブリッド アテンション モジュールであり、チャネル アテンション モジュールと空間アテンション モジュールに連続して焦点を当て、このモジュールをネットワークに追加します。ネットワークのパフォーマンスを効果的に向上させ、ネットワーク モデルの計算量を削減できます。モジュール構造を図に示します。入力された特徴マップは、最初にブランチのチャネル アテンション モジュールを通過し、次にバックボーンの元の特徴マップとマージされてチャネル アテンションを持つ特徴マップが得られ、次にブランチの空間アテンション モジュールを通過し、バックボーンの特徴マップとの融合後、チャネル特徴アテンションと空間特徴アテンションを備えた同時特徴マップ。 CBAM モジュールは入力特徴マップのサイズを変更しないため、このモジュールはネットワーク内のどこにでも挿入できる「プラグ アンド プレイ」モジュールです。
チャネル アテンション モジュールの構造図を図に示します。チャネル アテンション モジュール ブランチは、入力特徴マップに対して最大プーリング演算と平均プーリング演算を並列に実行し、マルチ結果は、2 つのチャネルに適用される変換結果を取得するために変換され、最後に、変換結果はシグモイド活性化関数によって融合され、チャネル アテンションを備えたチャネル特徴マップが取得されます。
空間アテンション モジュールの概略図を図に示します。チャネル アテンション モジュールによって出力された特徴マップは、このモジュールの入力特徴マップとして使用されます。まず、入力特徴マップは次のようになります。チャネルベースの最大プーリング演算が実行され、平均プーリング演算により 2 つの部分から得られた結果が結合され、畳み込みを通じて I チャネルに縮小された特徴マップが取得され、最後にシグモイド活性化関数を使用して特徴マップが生成されます。空間的な注意を払って。
9. システム統合
完全なソース コード、データ セット、環境展開ビデオ チュートリアル、およびカスタム UI インターフェイスを以下に示します。