ディープラーニングで画像認識 実装(4)、keras CNNで、自前準備した画像の学習(2)
index:
概要
前回は、自前で準備した画像で、ImageDataGenerator flow_from_directory()
を使用して、学習用/ 評価用データを準備しましたが。
評価時の、正解率などが。よく把握できなかったので
画像読み込み処理を含めて、全面的に再作成しました。
今回も、画像データの学習に時間がかかったので
google colabを、使用させて頂きました。(作業pcと比較して、かなり高速でした)
環境
keras : 2.1.3
tensorflow : 1.4
python : 3.5.2
画像データ
フォルダ構成は、前回と同じ
data フォルダ下に配置
train : 学習用
validation : 検証用
を作成し、
各フォルダの下に、
各クラス単位のフォルダ、その下に、学習用の画像を配置
・前処理は、前回と同じ手法で
train 下に、水増し画像を多目に作成しておきます。
C:\tmp\2017_tmp\python35\tensorflow\img_data_test>tree data
フォルダー パスの一覧: ボリューム Acer
ボリューム シリアル番号は 7221-E6BF です
C:\TMP\2017_TMP\PYTHON35\TENSORFLOW\IMG_DATA_TEST\DATA
├─train
│ ├─bird
│ ├─cat
│ ├─dog
│ └─flower
└─validation
├─bird
├─cat
├─dog
└─flower
コード
https://github.com/kuc-arc-f/img_data_test2
・img_loader.py
data/train , validation の下層
のフォルダを、クラスとして生成し、
画像データは、numpy arrayに変換します。
・train.py
keras のNN で学習、
モデルで、ニューロン数は
入力: 128 * 128 * 3
隠れ層: 64
出力層: クラスの数
・エポック数は,30~40 で、
正解率は、95%以上まで上昇できました。
#モデルを構築 model=Sequential() model.add(Conv2D(32,(3,3),padding='same',input_shape=(128, 128,3))) model.add(Activation('relu')) model.add(Conv2D(32,(3,3),padding='same')) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(64,(3,3),padding='same')) model.add(Activation('relu')) model.add(Conv2D(64,(3,3),padding='same')) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense( num_classes ,activation='softmax')) model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy']) batch_size=32 epoch_num=20 #fit history=model.fit(x_train,y_train ,batch_size=batch_size ,nb_epoch=epoch_num ,verbose=1,validation_split=0.1)
・評価
predict.py
# モデルの評価 loss, acc = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', loss) print('Test acc:', acc) print("#end_acc")
実行ログ
・学習、エポック=30
((264, 128, 128, 3), (264,)) ((24, 128, 128, 3), (24,)) dog 24 /usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:70: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`. Train on 237 samples, validate on 27 samples Epoch 1/30 237/237 [==============================] - 3s 12ms/step - loss: 2.4715 - acc: 0.3291 - val_loss: 1.7619 - val_acc: 0.0000e+00 Epoch 2/30 237/237 [==============================] - 1s 4ms/step - loss: 1.2486 - acc: 0.4177 - val_loss: 1.3408 - val_acc: 0.0000e+00 Epoch 3/30 237/237 [==============================] - 1s 4ms/step - loss: 1.0142 - acc: 0.4852 - val_loss: 1.6289 - val_acc: 0.0741 Epoch 4/30 237/237 [==============================] - 1s 4ms/step - loss: 0.7425 - acc: 0.6667 - val_loss: 1.0257 - val_acc: 0.3333 Epoch 5/30 237/237 [==============================] - 1s 4ms/step - loss: 0.4779 - acc: 0.8354 - val_loss: 1.0483 - val_acc: 0.4815 Epoch 6/30 237/237 [==============================] - 1s 4ms/step - loss: 0.2758 - acc: 0.8945 - val_loss: 0.8937 - val_acc: 0.7037 Epoch 7/30 237/237 [==============================] - 1s 4ms/step - loss: 0.3764 - acc: 0.8354 - val_loss: 0.4036 - val_acc: 0.8519 Epoch 8/30 237/237 [==============================] - 1s 4ms/step - loss: 0.2776 - acc: 0.8903 - val_loss: 0.4373 - val_acc: 0.7778 Epoch 9/30 237/237 [==============================] - 1s 4ms/step - loss: 0.2141 - acc: 0.9367 - val_loss: 0.5481 - val_acc: 0.8148 Epoch 10/30 237/237 [==============================] - 1s 4ms/step - loss: 0.2487 - acc: 0.8987 - val_loss: 0.6807 - val_acc: 0.7778 Epoch 11/30 237/237 [==============================] - 1s 4ms/step - loss: 0.2253 - acc: 0.9030 - val_loss: 0.4038 - val_acc: 0.8148 Epoch 12/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0826 - acc: 0.9831 - val_loss: 0.8256 - val_acc: 0.7407 Epoch 13/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0598 - acc: 0.9747 - val_loss: 1.3040 - val_acc: 0.5556 Epoch 14/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0431 - acc: 0.9831 - val_loss: 0.6250 - val_acc: 0.7778 Epoch 15/30 237/237 [==============================] - 1s 4ms/step - loss: 0.3783 - acc: 0.8945 - val_loss: 2.8109 - val_acc: 0.1852 Epoch 16/30 237/237 [==============================] - 1s 4ms/step - loss: 0.3372 - acc: 0.9030 - val_loss: 0.4436 - val_acc: 0.8889 Epoch 17/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0945 - acc: 1.0000 - val_loss: 0.9048 - val_acc: 0.6296 Epoch 18/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0356 - acc: 0.9958 - val_loss: 0.5516 - val_acc: 0.7407 Epoch 19/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0263 - acc: 0.9916 - val_loss: 0.3969 - val_acc: 0.8148 Epoch 20/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0127 - acc: 0.9958 - val_loss: 0.5036 - val_acc: 0.8148 Epoch 21/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0073 - acc: 0.9958 - val_loss: 0.5929 - val_acc: 0.8148 Epoch 22/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0123 - acc: 0.9958 - val_loss: 0.5014 - val_acc: 0.8519 Epoch 23/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0783 - acc: 0.9958 - val_loss: 0.3049 - val_acc: 0.8889 Epoch 24/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0062 - acc: 1.0000 - val_loss: 0.7293 - val_acc: 0.8519 Epoch 25/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0058 - acc: 1.0000 - val_loss: 0.6191 - val_acc: 0.8148 Epoch 26/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0049 - acc: 1.0000 - val_loss: 0.4268 - val_acc: 0.8519 Epoch 27/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0056 - acc: 1.0000 - val_loss: 0.3985 - val_acc: 0.8889 Epoch 28/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0011 - acc: 1.0000 - val_loss: 0.5152 - val_acc: 0.8889 Epoch 29/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0714 - acc: 0.9958 - val_loss: 0.6255 - val_acc: 0.8519 Epoch 30/30 237/237 [==============================] - 1s 4ms/step - loss: 0.0013 - acc: 1.0000 - val_loss: 0.7043 - val_acc: 0.7778
・評価
正解: 約 95.83%
('Test loss:', 0.04905049502849579) ('Test acc:', 0.9583333134651184)
ディープラーニングで画像認識 実装(3)、keras で、CIFAR-10データの学習
index:
概要
前回は、自前で準備した画像の
keras で画像認識の学習、評価、を行いました。
mnist以外のデータで、CIFAR-10データ を試してみたいと思います
環境
keras : 2.1.3
tensorflow : 1.4
python : 3.5.2
画像データ
kerasの場合、cifar10関連の処理を読み込むと、
カンタンに、学習用データとしてロード可能でした。
下記の import
from keras.datasets import cifar10
50000 枚が学習用、残り 10000 枚が評価用
画素数 32x32 で RGB
・画像が小さく、画素数が少ない為。
種類によっては、人が見てもよく判別できない物もありそうです
・種類は、10種類で下記内容
airplane; 飛行機
automobile; 自動車
bird; 鳥
cat; 猫
deer; 鹿
dog; 犬
frog; 蛙
horse; 馬
ship; 船, 舟
truck; 大型トラック
コード
https://github.com/kuc-arc-f/img_CIFAR
・今回は、開発PCで処理時間が長くなりそうで、
google colabで、学習処理を行いました。
train_colab.py
・ データのロード
if __name__ == '__main__': #cifar10をダウンロード (x_train,y_train),(x_test,y_test)=cifar10.load_data() # print(x_train.shape, y_train.shape ) print(x_test.shape , y_test.shape ) #画像を0-1の範囲で正規化 x_train=x_train.astype('float32')/255.0 x_test=x_test.astype('float32')/255.0 #正解ラベルをOne-Hot表現に変換 y_train=np_utils.to_categorical(y_train,10) y_test=np_utils.to_categorical(y_test,10)
・学習の処理
batch_size=32 epoch_num=10 #fit history=model.fit(x_train,y_train ,batch_size=batch_size ,nb_epoch=epoch_num ,verbose=1,validation_split=0.1)
・ 実行ログ
Using TensorFlow backend. ((50000, 32, 32, 3), (50000, 1)) ((10000, 32, 32, 3), (10000, 1)) /usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:62: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`. Train on 45000 samples, validate on 5000 samples Epoch 1/10 45000/45000 [==============================] - 26s 578us/step - loss: 1.4947 - acc: 0.4553 - val_loss: 1.0340 - val_acc: 0.6320 Epoch 2/10 45000/45000 [==============================] - 22s 490us/step - loss: 1.0413 - acc: 0.6291 - val_loss: 0.8798 - val_acc: 0.6878 Epoch 3/10 45000/45000 [==============================] - 22s 495us/step - loss: 0.8964 - acc: 0.6855 - val_loss: 0.7888 - val_acc: 0.7224 Epoch 4/10 45000/45000 [==============================] - 22s 492us/step - loss: 0.8000 - acc: 0.7178 - val_loss: 0.7154 - val_acc: 0.7528 Epoch 5/10 45000/45000 [==============================] - 22s 489us/step - loss: 0.7319 - acc: 0.7452 - val_loss: 0.6705 - val_acc: 0.7704 Epoch 6/10 45000/45000 [==============================] - 22s 494us/step - loss: 0.6809 - acc: 0.7605 - val_loss: 0.6391 - val_acc: 0.7810 Epoch 7/10 45000/45000 [==============================] - 22s 490us/step - loss: 0.6376 - acc: 0.7781 - val_loss: 0.6564 - val_acc: 0.7762 Epoch 8/10 45000/45000 [==============================] - 22s 490us/step - loss: 0.6069 - acc: 0.7881 - val_loss: 0.6671 - val_acc: 0.7802 Epoch 9/10 45000/45000 [==============================] - 22s 496us/step - loss: 0.5759 - acc: 0.7948 - val_loss: 0.6474 - val_acc: 0.7846 Epoch 10/10 45000/45000 [==============================] - 22s 489us/step - loss: 0.5380 - acc: 0.8104 - val_loss: 0.6407 - val_acc: 0.7904 ('Test loss:', 0.6536725306987763) ('Test acc:', 0.7773)
評価の、正解率は、 約77%で、いまいちな結果に。
エポック数は、10で少なめです。(GPUでも、数分かかりましたが。)
精度をあげるには、エポック数を増やしたり、
他の、パラメータ変更の必用がありそうですが
試行錯誤したいと思います。
・保存済みの学習ファイル、モデルのロードと、
評価の処理
predict.py
=> 学習時に、保存したファイルをロード、その後に、評価
model_file = "cifar10_cnn.json" with open(model_file, 'r') as fp: model = model_from_json(fp.read()) model.load_weights("cifar10_cnn.h5") model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy']) # model.summary() # モデルの評価 loss, acc = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', loss) print('Test acc:', acc)
関連
KerasでCIFAR-10の一般物体認識
http://aidiary.hatenablog.com/entry/20161127/1480240182
http://kikei.github.io/ai/2018/03/25/cifer10-cnn1.html
cifar10とKerasを使ってCNN(Convolutional Neural Network)を実装してみる
https://qiita.com/God_KonaBanana/items/10fa8bb58cdd1dbd2e59
ディープラーニングで画像認識 実装(2)、画像の前処理
index:
概要
前回は、keras で画像認識の学習、検証(画像認識の判定結果出力)等、
一連の流れを記載しましたが。
ディープラーニングで画像認識で、認識精度を向上させる為に、
学習画像数を増やしたり、前処理での作業を追加する場合がありそうですので、
ImageDataGeneratorを使用して、前処理(画像の水増し)を実施する内容です
・水増し処理なしで、十分な画像を準備できて、
認識精度も予想値以上に、向上している場合は。
不要な処理になりそうですので、精度向上面等で必用な場合は参考頂ければ
と思います。
環境
keras : 2.1.3
tensorflow : 1.4
python : 3.5.2
コード
前回のpushに含まれていますが。
before_proc.py
https://github.com/kuc-arc-f/img_data_test/blob/master/before_proc.py
・ImageDataGenerator の定義、
元の画像の指定(水増しする元画像)
# datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') img = load_img('neko_13.jpg')
.flow を使用して、ループ処理
指定回数で、処理を抜けます
save_to_dir: 保存先のフォルダ
save_prefix: ヘッダ文字
# img_num = 20 i = 0 #for batch in datagen.flow(x, batch_size=1, # save_to_dir='preview', save_prefix='tori', save_format='jpg'): for batch in datagen.flow(x, batch_size=1, save_to_dir='data/train/cat', save_prefix='neko_13', save_format='jpg'): i += 1 if i > img_num: break
実行結果
水増し画像が追加されました。
前回の、画像の学習用データも。
同様の手法で作成した形となります
まとめ
上記の画像処理も、比較的カンタンに実装できて
kerase ImageDataGeneratorを使うと、前処理含めて
画像の学習処理ができそうです。
ディープラーニングで画像認識 実装、keras ImageDataGenerator
index:
概要
mnist 等のサンプル以外で、画像認識の実装テストを行いました。
条件として、自前の画像を準備(カメラ撮影、ネット検索等で取得)し、
ラベル情報を追加して、教師データとして。学習する実践編の形となります。
環境
keras : 2.1.3
tensorflow : 1.4
python : 3.5.2
処理の流れ
・学習
・学習結果、保存
・学習結果、ロード
・検証(predict)
=>画像認識(判定ラベルの出力)
前処理については、次回以降で記載したいと思います。
学習データの配置
data フォルダの下に、
train : 学習用
validation : 検証用
を作成し、
各フォルダの下に、
認識ラベル単位のフォルダ、その下に、学習用の画像を配置
C:\tmp\2017_tmp\python35\tensorflow\img_data_test>tree data
フォルダー パスの一覧: ボリューム Acer
ボリューム シリアル番号は 7221-E6BF です
C:\TMP\2017_TMP\PYTHON35\TENSORFLOW\IMG_DATA_TEST\DATA
├─train
│ ├─bird
│ ├─cat
│ ├─dog
│ └─flower
└─validation
├─bird
├─cat
├─dog
└─flower
ファイル一覧、の一部。
学習用(train)、cat (ネコ) 種類の画像を配置
その他の認識させたい、単位でフォルダを作成し
検証用も、同様に。配置します
C:\tmp\2017_tmp\python35\tensorflow\img_data_test>dir data\train\cat 2018/11/27 09:51 <DIR> . 2018/11/27 09:51 <DIR> .. 2018/11/26 15:46 29,476 cat_0_1.jpg 2018/11/26 15:46 24,597 cat_0_1016.jpg 2018/11/26 15:46 27,204 cat_0_1027.jpg 2018/11/26 15:46 25,610 cat_0_1213.jpg 2018/11/26 15:46 22,106 cat_0_1290.jpg 2018/11/26 15:46 25,508 cat_0_1396.jpg 2018/11/26 15:46 22,789 cat_0_1464.jpg 2018/11/26 15:46 24,569 cat_0_1548.jpg 2018/11/26 15:46 23,503 cat_0_1951.jpg 2018/11/26 15:46 28,274 cat_0_1960.jpg 2018/11/26 15:46 23,413 cat_0_1986.jpg 2018/11/26 15:46 27,176 cat_0_2018.jpg 2018/11/26 15:46 23,045 cat_0_2026.jpg 2018/11/26 15:46 27,157 cat_0_2090.jpg 2018/11/26 15:46 24,045 cat_0_2145.jpg 2018/11/26 15:46 23,925 cat_0_2208.jpg 2018/11/26 15:46 25,596 cat_0_2324.jpg 2018/11/26 15:46 23,728 cat_0_2454.jpg 2018/11/26 15:46 23,944 cat_0_2714.jpg 2018/11/26 15:46 26,649 cat_0_2750.jpg
実行方法
・ train.py
=> 学習処理、学習済みファイルの保存
・predict.py
=> 検証(画像判定)の処理、検証したい画像ファイルを指定します。
例: python predict.py ファイル名
説明など
・学習
ImageDataGenerator で、学習/検証 各フォルダの、画像リサイズ、
ラベル(class)を生成します
epochs 数は、適等に修正下さい。
flow_from_directory は、フォルダを指定すると、
学習に必用なデータに、変換してくれそうですので
便利でしたが。変換後の数値データ等が、カンタンに見れないようで
いまいち、不安が残りました。
class_mode='categorical' を指定すると、3種類以上のカテゴリにも
対応されるようです
train.py
batch_size = 32 epochs = 5 #epochs = 1 # #ImageDataGenerator train_datagen = ImageDataGenerator( rescale=1.0 / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1.0 / 255) # train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(128, 128), batch_size=batch_size, class_mode='categorical') label_dict = train_generator.class_indices print( label_dict ) num_categ =len(label_dict) # validation_generator = test_datagen.flow_from_directory( 'data/validation', target_size=(128, 128), batch_size=batch_size, class_mode='categorical')
・モデル作成、実行。結果の保存。
#model model_cls= Img_Model(num_categ) model= model_cls.get_model() model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) #fit history = model.fit_generator( train_generator, samples_per_epoch=800, nb_epoch=epochs, validation_data=validation_generator, nb_val_samples=200) model.save_weights('img_test.h5')
・ 検証
predict.py
学習済ファイルのロード、
モデルの コンパイル
・ predict で、検証。
numpy arrayが、出力され、各class (フォルダ単位の種類)
ごとの正解率が出力されますので、class を検索して出力します。
# model_cls= Img_Model(num_categ) model= model_cls.get_model() model.load_weights( 'img_test.h5') model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) pred = model.predict(x)[0]
ログ等
・検証の結果
neko_13.jpg で、ネコの画像を検証
class=cat
=> ネコの判定が、出力されました、(正解です)
python predict.py neko_13.jpg Using TensorFlow backend. neko_13.jpg Found 243 images belonging to 4 classes. {'cat': 1, 'dog': 2, 'bird': 0, 'flower': 3} 2018-11-27 17:04:02.157415: I C:\tf_jenkins\home\workspace\rel-win\M\windows\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:137] Your CPU compiled to use: AVX predict: [ 8.98553699e-05 9.68049169e-01 3.16024683e-02 2.58460728e-04] max= 0.968049 dict-value: 1 class=cat
・train の実行ログ
学習画像は、少なめですが。
エポック単位で、110秒ほど処理していますので
作業用のwinPCでは、画像の増加や、パラメータ変更を行う場合。
かなり処理時間が必用かもしれません。
カスタムテーマで色調を変更する。 Hexoで高速サイトを構築する(5)
概要
前回の、Hexo 静的サイトジェネレーターの関連となりますが、
カスタムテーマの色調を、変更しやすくできるように修正しました。
前回と同様、bootstrap3 + CSS3 でレスポンシブ構成ですが。
lessを使用、色のRGB値を変数に設定し。
一括して色の値を、変更できるように検討しました。
色は、マテリアルデザインの色を参考にしています。
lessc main.less main.css lessc main-sp.less main-sp.css
lessc (コンパイラ)で、CSS生成します
Less とか
参考
http://lesscss.org/
http://www.tohoho-web.com/ex/less.html
設定方法など
less ファイルに、色の各設定を記載しておきます。
マテリアルデザインの
メインカラー、サブカラー、アクセントカラーの、3色に対応してます。
@mycolor-main : #757575; @mycolor-sub : #9E9E9E; @mycolor-accent: #FF7043;
node.js テンプレートから、設定する色の CSSを読み込みます。
<%- css('css/main.css?A3') %> <link href="<%- config.root %>css/main-sp.css?A3" rel="stylesheet" media="screen and (max-width: 480px)">
generate して、サイトにコピーします。
デモなど
デモURLは、 github pages で公開しています。
blue:
url:
https://kuc-arc-f.github.io/hexo_5_blue/
カテゴリ:
green:
https://kuc-arc-f.github.io/hexo_5_green/categories/blog/
gray:
https://kuc-arc-f.github.io/hexo_5_gray/
紫:
https://kuc-arc-f.github.io/hexo_5_purple/
Github
修正版のテーマ公開しました。
https://github.com/kuc-arc-f/theme_ex5github.com
カスタムテーマを追加しました。サイドバー付 Hexoで高速サイトを構築する(4)
概要
前回の、Hexo 静的サイトジェネレーターの関連となりますが、
カスタムテーマを追加しました。
前回と同様、bootstrap3 + CSS3 でレスポンシブ構成
1) top画面サイドバー付、2カラムのレイアウト
2) 色調は、グレー系としました。
カスタムテーマ
github で公開しました。
github.com
カスタムテーマを更新しました。 Hexoで高速サイトを構築する(3)
概要
前回の、Hexo 静的サイトジェネレーターの関連となりますが、
カスタムテーマ更新版を公開しました。
前回と同様、bootstrap3 + CSS3 でレスポンシブ構成
1) 投稿(post)詳細の、サイドバー追加。レイアウト調整
2) カテゴリ一覧の、レイアウト調整