データ拡張は、長い間、「静的な」データセットを変換されたバリアントに置き換える手段として機能し、データの不変性を強化してきました。 畳み込みニューラルネットワーク(CNN)、そして通常、入力に対する堅牢性につながります。
注: 不変性は、決定を下す際に、特定の摂動に対してモデルを盲目にすることに要約されます。 猫の画像は、鏡像化または回転しても猫の画像のままです。
私たちが使用してきた形式のデータ拡張は、 不足 オブジェクトの検出、セマンティックおよびインスタンスのセグメンテーションなどにとって重要な並進分散に関する知識の 不変性 多くの場合、分類モデルに適しているため、拡張はより一般的かつ積極的に分類モデルに適用されます。
増強の種類
小さな回転、水平方向と垂直方向の反転、コントラストまたは明るさの変動など、拡張は非常に単純なものになり始めました。近年、次のようなより精巧な方法が考案されています。 切り取る (入力画像にランダムに黒い四角を導入する空間ドロップアウト)および ミックスアップ (画像の一部を混同し、ラベルの比率を更新する)、およびそれらの組み合わせ – カットミックス. 新しい拡張メソッドは実際にラベルを考慮し、CutMix のようなメソッドはラベルの比率を変更して、混同される各クラスの部分によって占められる画像の比率と等しくなるようにします。
可能な拡張のリストが増えているため、ランダムな拡張のセットがモデルの堅牢性を強化し、元のセットをはるかに大きなものに置き換えるという考えで、それらをランダムに (または少なくともそれらのサブセット) 適用し始めている人もいます。入力画像のスペース。 ここが RandAugment
キックイン!
KerasCV と RandAugment
ケラスCV は別のパッケージですが、Keras チームによって開発された Keras への公式の追加です。 これは、メイン パッケージと同じ量の洗練された直感的な機能が得られることを意味しますが、通常の Keras モデルとそのレイヤーとシームレスに統合されます。 あなたが気付く唯一の違いは呼び出しです keras_cv.layers...
keras.layers...
.
KerasCV は執筆時点でまだ開発中であり、すでに 27 の新しい前処理レイヤーが含まれています。 RandAugment
, CutMix
, MixUp
それらの一部です。 申し込みの様子を見てみましょう RandAugment
画像への変換、およびランダムな拡張を使用して、または使用せずに分類子をトレーニングする方法。
まず、インストール keras_cv
:
$ pip install keras_cv
注: KerasCV が動作するには TensorFlow 2.9 が必要です。 まだ持っていない場合は、実行します $ pip install -U tensorflow
最初。
次に、Imagenette に簡単にアクセスできるように、TensorFlow データセットとともに、TensorFlow、Keras、および KerasCV をインポートしましょう。
import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds
画像を読み込んで、元の形式で表示しましょう。
import matplotlib.pyplot as plt
import cv2
cat_img = cv2.cvtColor(cv2.imread('cat.jpg'), cv2.COLOR_BGR2RGB)
cat_img = cv2.resize(cat_img, (224, 224))
plt.imshow(cat_img)
では、申し込みましょう RandAugment
それに数回、結果を見てください。
fig = plt.figure(figsize=(10,10))
for i in range(16):
ax = fig.add_subplot(4,4,i+1)
aug_img = keras_cv.layers.RandAugment(value_range=(0, 255))(cat_img)
ax.imshow(aug_img.numpy().astype('int'))
レイヤーには magnitude
引数。デフォルトは 0.5
オーグメンテーションの効果を増減するように変更できます。
fig = plt.figure(figsize=(10,10))
for i in range(16):
ax = fig.add_subplot(4,4,i+1)
aug_img = keras_cv.layers.RandAugment(value_range=(0, 255), magnitude=0.1)(cat_img)
ax.imshow(aug_img.numpy().astype('int'))
のように低い値に設定すると、 0.1
– あまり攻撃的でない拡張が表示されます:
レイヤーであること – モデル内または tf.data
データセットの作成中のパイプライン。 これにより、 RandAugment
かなり柔軟! 追加の引数は augmentations_per_image
& rate
一緒に機能する引数。
0...augmentations_per_image
、レイヤーはランダムな前処理レイヤーをパイプラインに追加して、画像に適用します。 デフォルトの場合 3
– XNUMX つの異なる操作がパイプラインに追加されます。 次に、パイプライン内の拡張ごとに乱数がサンプリングされます。 rate
(デフォルトは約 0.9
) – 拡張が適用されます。
要するに、パイプライン内の各 (ランダムな) 増強が画像に適用される確率は 90% です。
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!
これは当然、すべての増強を適用する必要がないことを意味します。 rate
. また、許可する操作をカスタマイズすることもできます。 RandomAugmentationPipeline
レイヤー、 RandAugment
の特殊なケースです。 別ガイド RandomAugmentationPipeline
まもなく公開されます。
RandAugment を使用した場合と使用しない場合の分類子のトレーニング
データの準備/読み込みの側面を簡素化し、 RandAugment
、使いましょう tfds
Imagenette の一部を読み込むには:
(train, valid_set, test_set), info = tfds.load("imagenette",
split=["train[:70%]", "validation", "train[70%:]"],
as_supervised=True, with_info=True)
class_names = info.features["label"].names
n_classes = info.features["label"].num_classes
print(f'Class names: {class_names}')
print('Num of classes:', n_classes)
print("Train set size:", len(train))
print("Test set size:", len(test_set))
print("Valid set size:", len(valid_set))
トレーニング データの一部のみを読み込んで、より少ないエポックでデータセットを簡単にオーバーフィットできるようにしました (事実上、実験をより速く実行できます)。 Imagenette の画像はサイズが異なるため、作成してみましょう。 preprocess()
それらのサイズを変更してデータセットをマップする関数、および augment()
の画像を拡張する関数 tf.data.Dataset
:
def preprocess(images, labels):
return tf.image.resize(images, (224, 224)), tf.one_hot(labels, 10)
def augment(images, labels):
inputs = {"images": images, "labels": labels}
outputs = keras_cv.layers.RandAugment(value_range=(0, 255))(inputs)
return outputs['images'], outputs['labels']
ここで、ラベルをワンホット エンコードしました。 必ずしもそうする必要はありませんでしたが、 CutMix
ラベルとそのプロポーションを改ざんする場合は、そうする必要があります。 あなたはそれらを適用したいかもしれないので RandAugment
堅牢な分類子を作成するために、それらと非常にうまく機能します。ワンホット エンコーディングはそのままにしておきます。さらに、 RandAugment
まさにこれが原因で、画像とラベルを含む辞書を取得します。追加できるいくつかの拡張機能は実際にラベルを変更するため、それらは必須です. 拡張された画像とラベルを outputs
辞書を簡単に作成できるため、これは拡張中に実行する追加の、しかし単純な手順です。
から返された既存のデータセットをマッピングしましょう tfds
preprocess()
関数を使用して、それらをバッチ処理し、トレーニング セットのみを拡張します。
valid_set = valid_set.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set = train.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set_aug = train.map(preprocess).map(augment_data,
num_parallel_calls=tf.data.AUTOTUNE).batch(32).prefetch(tf.data.AUTOTUNE)
ネットワークを訓練しましょう! keras_cv.models
に似た、いくつかの組み込みネットワークがあります。 keras.applications
. リストはまだ短いですが、時間の経過とともに拡大し、引き継がれるでしょう keras.applications
. API は非常に似ているため、コードの移植はほとんどの実践者にとって非常に簡単です。
effnet = keras_cv.models.EfficientNetV2B0(include_rescaling=True, include_top=True, classes=10)
effnet.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history = effnet.fit(train_set, epochs=25, validation_data = valid_set)
または、現在の keras.applications
:
effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history1 = effnet.fit(train_set, epochs=50, validation_data=valid_set)
これにより、実際にはあまりうまく機能しないモデルが得られます。
Epoch 1/50
208/208 [==============================] - 60s 238ms/step - loss: 2.7742 - accuracy: 0.2313 - val_loss: 3.2200 - val_accuracy: 0.3085
...
Epoch 50/50
208/208 [==============================] - 48s 229ms/step - loss: 0.0272 - accuracy: 0.9925 - val_loss: 2.0638 - val_accuracy: 0.6887
では、拡張されたデータセットで同じネットワーク設定をトレーニングしましょう。 各バッチは個別に拡張されるため、同じバッチの画像 (次のエポック) が出現するたびに、異なる拡張が行われます。
effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history2 = effnet.fit(train_set_aug, epochs=50, validation_data = valid_set)
Epoch 1/50
208/208 [==============================] - 141s 630ms/step - loss: 2.9966 - accuracy: 0.1314 - val_loss: 2.7398 - val_accuracy: 0.2395
...
Epoch 50/50
208/208 [==============================] - 125s 603ms/step - loss: 0.7313 - accuracy: 0.7583 - val_loss: 0.6101 - val_accuracy: 0.8143
ずっといい! 次のような他の拡張機能を適用したい場合でも、 CutMix
& MixUp
、ネットワークの精度を最大化するための他のトレーニング手法と一緒に – ただ RandAugment
大幅に役立ち、より長い拡張パイプラインに匹敵する可能性があります。
トレーニングを含むトレーニング曲線を比較すると、 & 検証曲線 – どれだけ明確になるか RandAugment
支援します。
拡張されていないパイプラインでは、ネットワークがオーバーフィットし (トレーニングの精度が上限に達し)、検証の精度は低いままです。 拡張パイプラインでは、 トレーニングの精度は、最初から最後まで検証の精度よりも低いままです.
トレーニング損失が大きくなると、ネットワークはまだ犯している間違いをより認識し、変換に対して不変になるように、より多くの更新を行うことができます。 前者は更新する必要がないと考えていますが、後者は更新する必要があり、潜在的な上限を引き上げています。
まとめ
ケラスCV は別のパッケージですが、Keras チームによって開発された Keras への公式の追加であり、業界で強力な CV を Keras プロジェクトにもたらすことを目的としています。 KerasCV は執筆時点でまだ開発中であり、すでに 27 の新しい前処理レイヤーが含まれています。 RandAugment
, CutMix
, MixUp
それらの一部です。
この短いガイドでは、どのように使用できるかを見てきました RandAugment
適用された変換の特定のリストから多数のランダムな変換を適用する方法、および任意の Keras トレーニング パイプラインに含めるのがいかに簡単か。
さらに先へ - コンピュータ ビジョンのための実用的な深層学習
あなたの好奇心旺盛な性質は、さらに先へ進みたいと思わせますか? 私たちは私たちをチェックアウトすることをお勧めします コース: 「Pythonによるコンピュータビジョンのための実践的な深層学習」.
別のコンピューター ビジョン コースですか?
MNIST 数字や MNIST ファッションの分類は行いません。 彼らはずっと前に彼らの役割を果たしました。 高度なブラックボックス アーキテクチャにパフォーマンスの負担を負わせる前に、あまりにも多くの学習リソースが基本的なデータセットと基本的なアーキテクチャに焦点を合わせています。
私たちが注目したいのは 謎解き, 実用性, 理解する, 直感 & 実際のプロジェクト. 学びたい の あなたは違いを生むことができますか? 私たちの脳が画像を処理する方法から、乳がんの研究レベルのディープ ラーニング分類器の作成、「幻覚」を起こすディープ ラーニング ネットワークまで、実際の作業を通じて原理と理論を教え、コンピュータビジョンを解決するためにディープラーニングを適用する専門家になるためのノウハウとツール。
内部には何がありますか?
- ビジョンの第一原理と、コンピューターに「見る」ことを教える方法
- コンピューター ビジョンのさまざまなタスクとアプリケーション
- あなたの仕事を楽にする貿易ツール
- コンピュータ ビジョンのためのデータセットの検索、作成、および利用
- 畳み込みニューラル ネットワークの理論と応用
- データセット内のドメイン シフト、共起、およびその他のバイアスの処理
- 転移学習と、他人のトレーニング時間と計算リソースを自分の利益のために利用する
- 最先端の乳がん分類器の構築とトレーニング
- 主流のアイデアに健全な懐疑心を適用し、広く採用されている手法の意味を理解する方法
- t-SNE と PCA を使用した ConvNet の「概念空間」の可視化
- 企業がコンピューター ビジョン技術を使用してより良い結果を達成する方法のケース スタディ
- 適切なモデル評価、潜在空間の可視化、モデルの注意の特定
- ドメイン調査の実施、独自のデータセットの処理、モデル テストの確立
- 最先端のアーキテクチャ、アイデアの進展、それらの独自性と実装方法
- KerasCV – 最先端のパイプラインとモデルを作成するための WIP ライブラリ
- 論文を解析して読み、自分で実装する方法
- 用途に応じた機種選定
- エンドツーエンドの機械学習パイプラインの作成
- Faster R-CNN、RetinaNet、SSD、YOLO を使用したオブジェクト検出のランドスケープと直感
- インスタンスとセマンティック セグメンテーション
- YOLOv5によるリアルタイム物体認識
- YOLOv5 オブジェクト検出器のトレーニング
- KerasNLP (業界で強力な WIP ライブラリ) を使用したトランスフォーマーの操作
- トランスフォーマーを ConvNets と統合して画像のキャプションを生成する
- DeepDream
- コンピューター ビジョンのためのディープ ラーニング モデルの最適化