def main(): # 単語リスト words = {} # 単語を読み込む f = codecs.open("data\\caption-words.txt", "r", "utf-8") line = f.readline() while line: # 不要文字を削除し分割 l = line.strip().split(",") words[l[1]] = int(l[0]) # 次の行を読み込む line = f.readline() # クローズ処理 f.close() # 読込 s_w = codecs.open("data\\caption-wakati.txt", "r", "utf-8") s_i = codecs.open("data\\img_id.txt", "r", "utf-8") # 全ての画像ベクトルと説明文のセット sentence = [] # TODO:CaffeModel=>pickle化 # ReferenceError: weakly-referenced object no longer exists MODEL = "model\\bvlc_alexnet.caffemodel" # PICKLE = "model\\alex_net.pkl" # pickleを読込 # if os.path.exists(PICKLE): # # 存在する場合 # model = pickle.load(open(PICKLE, "rb")) # else: # # 存在しない場合 # if os.path.exists(MODEL): # CaffeModelをpickleに変換する # model = CaffeFunction(MODEL) # pickle.dump(model, open(PICKLE, "wb")) # model = pickle.load(open(PICKLE, "rb")) # else: # CaffeModelが存在しない場合は中断 # print("model notfound") # exit() model = CaffeFunction(MODEL) if uses_device >= 0: # GPUを使う chainer.cuda.get_device_from_id(0).use() chainer.cuda.check_cuda_available() model.to_gpu() # 1行ずつ処理を行う line = s_w.readline() img_id = s_i.readline() while line and img_id: # 行中の単語をリスト化 l = line.strip().split(" ") # ファイル名を作成 file_name = "image\\" + img_id.strip() + ".jpg" # デバッグ print(file_name) # ファイルの読込] img = Image.open(file_name).resize((400, 400)).convert("RGB") # 画像ベクトルの配列 vectors = [] # 4辺+中央で計5枚の画像を作る for s in [ (0, 0, 227, 227), # 左上 (173, 0, 400, 277), # 右上 (0, 173, 227, 400), # 左下 (173, 173, 400, 400), # 右下 (86, 86, 313, 313) # 中央 ]: # 画像から切り出し cropimg = img.crop(s) # 画素を数値データに変換 pix = np.array(cropimg, dtype=np.float32) pix = (pix[::-1]).transpose(2, 0, 1) x = cp.array([pix], dtype=cp.float32) # Debug print(x.ndim) print(x.shape) print(x.size) # TODO: Error fix # Expect: x.shape[1] == W.shape[1] # 読み込み2回目でエラー(左側が次元数おかしい) # Actual: 12288 != 9216 # fc6層のデータを抽出 e, = model(inputs={"data": x}, outputs=["fc6"], disable=["drop6"]) # 画像ベクトルの配列に結果を格納 vectors.append(e.data[0].copy()) # 数値の配列 lines = [0] # 単語を数値に変換 for x in l: if x in words: lines.append(words[x]) # 行が終わったところで終端文字を挿入 lines.append(1) sentence.append((vectors, lines)) # 次の行 line = s_w.readline() img_id = s_i.readline() # クローズ処理 s_w.close() s_i.close() # 最長の文 l_max = max([len(l[1]) for l in sentence]) # 文長を揃える(バッチ処理の関係) for i in range(len(sentence)): # 足りない長さは終端文字で埋める sentence[i][1].extend([1] * (l_max - len(sentence[i][1]))) # ニューラルネットワークの作成 model = ImageCaption_NN(max(words.values()) + 1, 500) if uses_device >= 0: model.to_gpu() # Optimizerを作成 optimizer = optimizers.Adam() optimizer.setup(model) # Iteratorを作成 train_iter = iterators.SerialIterator(sentence, batch_size, shuffle=False) updater = ImageCaptionUpdater(train_iter, optimizer, device=uses_device) trainer = training.Trainer(updater, (80, "epoch"), out="result") # 学習状況を可視化 trainer.extend(extensions.ProgressBar(update_interval=1)) # 学習実行 trainer.run() # 結果を保存する chainer.serializers.save_hdf5("result.hdf5", model)
def main(): #オプションの追加 parser = argparse.ArgumentParser(description='Chainer : C3D') parser.add_argument('--arch', '-a', default='ADAM', help='Convnet architecture') parser.add_argument('--batchsize', '-b', type=int, default=1, help='Number of images in each mini-batch') parser.add_argument('--epoch', '-e', type=int, default=100, help='Number of sweeps over the dataset to train') parser.add_argument('--gpu', '-g', type=int, default=0, help='GPU ID (negative value indicates CPU)') parser.add_argument('--out', '-o', default='../result/20171006', help='Directory to output the result') parser.add_argument('--resume', '-r', default='resume', help='Resume the training from snapshot') parser.add_argument('--unit', '-u', type=int, default=1000, help='Number of units') parser.add_argument('--input', '-i', default='../data/sample_videoset_171x128', help='Directory to input data') args = parser.parse_args() print('GPU: {}'.format(args.gpu)) print('# unit: {}'.format(args.unit)) print('# Minibatch-size: {}'.format(args.batchsize)) print('# epoch: {}'.format(args.epoch)) print('# input: {}'.format(args.input)) print('') #データセットの読み込み v = videoread.VideoRead() train, test = v.combine_data_label(args.input) #学習済みCaffeモデルの設定 model = CaffeFunction("c3d_resnet18_ucf101_r2_ft_iter_20000.caffemodel") #print (pre_model.shape) #model = c3dnet.C3D() if args.gpu >= 0: chainer.cuda.get_device(args.gpu).use() # Make a specified GPU current model.to_gpu() # Copy the model to the GPU #Setup an optimizer" optimizer = chainer.optimizers.MomentumSGD() optimizer.setup(model) "caffemodelへの入力の仕方" #models.layersでレイヤー一覧 #model(inputs={"data": np.zeros((8,128,171,3))}, outputs={"conv1"}) #make iterators" train_iter = chainer.iterators.SerialIterator(train, args.batchsize) test_iter = chainer.iterators.SerialIterator(test, args.batchsize, repeat=False, shuffle=False) #set up a trainer" updater = training.StandardUpdater(train_iter, optimizer, device=args.gpu) trainer = training.Trainer(updater, (args.epoch, 'epoch'), out=args.out) val_interval = (20), 'iteration' log_interval = (20), 'iteration' trainer.extend(extensions.Evaluator(test_iter, model, device=args.gpu)) trainer.extend(extensions.dump_graph('main/loss')) trainer.extend(extensions.snapshot(), trigger=val_interval) trainer.extend(extensions.snapshot_object( model, 'model_iter_{.updater.iteration}'), trigger=val_interval) trainer.extend(extensions.LogReport(trigger=log_interval)) trainer.extend(extensions.observe_lr(), trigger=log_interval) trainer.extend(extensions.PrintReport([ 'epoch', 'iteration', 'main/loss', 'validation/main/loss', 'main/accuracy', 'validation/main/accuracy', 'lr' ]), trigger=log_interval) #Progress barを表示 trainer.extend(extensions.ProgressBar()) #update_interval=10)) trainer.run() serializers.save_npz("mymodel.npz", model)