質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1916閲覧

kerasVGG16を使って全結合層の4096次元特徴量を抽出したい

sswaka

総合スコア16

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/08/02 07:33

前提・実現したいこと

http://testpy.hatenablog.com/entry/2017/07/22/195400
↑を参考に、Imagenetで学習済みのVGG16を使って、フォルダ内画像の特徴量を抽出したい。

発生している問題

_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_3 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 _________________________________________________________________ predictions (Dense) (None, 1000) 4097000 =================================================================

現在のコードでは上記modelのflatten層25088次元の特徴量を抽出していますが、全結合層(fc1)の4096次元の特徴量を抽出するにはどの部分を書き換えればいいか分からず詰まっています。

該当のソースコード

現在のコードは以下の通りです。
今の時点ではinclude_top=Falseとなっているため、feat=model.prediict(x)でflatten層の特徴量が抽出されています。
include_top=Trueにした後、fc1を指定して出力させる方法を教えていただきたいです。

python

1from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions 2from keras.layers import Dense, Dropout, Activation, Flatten 3from keras.preprocessing import image 4 5from sklearn.cluster import KMeans 6import numpy as np 7import pandas as pd 8import sys 9import cv2 10import os 11import shutil 12 13DATA_DIR = './' 14TARGET_IMAGES_DIR = './' 15CLUSTERED_IMAGES_DIR = './' 16IMAGE_LABEL_FILE = '.csv' 17 18class Image_Clustering: 19 def __init__ (self, n_clusters=3, video_file=None, image_file_temp='img.png', input_video=False): 20 self.n_clusters = n_clusters 21 self.video_file = video_file 22 self.image_file_temp = image_file_temp 23 self.input_video = input_video 24 25 def main(self): 26 if self.input_video == True: 27 self.video_2_frames() 28 self.label_images() 29 self.classify_images() 30 31 def label_images(self): 32 print('Label images...') 33 34 model = VGG16(weights='imagenet', include_top=False) 35 36 images = [f for f in os.listdir(TARGET_IMAGES_DIR) if f[-4:] in ['.jpg']] 37 assert(len(images)>0) 38 39 X = [] 40 for i in range(len(images)): 41 feat = self.__feature_extraction(model, TARGET_IMAGES_DIR + images[i]) 42 X.append(feat) 43 44 X = np.array(X) 45 np.save('features.npy',X) 46 kmeans = KMeans(n_clusters = self.n_clusters, random_state=0).fit(X) 47 print('') 48 print('labels:') 49 print(kmeans.labels_) 50 print('') 51 52 df = pd.DataFrame({'image': images, 'label': kmeans.labels_}) 53 df.to_csv(DATA_DIR+IMAGE_LABEL_FILE, index=False) 54 55 def __feature_extraction(self, model, img_path): 56 img = image.load_img(img_path, target_size=(224,224)) 57 x = image.img_to_array(img) 58 x = np.expand_dims(x, axis=0) 59 x = preprocess_input(x) 60 61 feat = model.predict(x) 62 feat = feat.flatten() 63 64 return feat 65 66 67 68 def classify_images(self): 69 print('Cllassify images...') 70 71 df = pd.read_csv(DATA_DIR+IMAGE_LABEL_FILE) 72 labels = list(set(df['label'].values)) 73 74 if os.path.exists(CLUSTERED_IMAGES_DIR): 75 shutil.rmtree(CLUSTERED_IMAGES_DIR) 76 77 for label in labels: 78 print('Copy and paste label %s images.' % label) 79 80 new_dir = CLUSTERED_IMAGES_DIR + str(label) +'/' 81 if not os.path.exists(new_dir): 82 os.makedirs(new_dir) 83 84 clustered_images = df[df['label']==label]['image'].values 85 for ci in clustered_images: 86 src = TARGET_IMAGES_DIR + ci 87 dst = CLUSTERED_IMAGES_DIR + str(label) + '/' +ci 88 shutil.copyfile(src, dst) 89 90if __name__ == "__main__": 91 Image_Clustering().main() 92

補足情報(FW/ツールのバージョンなど)

python2.7
keras2.2.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

イメージとしては、 「VGG modelと Inputは同じで、Outputはfc1」というModelを作れば良いと思います。

from keras.models import Model ... model = VGG16(weights='imagenet', include_top=True) new_model = Model(inputs=model.inputs, outputs=model.get_layer('fc1')) fc1_feat = new_model.predict(x)

みたいな感じでどうでしょうか。(実際に動作は確認せず書いてますが)。


■ 追記
あ、すみません、以下が正しいかもしれません。

new_model = Model(inputs=model.inputs, outputs=model.get_layer('fc1').output)

投稿2019/08/07 14:20

編集2019/08/07 15:22
mokemokechicken

総合スコア948

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sswaka

2019/08/08 06:59

追記の通りにModelを設定したら無事に求めたかった特徴量が抽出できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問