Exemple #1
0
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)
Exemple #2
0
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)