**文書の過去の版を表示しています。**
kerasを使ってvgg16の転移学習
m208.sにはGTX1050のGPUがついているので、まずはm208.sにsshでログインする
sudo docker pull nvidia/cuda:9.0-cudnn7-devel sudo docker run --runtime=nvidia --name yoshitake03 -it nvidia/cuda:9.0-cudnn7-devel /bin/bash #yoshitake03は適当に変える apt-get update apt install -y ssh python3-pip nano git unzip screen eog echo "termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l' defscrollback 100000 screen /bin/bash" > ~/.screenrc python3 -m pip install --upgrade pip python3 -m pip install keras python3 -m pip install tensorflow-gpu python3 -m pip install ipython python3 -m pip install opencv-python python3 -m pip install tqdm python3 -m pip install Pillow python3 -m pip install matplotlib apt install -y libglib2.0 libsm6 libxext6 libfontconfig1 libxrender1 python3-tk なんとかlibcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb とlibcudnn7_7.0.5.15-1+cuda9.0_amd64.debをコピーしてくる。 dpkg -i libcudnn7* もし途中でdockerを抜けていて、再開したいときは sudo docker start -i yoshitake03 byte形式の画像データの確認方法 od -An -v -tu1 -j16 -w28 train-images-idx3-ubyte |more
下記のフォルダを作り、その中にさらにカテゴリごとにフォルダを作り画像を入れておく。(例:犬の写真の場合、ディレクトリtrain/dogを作り、その中にdog01.jpg, dog02.jpg, … をコピーする。)
train, validate, test
学習用のpythonスクリプト
実行する場合、python3 jiseki-vgg16.pyなどとする
from keras.models import Model from keras.layers import Dense, GlobalAveragePooling2D,Input, Flatten, Activation, Dropout from keras.applications.vgg16 import VGG16 from keras.preprocessing.image import ImageDataGenerator from keras.optimizers import SGD from keras.models import Sequential from keras.callbacks import CSVLogger n_categories=132 batch_size=32 train_dir='jiseki/train' validation_dir='jiseki/validation' file_name='jiseki_vgg16' base_model=VGG16(weights='imagenet',include_top=False, input_tensor=Input(shape=(224,224,3))) #add new layers instead of FC networks x=base_model.output #x=GlobalAveragePooling2D()(x) x=Flatten()(x) x=Dense(1024,activation='relu')(x) prediction=Dense(n_categories,activation='softmax')(x) model=Model(inputs=base_model.input,outputs=prediction) #top_model = Sequential() #top_model.add(Flatten(input_shape=base_model.output_shape[1:])) #top_model.add(Dense(256)) #top_model.add(Activation("relu")) #top_model.add(Dropout(0.5)) #top_model.add(Dense(n_categories)) #top_model.add(Activation("softmax")) #model = Model(input=base_model.input, output=top_model(base_model.output)) #fix weights before VGG16 14layers for layer in base_model.layers[:15]: layer.trainable=False #model.compile(optimizer=SGD(lr=0.0001,momentum=0.9), # loss='categorical_crossentropy', # metrics=['accuracy']) model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True), metrics=['accuracy']) model.summary() #save model json_string=model.to_json() open(file_name+'.json','w').write(json_string) train_datagen=ImageDataGenerator( rescale=1.0/255, rotation_range=180, # width_shift_range=0.1, height_shift_range=0.1, # shear_range=0.2, # zoom_range=0.2, horizontal_flip=True) validation_datagen=ImageDataGenerator(rescale=1.0/255) train_generator=train_datagen.flow_from_directory( train_dir, target_size=(224,224), batch_size=batch_size, class_mode='categorical', shuffle=True ) validation_generator=validation_datagen.flow_from_directory( validation_dir, target_size=(224,224), batch_size=batch_size, class_mode='categorical', shuffle=True ) hist=model.fit_generator(train_generator, epochs=500, verbose=1, validation_data=validation_generator, callbacks=[CSVLogger(file_name+'.csv')]) #save weights model.save(file_name+'.h5')
判定用のスクリプト
使用方法は
python3 jiseki_predict.py xxx.jpg
from keras.models import model_from_json import matplotlib.pyplot as plt import numpy as np import os,random from keras.preprocessing.image import img_to_array, load_img from keras.preprocessing.image import ImageDataGenerator from keras.optimizers import SGD import sys batch_size=32 file_name='jiseki_vgg16' test_dir='jiseki/test' display_dir='jiseki/display' label=['Albulidae-Albula','Albulidae-Pterothrissus','Alepocephalidae-Alepocephalus','Alepocephalidae-Xenodermichthys','Anguillidae-Anguilla','Antennariidae-Antennarius','Antennariidae-His trio','Argentinidae-Argentina','Argentinidae-Glossanodon','Ariidae-Arius','Ariidae-Netuma','Ariidae-Plicofollis','Ateleopodidae-Ateleopus','Ateleopodidae-Ijimaia','Atherinidae-Atherinomor us','Atherinidae-Hypoatherina','Aulopidae-Hime','Bagridae-Pseudobagrus','Bregmacerotidae-Bregmaceros','Carapidae-Pyramodon','Chanidae-Chanos','Chaunacidae-Chaunax','Chlorophthalmidae-Chlo rophthalmus','Clupeidae-Amblygaster','Clupeidae-Etrumeus','Clupeidae-Herklotsichthys','Clupeidae-Nematalosa','Clupeidae-Sardinella','Congridae-Bathymyrus','Congridae-Conger','Congridae-Ma crocephenchelys','Congridae-Rhynchoconger','Congridae-Uroconger','Cyprinidae-Acrossocheilus','Cyprinidae-Aristichthys','Cyprinidae-Candidia','Cyprinidae-Carassius','Cyprinidae-Chanodichth ys','Cyprinidae-Clarias','Cyprinidae-Culter','Cyprinidae-Cyprinus','Cyprinidae-Gobiobotia','Cyprinidae-Hemiculter','Cyprinidae-Hypsibarbus','Cyprinidae-Mylopharyngodon','Cyprinidae-Onycho stoma','Cyprinidae-Opsariichthys','Cyprinidae-Pseudorasbora','Cyprinidae-Puntius','Cyprinidae-Rhodeus','Cyprinidae-Spinibarbus','Cyprinidae-Tanakia','Elopidae-Elops','Engraulidae-Engrauli s','Engraulidae-Setipinna','Engraulidae-Stolephorus','Engraulidae-Thryssa','Exocoetidae-Cheilopogon','Exocoetidae-Cypselurus','Exocoetidae-Exocoetus','Exocoetidae-Hirundichthys','Exocoeti dae-Oxyporhamphus','Gigantactinidae-Gigantactis','Gonorynchidae-Gonorynchus','Gonostomatidae-Gonostoma','Gonostomatidae-Sigmops','Lophiidae-Lophiodes','Lophiidae-Lophiomus','Lophiidae-Lop hius','Lophotidae-Lophotus','Macrouridae-Coelorinchus','Macrouridae-Coelorinclus','Macrouridae-Coryphaenoides','Macrouridae-Hymenocephalus','Macrouridae-Lucigadus','Macrouridae-Malacoceph alus','Macrouridae-Nezumia','Macrouridae-Ventrifossa','Megalopidae-Megalops','Melanocetidae-Melanocetus','Moridae-Gadella','Moridae-Laemonema','Moridae-Physiculus','Moringuidae-Moringua', 'Mugilidae-Chelon','Mugilidae-Moolgarda','Mugilidae-Mugil','Muraenesocidae-Gavialiceps','Muraenesocidae-Muraenesox','Muraenidae-Echidna','Muraenidae-Enchelycore','Muraenidae-Gymmothorax', 'Myctophidae-Benthosema','Myctophidae-Diaphus','Myctophidae-Electrona','Myctophidae-Myctophum','Nemichthyidae-Nemichthys','Neoscopelidae-Neoscopelus','Notacanthidae-Notacanthus','Ogcoceph alildae-Halieutaea','Ogcocephalildae-Malthopsis','Ogcocephalildae-Solocisquama','Ophidiidae-Glyptophidium','Ophidiidae-Hoplobrotula','Ophidiidae-Neobythites','Ophidiidae-Ophidion','Osmeri dae-Plecoglossus','Paralepididae-Lestidium','Paralepididae-Lestrolepis','Plotosidae-Plotosus','Polymixiidae-Polymixia','Pristigasteridae-Ilisha','Regalecidae-Regalecus','Salmonidae-Oncorh ynchus','Sternoptychidae-Argyropelecus','Sternoptychidae-Maurolicus','Sternoptychidae-Polyipnus','Stomiidae-Astronesthes','Stomiidae-Chauliodus','Stomiidae-Photonectes','Stomiidae-Stomias ','Synaphobranchidae-Dysomma','Synaphobranchidae-Echelus','Synaphobranchidae-Meadia','Synaphobranchidae-Neenchelys','Synaphobranchidae-Ophichthus','Synaphobranchidae-Pisodonophis','Synodo ntidae-Harpadon','Synodontidae-Saurida','Synodontidae-Synodus','Synodontidae-Trachinocephalus','Trachipteridae-Trachipterus'] #load model and weights json_string=open(file_name+'.json').read() model=model_from_json(json_string) model.load_weights(file_name+'.h5') model.compile(optimizer=SGD(lr=0.0001,momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy']) #data generate test_datagen=ImageDataGenerator(rescale=1.0/255) #test_generator=test_datagen.flow_from_directory( # test_dir, # target_size=(224,224), # batch_size=batch_size, # class_mode='categorical', # shuffle=True #) #evaluate model #score=model.evaluate_generator(test_generator) #print('\n test loss:',score[0]) #print('\n test_acc:',score[1]) #predict model and display images #files=os.listdir(display_dir) #img=random.sample(files,2) for i in sys.argv[1:] : temp_img=load_img(sys.argv[1],target_size=(224,224)) # plt.imshow(temp_img) temp_img_array=img_to_array(temp_img) temp_img_array=temp_img_array.astype('float32')/255.0 temp_img_array=temp_img_array.reshape((1,224,224,3)) img_pred=model.predict(temp_img_array) print(i+": "+label[np.argmax(img_pred)]) temp_res_list={} k=0 for j in img_pred[0]: temp_res_list[k]=j k=k+1 temp_res_sort=sorted(temp_res_list.items(), key=lambda x:x[1], reverse=True) print("1: "+label[temp_res_sort[0][0]]+" "+str(temp_res_sort[0][1])) print("2: "+label[temp_res_sort[1][0]]+" "+str(temp_res_sort[1][1])) print("3: "+label[temp_res_sort[2][0]]+" "+str(temp_res_sort[2][1])) print("4: "+label[temp_res_sort[3][0]]+" "+str(temp_res_sort[3][1])) print("5: "+label[temp_res_sort[4][0]]+" "+str(temp_res_sort[4][1])) del temp_img del img_pred