猫や犬を識別するために、03-kerasニューラルネットワークのシリーズを構築するために学ぶ[実践演習]マシン

前のインストールと設定keras線形回帰ニューラルネットワークを説明し、我々は、猫や犬のこのニューラルネットワークの認識を構築してみてください。

事前に犬や猫の画像をダウンロードkaggleデータ収集、ダウンロードリンク:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data

画像内のtest1.zipや鉄道模型の画像内で訓練するために使用されるtrain.zipアーカイブ、およびテストと内部モデルをテストするために使用されます。

どの絵を訓練、絵は、猫のようにラベルを果たしているcat.0.jpgで、犬はニューラルネットワークが学習を監督しているようにするために、dog.0.jgpあります。

CへTrain.zip最初の抽出物:\データ\列車\ディレクトリ、ノートウィンドウが\、十分なパス/または\\図です。


図1に示すように、画像の種類と量統計

輸入OSの
電車= 'C:\\ \\データ電車\\' 
犬= [os.listdir(電車)で、私のために電車+ I Iの「犬の場合] 
猫= [os.listdirで私のために電車+ I (電車)は、i]の「猫の場合
、印刷(LEN(犬)、LEN(猫))

12500 12500

#統計C:絵、完全な統計の数以下の\データ\列\は犬が12,500を持っていることがわかった、猫は12500を持っています。第二のステップで簡単に参照data_processという名前の最初のステップPYファイルとしてコードを保存します。(:\ユーザー\ XXX \ Cに現在のユーザーディレクトリを入れ、その後、アナコンダのインストールを使用してjupyterノートパソコンの場合)

2、写真を並べ替え

内部の犬や猫\ \ mini_trainningdata \電車をした後、500匹の猫を選び、500:Cに、それぞれ、選択された1000年と1000年、犬猫の写真内のデータ\列\から自動的にmini_trainningdataフォルダと呼ばれるファイルを自動的に作成しますCへの犬:\ mini_trainningdata \テスト\犬や猫の内部。

インポートOS 
createDir(パス)DEF:
    いない場合os.path.exists(パス):
        試す:
            os.makedirs(パス)
        を除く:
            印刷( "创建文件夹失败")
            の出口(1)
パス= "C:/ min_trainingdata / " 
createDir(パス+"電車/犬")
createDir(パス+"電車/猫")
createDir(パス+"テスト/犬")
createDir(パス+"テスト/猫」)
のDPとして輸入data_process 
輸入shutil 
リスト中の犬のための、猫(ジップ(dp.dogs、dp.cats))[1000]:
    shutil.copyfile(犬、パス+ "電車/犬/" + os.path.basename(犬))
    プリント(os.path.basename(犬)+ "操作成功")
    shutil.copyfile(猫、パス+ "電車/猫/"+ os.path.basename(猫))
    プリント(os.path.basename(CAT)+ "操作成功")
犬のために、リスト内の猫(ZIP(dp.dogs、dp.cats))[1000:1500]:
    shutil.copyfile(犬、パス+「試験/犬/」+ os.path.basename(犬))
    プリント(os.path.basename(犬)+ "操作成功")
    shutil.copyfile(猫、パス+ "テスト/猫/" + os.path.basename (猫))
    プリント(os.path.basename(猫)+ "操作成功")

図3に示すように、データ拡張

/users/xxx/catvsdogs/morph.py:Cに次のコードを保存

keras.preprocessing.imageインポートImageDataGeneratorから
:train_dir = "/ mini_trainningdata /列車/ C" 
TEST_DIR = "C:/ mini_trainningdata /試験/" 
train_pic_gen = ImageDataGenerator(= 1/255スケール変更rotation_range = 20、width_shift_range = 0.2、height_shift_range = 0.2、
                                 shear_range = 0.2、zoom_range = 0.5、horizo​​ntal_flip =真、fill_mode = '最寄り')
test_pic_gen = ImageDataGenerator()= 1/255スケール変更
train_flow = train_pic_gen.flow_from_directory(train_dir、(128,128)、BATCH_SIZE = 32、class_mode = 'バイナリ')
test_flow = test_pic_gen.flow_from_directory(TEST_DIR、(128,128)、BATCH_SIZE = 32、class_mode = 'バイナリ') プリント(train_flow.class_indices)

4、建設およびトレーニングモデル

keras.modelsから順次インポート
Convolution2D、MaxPool2D、平坦化、高密度、ドロップアウトをインポートkeras.layersから
TensorBoardインポートkeras.callbacksから
モデルは=シーケンシャル([ 
    活性化=」、Convolution2D(32,3,3、input_shape =(128,128,3) relu ')、
    MaxPool2D(POOL_SIZE =(2,2))、
    Convolution2D(64,3,3、input_shape =(128,128,3)、活性化=' relu ')、
    MaxPool2D(POOL_SIZE =(2,2))、
    平ら()、
    高密度(64、活性化= 'relu')、
    ドロップアウト(0.5)、
    高密度(1、活性化= 'シグモイド')
])
model.summary()
= 'binary_crossentropy model.compile(オプティマイザ= 'rmsprop'、損失」、メトリック= [ '精度'])
インポートcatvsdogs。1増加参照データコード上方モーフ#としてモーフィング
(model.fit_generator
    morph.train_flow、steps_per_epoch = 100、エポック= 50、冗長= 1、validation_data = morph.test_flow、validation_steps = 100、
    コールバック= [TensorBoard(LOG_DIR =」/ログ/ 1 ')] 
model.save(' C: /mini_trainningdata/catdogs_model.h5' )

あなたがしたら、モデルが発売さと訓練されてきたでしょう。

5、リロードとトレーニングを続けます

keras.callbacksからTensorBoardをインポート
keras.modelsからload_modelインポート
= load_modelモデル:( 'C /mini_trainningdata/catdogs_model.h5')
model.summary()
モーフとしてインポートcatvsdogs.morph 
model.fit_generator(
    morph.train_flow、steps_per_epoch = 100、エポック= 50、冗長= 1、validation_data = morph.test_flow、validation_steps = 100、
    コールバック= [TensorBoard(「/ログ/ 2 'LOG_DIR =)] 
model.save(' C:/mini_trainningdata/catdogs_model.h5' )

カスタムを使用して6、テスト画像

画像は独自のパスとパスの内側pre_x = get_inputs下でテストされるように変更することができます。

私たちは、2〜PIC0猫、犬、PIC6ワニ、pic7のサルを使用してPIC3〜5、pic8アイアンマンを、採用はテストのために入力しました。

004.png

コードの下にOpenCVの-のpythonをインストールする必要があります

OpenCVの-のpythonをインストールするPIP
kerasインポートモデルから
NPとしてnumpyのをインポートする
インポートCV2の
:DEF get_inputs(SRC = [])
    pre_x = [] 
    :秒間SRCに
        入力= cv2.imread(S)
        入力= cv2.resize(入力、(128、128))
        入力= cv2.cvtColor(入力、cv2.COLOR_BGR2RGB)
        pre_x.append(入力)#入力一张图片
    pre_x = np.array(pre_x)/ 255.0 
    戻りpre_x 
DEF put_prey(pre_y、ラベル):
    出力= [] 
    yについてでpre_y:
        もしY [0] <0.5:#1二分类、此处只用一个神经元输出
            output.append([ラベル[0]、1-Y [0])
        他:
            output.append([ラベル[1 ]、Y [0]]) 
    リターン出力
モデル= models.load_model( 'C:/mini_trainningdata/catdogs_model.h5')
pre_x = get_inputs([ 'C:\\ TESTDATA \\ pic0.jpg'、 'C:\\ TESTDATA \\ pic1.jpg'、 '\ \テストデータ\\ pic2.jpg ' 
                  'C:\\テストデータ\\ pic3.jpg'、 'C:\\テストデータ\\ pic4.jpg'、 'C:\\テストデータ\\ pic5.jpg'、
                  C' \\ TESTDATA \\ pic6.jpg」、 'C:\\ TESTDATA \\ pic7.jpg'、 'C:\\ TESTDATA \\ pic8.jpg' 
                 ])
pre_y = model.predict(pre_x)
インポートcatvsdogs。融点としてモーフィング
出力= put_prey(pre_y、リスト(mp.train_flow.class_indices.keys())) 印刷(出力)

003.png

一つだけで、次に正解率はあまり高くないようにだけ猫2で3、3匹の前に、ルックスと、最後の3つが中に方法はありません確認されていません。

おすすめ

転載: blog.51cto.com/14423403/2419998