资源算法Neuraltalk 2,基于PyTorch框架的生成图像内容的文本描述模型

Neuraltalk 2,基于PyTorch框架的生成图像内容的文本描述模型

2019-08-19 | |  340 |   0 |   0

ImageCaptioning.pytorch

这是PyTorch中的图像字幕代码库。如果你熟悉neuraltalk2,这里有与neuraltalk2相比的差异。- 我们使用karpathy的train-val-test拆分而不是使用随机拆分 - 我们使用预处理的功能,而不是将模型包含在模型中。(微调cnn版本在分支with_finetune中) - 使用resnet而不是vgg; 特征提取方法与自我关键相同:在原始图像上运行cnn并自适应地平均将最后一个转换层特征池合并到固定大小。 - 更多模型(你可以查看模型文件夹)。最新的自上而下模型可以在Karpathy的测试分割中获得1.07 Cider评分,光束大小为5。

要求

Python 2.7(因为没有python 3的coco-caption版本)PyTorch 0.2(以及torchvision)

您需要为培训和评估下载预训练的resnet模型。这些模型可以从这里下载,并应放入data/imagenet_weights

预训练模型

这里提供预训练模型并且在这个问题上将保持每个模型的性能

如果您只想进行评估,则可以在下载预训练模型后按照本节进行操作。

在COCO上培训自己的网络

下载COCO数据集和预处理

首先,从链接下载可可图像我们需要2014年培训图像和2014年val。图片。您应该将train2014/val2014/放在同一目录中,表示为$IMAGE_ROOT

从Karpathy的主页链接下载预处理的可可字幕dataset_coco.json从zip文件中提取并将其复制到data/此文件提供预处理的标题以及标准的train-val-test拆分。

一旦我们有了这些,我们现在可以调用prepro_*.py脚本,它将读取所有这些并创建一个数据集(两个功能文件夹,一个hdf5标签文件和一个json文件)。

$ python scripts/prepro_labels.py --input_json data/dataset_coco.json --output_json data/cocotalk.json --output_h5 data/cocotalk$ python scripts/prepro_feats.py --input_json data/dataset_coco.json --output_dir data/cocotalk --images_root $IMAGE_ROOT

prepro_labels.py将所有出现<= 5次的单词映射到特殊UNK标记,并为所有剩余单词创建词汇表。将图像信息和词汇表转储到其中,data/cocotalk.json并将离散化的字幕数据转储到其中data/cocotalk_label.h5

prepro_feats.py提取每个图像的resnet101功能(fc功能和最后一个功能)。这些功能保存在data/cocotalk_fc和中data/cocotalk_att,结果文件大约为200GB。

(检查prepro脚本以获取更多选项,例如其他resnet模型或其他注意力大小。)

遗留问题:之前我们为每个图像将功能提取到单独的npy / npz文件中,但是在某些NFS上加载它们并且复制它们会更慢。我们现在保存h5文件中的所有功能。如果要将先前的npy / npz文件转换为h5文件,可以使用run

$ python scripts/convert_old.py --input_json data/dataset_coco.json --fc_input_dir data/cocotalk_fc/ --att_input_dir data/cocotalk_att/ --fc_output_dir data/cocotalk_fc --att_output_dir data/cocotalk_att/

警告:prepro脚本将失败并显示默认的MSCOCO数据,因为其中一个图像已损坏。请参阅此问题以获取修复,它涉及手动替换数据集中的一个图像。

开始训练

$ python train.py --id st --caption_model show_tell --input_json data/cocotalk.json --input_fc_dir data/cocotalk_fc --input_att_dir data/cocotalk_att --input_label_h5 data/cocotalk_label.h5 --batch_size 10 --learning_rate 5e-4 --learning_rate_decay_start 0 --scheduled_sampling_start 0 --checkpoint_path log_st --save_checkpoint_every 6000 --val_images_use 5000 --max_epochs 25

列车脚本将检查点转储到--checkpoint_path(default = save/指定的文件夹中我们只保存最佳性能检查点和最新检查点以节省磁盘空间。

恢复训练,你可以指定--start_from选项是路径保存infos.pklmodel.pth(通常你可以只设置--start_from--checkpoint_path是相同的)。

如果您有tensorflow,则会自动将丢失历史记录转储到其中--checkpoint_path,并且可以使用tensorboard进行可视化。

当前命令使用预定采样,您还可以将scheduled_sampling_start设置为-1以关闭预定采样。

如果你想在训练期间评估BLEU / METEOR / CIDEr分数以及验证交叉熵损失,请使用--language_eval 1选项,但不要忘记将coco-caption代码下载coco-caption目录中。

有关更多选项,请参阅opts.py

关于培训的一些注意事项。为了给您一个想法,使用默认设置,MS COCO图像的一个时期大约是11000次迭代。经过1个时期的训练导致验证损失~2.5和CIDEr得分为~0.68。通过迭代,60,000 CIDEr上升至约0.84(验证损失约为2.4(在预定的采样下))。

生成图像标题

评估原始图像

现在将您感兴趣的所有图像放入一个文件夹中,例如blah,运行eval脚本:

$ python eval.py --model model.pth --infos_path infos.pkl --image_folder blah --num_images 10

这告诉eval脚本最多可以从给定文件夹中运行10个图像。如果你有一个大GPU,你可以通过增加来加速评估batch_size使用--num_images -1来处理所有图像。eval脚本将在vis.json文件vis夹中创建一个文件,然后可以使用提供的HTML界面显示文件:

$ cd vis$ python -m SimpleHTTPServer

现在访问localhost:8000您的浏览器,您应该看到预测的字幕。

评估Karpathy的测试分裂

$ python eval.py --dump_images 0 --num_images 5000 --model model.pth --infos_path infos.pkl --language_eval 1

要评估的defualt分裂是测试。默认的推理方法是贪心解码(--sample_max 1),从后验,集合中进行采样--sample_max 0

光束搜索波束搜索可以将搜索贪婪解码序列的性能提高约5%。但是,这有点贵。要打开波束搜索,请使用--beam_size N,N应大于1。

杂记

使用cpu该代码目前默认使用gpu; 甚至没有切换选项。如果有人非常需要cpu模型,请打开一个问题; 我可以创建一个cpu检查点并修改eval.py以在cpu上运行模型。但是,使用cpu训练模型毫无意义。

训练其他数据集如果您可以创建类似于dataset_coco.json您自己的数据集的文件,那么移植应该是微不足道的

现场演示现在不支持。欢迎拉请求。

参考

如果您发现此实施有用,请考虑引用此回购:

@misc{Luo2017,author = {Ruotian Luo},title = {An Image Captioning codebase in PyTorch},year = {2017},publisher = {GitHub},journal = {GitHub repository},howpublished = {url{https://github.com/ruotianluo/ImageCaptioning.pytorch}},}

当然,请引用您正在使用的模型的原始论文(您可以在模型文件中找到参考文献)。

致谢

感谢原始的neurtalk2和令人敬畏的PyTorch团队。

上一篇:唇读

下一篇:深度强化学习的异步方法集

用户评价
全部评价

热门资源

  • Keras-ResNeXt

    Keras ResNeXt Implementation of ResNeXt models...

  • seetafaceJNI

    项目介绍 基于中科院seetaface2进行封装的JAVA...

  • spark-corenlp

    This package wraps Stanford CoreNLP annotators ...

  • capsnet-with-caps...

    CapsNet with capsule-wise convolution Project ...

  • inferno-boilerplate

    This is a very basic boilerplate example for pe...