Yolov5 (pytoch) に基づくカメラ喫煙行動検出システム

目次

1. データセットの紹介

 1.1 データセットの分割

 1.2 voc_label.py を通じて txt を生成する

1.3 小規模なターゲットの定義

2. Yolov5に基づく喫煙行動検出のパフォーマンスの向上

2.1 マルチスケールを活用した小型ターゲットの検出精度向上

2.2 マルチスケール訓練結果の分析

2.3 マルチスケールに基づいた BiFormer の追加: 動的スパース アテンションに基づいた効率的なピラミッド ネットワーク アーキテクチャの構築

2.3.1 BiFormer 原理の紹介

2.3.2 実験結果の解析


1. データセットの紹介

喫煙行動はカメラを通じて収集され、ラベル付けのために合計 1812 枚の画像が収集され、トレーニング セット、検証セット、テスト セットが 8:1:1 に従ってランダムに区別されました。

 1.1 データセットの分割

split_train_val.py を通じて trainval.txt、val.txt、test.txt を取得する  

# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 0.9
train_percent = 0.8
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')

for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

 1.2 voc_label.py を通じて txt を生成する

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val']
classes = ["smoke"]   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    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('Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('labels/%s.txt' % (image_id), 'w')
    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'):
        difficult = obj.find('difficult').text
        #difficult = obj.find('Difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        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))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()
for image_set in sets:
    if not os.path.exists('labels/'):
        os.makedirs('labels/')
    image_ids = open('ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

画像による判断は小型ターゲット検出に該当します

1.3 小規模なターゲットの定義


1) 物体検出の分野で一般的なデータセットである COCO オブジェクト定義を例にとると、小さいオブジェクトは 32×32 より小さいピクセルを指します (中オブジェクトは 32*32-96*96 を指します)。大きなオブジェクトとは、96*96 より大きいオブジェクトを指します);
2) 実際のアプリケーション シナリオでは、通常、元の画像に対する比率を使用して定義する傾向がより高くなります: オブジェクト ラベル ボックスの長さと幅の積、画像全体の長さと幅の積で割って、結果が 3% 未満の場合はルート サインを開きます。これは小さな目標と呼ばれます。

2. Yolov5に基づく喫煙行動検出のパフォーマンスの向上

生の yolov5 の結果

2.1 マルチスケールを活用した小型ターゲットの検出精度向上

ポイントアップ スキル: Yolov5 に基づく小型ターゲット検出、マルチヘッド検出ヘッドにより小型ターゲットの検出精度が向上_yolov5 小型ターゲット検出_AI Little Monster のブログ - CSDN ブログ
 

原理紹介: 上記の小さなターゲットに対してより良い検出結果を達成するために、YOLOv5 モデルは P2 層機能による新しい検出ヘッドを導入しています。構造を図 2 に示します。P2 層検出ヘッドの解像度は 160×160 です。これは、バックボーン ネットワークでの 2 つのダウンサンプリング操作に相当し、より豊富な基本的な特徴情報が含まれています。ネック ネットワークのトップダウンとボトムアップから取得される 2 つの P2 層の特徴は、ネック ネットワークの場合と同じです。同じスケールのフィーチャが concat 形式で融合され、出力フィーチャは 3 つの入力フィーチャの融合結果であるため、P2 層検出ヘッドは小さなターゲットを迅速かつ効果的に検出できます。オリジナルの 3 つの検出ヘッドに加えて、スケール変動による悪影響を効果的に軽減できます。追加された検出ヘッドは、基礎となる特徴をターゲットにしており、低レベルの高解像度の特徴マップを通じて生成されます。この検出ヘッドは、微小な点に対してより感度が高くなります。これを追加すると、検出ヘッドの追加によりモデルの計算量とメモリのオーバーヘッドが増加しますが、小さなターゲットの検出能力は大幅に向上します。

2.2 マルチスケール訓練結果の分析

Confusion_matrix.png : 列は予測されたカテゴリを表し、行は実際のカテゴリを表します。対角線上の値は正しい予測の割合を表し、対角線以外の要素は予測の間違った部分です。混同行列の対角線上の値が高いほど優れており、多くの予測が正しいことを示します。

 上の写真は喫煙検知の訓練の様子で、ダメージと背景FPであることが分かります。プロットは各列で正規化されます。正しい損傷検出予測の確率は 89% であることがわかります。

F1_curve.png: F1 スコアと信頼度の関係 (x 軸)。F1 スコアは分類の尺度であり、0 から 1 までの適合率と再現率の調和平均関数です。大きければ大きいほどいい。

TP: 真実は真実、予測は真実です。

FN: 真は真、予測は偽。

FP: 真は偽、予測は真。

TN: 真は偽、予測は偽。

精度(精度) = TP/(TP+FP)

リコール(リコール)=TP/(TP+FN)

F1=2*(適合率*再現率)/(適合率+再現率)

 label_correlogram.jpg : データの各軸と他の軸の間のコントラストを表示します。イメージ内のラベルは xywh 空間にあります。

 ラベル.jpg :

(1, 1) は各カテゴリのデータ量を表します

(1, 2) グラウンドトゥルースのラベル付きbounding_box

(2, 1) 実ラベルの中心点の座標

(2, 2) 実際のラベルのマトリックスの幅と高さ

 P_curve.png: 精度と信頼性の関係を示すグラフ。横軸は信頼性です。下の図から、信頼度が高いほど精度が高いことがわかります。

 PR_curve.png : PR 曲線の P は精度 (適合率) を表しR は再現率 (再現率) を表し、適合率と再現率の関係を表します。

 R_curve.png : 再現率と信頼性の関係

 結果.png

 mAP_0.5:0.95 は、0.05 のステップ サイズで 0.5 から 0.95 までの平均 mAP を表します。

 予測結果:

2.3 マルチスケールに基づいた BiFormer の追加: 動的スパース アテンションに基づいた効率的なピラミッド ネットワーク アーキテクチャの構築

Yolov5/Yolov7 が CVPR 2023 BiFormer を導入: 小さなターゲットが大幅に増加する動的まばらな注意に基づく効率的なピラミッド ネットワーク アーキテクチャの構築_AI Little Monster のブログ - CSDN ブログ

2.3.1 BiFormer 原理の紹介

論文: https://arxiv.org/pdf/2303.08810.pdf

背景: アテンション メカニズムは、Vision Transformer の中核となる構成要素の 1 つであり、長距離の依存関係をキャプチャできます。ただし、この強力な機能は、すべての空間的位置間のペアごとのトークンの相互作用を計算する必要があるため、膨大な計算負荷とメモリ オーバーヘッドを課します。この問題を軽減するために、一連の研究では、アテンション操作をローカル ウィンドウ、軸方向ストライプ、または拡張ウィンドウに制限するなど、コンテンツに依存しない手作りのスパース性をアテンションに導入することで、この問題を解決しようとしています。

私たちの方法: この論文では、動的スパース アテンションを備えた 2 層ルーティング方法を提案します。クエリの場合、最初に無関係なキーと値のペアが大まかな領域レベルでフィルタリングされて除外され、その後、残りの候補領域 (つまり、ルーティング領域) の結合にきめの細かいトークン間の注意が適用されます。提案されている 2 層ルーティング アテンションは、スパース性を利用して計算量とメモリを節約する、シンプルかつ効果的な実装であり、GPU に適した密な行列の乗算のみを含みます。BiFormer と呼ばれる新しい一般的な Vision Transformer は、これに基づいて構築されています。

 図 (a) は元の アテンション 実装であり、グローバルに直接動作するため、計算の複雑性が高く、メモリ フットプリントが大きくなります。一方、図 (b) ~ (d) では、これらのメソッドは、複雑さを軽減するためにスパース アテンションを導入することで実装されています。ローカル ウィンドウ、軸方向のストライプ、拡張ウィンドウなど;一方、図 (e) は、画像の適応的スパース性を達成するための不規則なグリッドによる変形可能な注意に基づいています;著者は、これらの方法の多くは、手作りのコンテンツを導入することでこの問題を軽減しようとしていると考えています。注意メカニズムへの独立したスパース性。したがって、この論文では、図 (f) に示すように、より柔軟な計算割り当てコンテンツ認識を実現するために、 2 層ルーティング ( ) による新しい動的スパース アテンションbi-level routing( ) を提案し、動的クエリ認識スパース性を実現します。dynamic sparse attention 

2.3.2 実験結果の解析

マップはさらに 0.899 に改善されました

おすすめ

転載: blog.csdn.net/m0_63774211/article/details/132632191