深層学習における物体認識

 ブロガーのプロフィール

ブロガーは、人工知能の研究に焦点を当てている 2 年生です。CSDN にお集まりいただきありがとうございます。ブロガーは、ここで人工知能、c++、Python、クローラーなどに関する知識を共有することをお約束します。友達が必要な場合は、ブロガーをフォローすると、ブロガーが更新を続けます. 間違いがあれば修正できます.

コラムの紹介:  このコラムでは、アルゴリズム、ケース プラクティス、ネットワーク モデル、およびその他の知識を含む、主にコンピューター ビジョンについて説明します。いくつかの一般的に使用されるデータ処理アルゴリズムを含め、多くの Python サードパーティ ライブラリも紹介します。必要に応じて、ここをクリックしてコラムを購読してください   。

私がとても好きな言葉を紹介させてください


目次

編集者の序文

物体認識の概念の編集

ニューラル ネットワークの使用の編集 

データセットの構築方法を編集する

ニューラル ネットワークの編集

編集研修と効果評価

過剰適合に対処するための編集

データ拡張の編集

転移学習の編集


序文

以前にディープラーニングでニューラルネットワークを紹介したので、今年は正式にディープラーニングに参入します. 以前に、コンピュータービジョンの4つの主要なタスクであるターゲット認識、ターゲット検出、ターゲット追跡、およびターゲットセグメンテーションを紹介しました. これらの中で最も基本的なのはターゲット認識です. ほとんどすべてのコンピュータ ビジョンの知識はターゲット認識問題に基づいて構築されています. つまり, ターゲット認識問題はコンピュータ ビジョン全体の基礎を構成しています. 認識問題を解決できなければ,コンピューター ビジョンの建物。

この章では、実際のプロジェクトを通じてターゲット認識を完全に理解します。このセクションで使用するデータセット:データセットをダウンロードします

物体認識の概念

先ほどターゲット認識の概念を紹介しましたが、コンピュータビジョンがコンピュータビジョンと呼ばれるのは、コンピュータをベースに人間の視覚を模倣した概念モデルだからです。しかし、コンピューターは常にコンピューターであり、人間のようにオブジェクトを直接区別することはできませんが、マークを付けます。例えば、大量の写真を認識した場合、その中の猫は認識に成功すると 1、犬であれば 2 とマークされます. つまり、彼の認識はすでに計画されたデータであり、認識できません状況に適応します。

次に、コンピュータは対象カテゴリの確率を出力します. たとえば、最初のカテゴリの確率は 0.9 で、2 番目のカテゴリの確率は 0.1 です. 最後に、最大の確率に対応するカテゴリが出力されます。このことから、コンピュータが非常に厳密であるという側面から見ることができます。

コンピュータは各カテゴリの確率を出力するため、拡張された概念があります: 上位 k 正解率は、名前が示すように、出力確率が最も高い k 個のカテゴリを出力することです. それらの 1 つが正しく推測されている限り、コンピュータはこれは、画像内に複数のターゲットが存在することが多く、ラベルが 1 つしかないため、ターゲット認識の評価では非常に一般的であるため、単純に 1 つで勝敗を決定するのは無理があります。 k の値はカテゴリの数によって決まりますが、通常は 5~10 です。

ニューラル ネットワークの使用 

データセットの構築方法

ニューラル ネットワークの学習では、データ セットの使用が非常に重要です.このプロセスでは、オープン ソースのデータ セットを使用することも、データ セットを自分で作成することもできます。次に、猫と犬の戦争データセットを使用します。

(1) 一般的な畳み込みニューラル ネットワークで必要な入力画像のサイズで固定されている同じサイズに画像を構築します。

(2) 各画像のデータ ラベルを作成する. 猫と犬の戦争では、画像の猫は 0、画像の犬は 1 としてマークされます。

(3)、データ セットをトレーニング セットとテスト セットに分割します。一般的な比率は 4:1 または 5:1 です。オーバーフィッティングを防ぐために、トレーニング セットでトレーニングしてから、テスト セットをテストする必要があります。テスト セットの最終的なパフォーマンスが類似している場合、モデルは過剰適合していないと見なすことができ、最終結果でもテスト セットの正解率を使用する必要があります。

(4) バッチでは、ディープ ラーニングの場合、通常、スモール バッチ勾配降下アルゴリズムを使用するため、各バッチの画像数を決定する必要があります。その数は、CPU または GPU メモリによって決定する必要があり、通常は 64 になります。またはバッチとして 129 枚の写真。

(5) トレーニング セット内の画像の順序をランダムにシャッフルする. トレーニング結果を改善するために、データ セットの各トレーニング後にデータ セットの順序をランダムにシャッフルして、画像が各バッチに入力されるようにする必要があります。は完全にランダムです。それ以外の場合は、局所的な極値に陥りやすくなります。

さあ、見せて、コード:

import tensorflow as tf
import os
#读取数据集并构建数据集
_URL='https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'
#解压
path_to_zip=tf.keras.utils.get_file('cats_and_dogs.zip',origin=_URL,extract=True)
PATH=os.path.join(os.path.dirname(path_to_zip),'cats_and_dogs_filtered')
#分为训练集和测试集
train_dir=os.path.join(PATH,'train')
validation_dir=os.path.join(PATH,'validation')

#分为猫图片和狗图片
train_cats_dir=os.path.join(train_dir,'cats')
train_dogs_dir=os.path.join(train_dir,'dogs')
validation_cats_dir=os.path.join(validation_dir,'cats')
validation_dogs_dir=os.path.join(validation_dir,'dogs')
#批次大小
batch_size=64
epochs=20
#图片输入大小为150*150
IMG_HEIGHT=150
IMG_WIDTH=150
#从目录生成数据集,shuffle表示随机打乱数据顺序
train_data_gen=tf.keras.preprocessing.image.ImageDataGenerator()
train_data_gentor=train_data_gen.flow_from_directory(batch_size=batch_size,directory=train_dir,
                                                                                   shuffle=True,target_size=(IMG_HEIGHT,IMG_WIDTH),class_mode='binary')
val_data_gen=tf.keras.preprocessing.image.ImageDataGenerator()
val_data_gentor=val_data_gen.flow_from_directory(batch_size=batch_size,directory=validation_dir
                                                                                 ,target_size=(IMG_HEIGHT,IMG_WIDTH),class_mode='binary')

ニューラル ネットワークを構築する

次に、画像のサイズに応じて適切なニューラル ネットワークを構築する必要がありますが、初心者には 10 層程度のニューラル ネットワークを使用することをお勧めします。一般に、ニューラル ネットワークの最初と最後の層に対してのみ、入力と出力のサイズの制約があります。たとえば、最初のレイヤーの入力には画像の形状が必要ですが、最後のレイヤーの出力にはオブジェクト カテゴリの数が必要です。

最初の層: 3x3 畳み込み層、32 個の出力チャネル、入力形状は画像の形状: 150x150x3、1 ピクセルで塗りつぶされ、活性化関数は relu() です。

2 番目の層: 2x2 最大プーリング層。

3 番目の層: 3x3 畳み込み層、64 個の出力チャネル、1 つのピクセルを埋める、活性化関数は relu() です。

第 4 層: 2x2 最大プーリング層。

5 番目の層: 3x3 畳み込み層、64 個の出力チャネル、1 つのピクセルを埋める、活性化関数は relu() です。

第 6 層: 2x2 最大プーリング層。

第 7 層: 出力は 256 次元の全結合層で、活性化関数は relu() です。

第 8 層: 出力は 1 次元の全結合層で、活性化関数は sigmoid() です。


#搭建神经网络
#每一行代表神经网络的一层
model=tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(256,activation='relu'),
    tf.keras.layers.Dense(1,'sigmoid')
])

トレーニングと効果評価

起こりうるエラーを防ぐために、データ マシン全体でトレーニングするのではなく、小規模なデータ セットでモデルをオーバーフィットできるように小規模なデータ セットでトレーニングしてから、データ セット全体を使用します。

次にトレーニングを行います. オプティマイザを選択する必要があります.一般的に, Adam オプティマイザはほとんどの問題を解決できます. 損失関数については, 一般にクロスエントロピー損失を選択します. この例では, バイナリクロスエントロピーを使用します. トレーニング プロセス中に、モデル トレーニングの効果を判断するために、米国での現在の損失率と精度を展開して記録することができます。損失関数が減少していないことがわかったら、すぐにトレーニングを中止する必要があります。


#训练
#编译模型,输入优化器,损失函数,训练过程需要保存的特征
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])
#训练
history=model.fit_generator(
    train_data_gen,
    steps_per_epoch=100//batch_size, #每轮的步数
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=100//batch_size
)

オーバーフィッティングを解決する

使用するデータセットが比較的小さい場合、オーバーフィッティングを防ぐために特定の方法を使用する必要があります。したがって、オーバーフィッティングの問題は、モデル パラメーターを減らすことで解決できます。


model1=tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32,3,padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128,activation='relu'),
    tf.keras.layers.Dense(1,activation='sigmoid')
])

2 番目の方法は、L1 および L2 正則化メソッドで一般的に使用される正則化項を増やすことです。ニューラルネットワークでは、一般的にL2正規化法を使用します.重み係数を調整する必要があります.0.0005という魔法の値があり、ほとんどの問題の重み係数として使用できます.


model=tf.keras.Sequential([
    tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3),kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3),kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3),kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(256,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),
    tf.keras.layers.Dense(1,activation='sigmoid',kernel_regularizer=tf.keras.regularizers.l2(l=0.0005))
])

3番目の方法はドロップアウト層を追加することです.ドロップアウト層の原理は上で述べました.一般的に言えば,ドロップアウト層の効果は最初の2つよりも優れています.ニューロンを削除する確率を調整する必要があります.これは一般的にです. 0.5 に設定します。


#增加Dropout层
model=tf.keras.Sequential([
    tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Dropout(0.5), #设置Dropout层
    tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),
    tf.keras.layers.Dropout(0.5), #Dropout层
    tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(), #池化层
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(256,activation='relu'), #全连接层
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(1,activation='sigmoid')

])

もちろん、最初のいくつかの方法を組み合わせて最適なモデルを形成することもできますが、最後に、深層学習では、学習効率という非常に重要なハイパーパラメーターがもう 1 つあります。一般的に言えば、0.001 から調整を開始できます. 学習率が高すぎると、高精度の結果を得ることが難しくなり、学習率が小さすぎると、トレーニング時間が非常に長くなります.



#调整学习率
#学习率先用0.001训练
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#学习率调小为原来的1/10
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='sparse_categorical_crossentropy',metrics=['accuracy'])

データ増強

使用するデータが非常に少ない場合 このとき必要なのがデータの強化です. 実は簡単に言えばデータセットを増やすことです. 例えば2,000枚の写真があれば, 反転したり, 色を変えたりして写真を変えます.データを増やします。その後のトレーニングでは、各ラウンドのトレーニングに引き続き 2000 枚の写真を使用しますが、各ラウンドの写真は異なります。ランダムな変換の後、取得されたデータ モデルはより正確になります。


#随即水平反转
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,horizontal_flip=True)
#随机竖直翻转
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,vertical_flip=True)
#随即旋转
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,rotation_range=45)
#随即缩放,zoom_range在0~1表示图片缩放比例范围[1-zoom_range,1+zoom_range]
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,zoom_range=0.5)
#全部应用
image_gen_train=tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    rotation_range=45,
    width_shift_range=.15,
    height_shift_range=.15,
    horizontal_flip=True,
    vertical_flip=True,
    zoom_range=0.5
)

転移学習

転移学習とは

実際、単純な点は、他の人のモデルを借りて自分のタスクをトレーニングすることです. 利点は、それが高速で効果的であることです. 例えば、本の知識は非常に詳細で多く、理解するのはそれほど速くはないかもしれませんが、誰かがあなたに説明してくれたら、すぐに理解できるでしょうか? それは他人のものを吸収することです。

転移学習には主に 2 つの方法があります: 1 つ目は微調整 (Fine Tune) と呼ばれ、その名前が示すように、トレーニング済みのモデルを微調整することです. 一般に、全体の最後の数層を調整します.モデル;

2 番目の方法はレイヤーの追加と呼ばれ、モデルの最後にいくつかのレイヤーを追加してから、これらのレイヤーをトレーニングします。

ResNet50 モデルを借りて、転移学習の使用方法を簡単に紹介します。



#选则基础模型
base_model=tf.keras.applications.ResNet50(weights='imagenet')
base_model.summary()
#将基础模型的参数设置为不可训练
base_model.trainable=False
#加层
prediction_layer1=tf.keras.layers.Dense(128,activation='relu')
prediction_layer2=tf.keras.layers.Dense(1,activation='sigmoid')
model=tf.keras.Sequential([
    base_model,
    prediction_layer1,
    prediction_layer2
])
#微调
fine_tune_at=150
for layer in base_model.layers[fine_tune_at:]:
    layer.trainable=True
base_model.summary()
prediction_layer=tf.keras.layers.Dense(1,activation='sigmoid')
model=tf.keras.Sequential([
    base_model,
    prediction_layer
])

 

 

ここまでで、独自のニューラル ネットワークとデータ セット、およびいくつかの従来の方法を構築する方法について予備的に理解しました.次のセクションでは、ニューラル ネットワークのビジョンについて学び始めます. あなたに別れを告げる!

いいね&迷わないように注意

おすすめ

転載: blog.csdn.net/qq_59931372/article/details/129974860
おすすめ