Tencent/tencent-ml-images Readme说明


git地址: https://github.com/Tencent/tencent-ml-images/tree/297ee9fb1e4b4b3f72e97e183e4589bd0ee024c1

包括

  • ML-Images:最大的开源多标签图像数据集,包括17,609,752 训练和88,739 个验证URL,覆盖了11,166类别
  • ResNet-101模型:在ML-Images上训练得到,通过迁移学习在ImageNet上的top1准确率达到了 80.73%

更新

  • 提供了清晰的通过URL下载原始图片的说明
  • 单标签图像分类的demo:可以用提供的checkpoint来预测任何类型的图

依赖

  • Linux
  • Python2.7
  • Tensorflow >= 1.6.0

数据

下载

https://c4.staticflickr.com/8/7239/6997334729_e5fb3938b1_o.jpg  3:1  5193:0.9  5851:0.9 9413:1 9416:1
https://c2.staticflickr.com/4/3035/3033882900_a9a4263c55_o.jpg  1053:0.8  1193:0.8  1379:0.8

URL 分类号:置信度
分类号从0开始,具体信息:https://github.com/Tencent/tencent-ml-images/blob/master/data/dictionary_and_semantic_hierarchy.txt

图片来源

图片URL来自ImageNet和Open Images

  • Part1:来自整个ImageNet数据库, 10,706,941训练, 50,000验证,覆盖 10,032 个分类
  • Part2:来自Open Images 6,902,811训练, 38,739验证,覆盖 1,134个唯一分类(一些其他的分类已经和ImagNet的分类进行了合并)
    最终,ML_Images包括 17,609,752训练, 88,739验证,覆盖 11,166分类

分类的语义层次

根据WordNet建立了 11,166 个分了ide语义层次。整个语义机构包括4个独立的树,根节点分别为thing, matter, object ,physical object and atmospheric phenomenon.从根节点到叶子节点最长语义路径为16, 平均长度为7.47.

标注

由于ML_Image的URL来自Image net 和Open Images, ML-Images 的标记基于以上两个库。Open Image的原始标记由谷歌授权 under CC BY-4.0.
所以,使用一下步骤构建新的 ML-Images.标注

  • 来自OpenImages的 6,902,811训练URL,清除了保留的 1,134 分类之外的标签
  • 根据构建的 11,166 分类的语义树,根据祖先类增加 ML-Images中所有图片的标注:如果一个URL被标注为i类,那么所有i类的祖先分类也被标注于这个URL
  • 使用来自OpenImages的 6,902,811 个训练URL和1134个输出训练了一个ResNet-101模型。使用这个模型,对来自ImageNet的 10,756,941个但标注图片进行预测打标。所以,使用来自ImageNet的 10,032 categories分类和来自OpenImages的 1,134个分类得到了一个归一化共生矩阵。我们可以确定强共现类对。例如,类别i和类别j是强共生的,那么如果如果一张图片被标注为i类,那么也将被标注为j类。

ML_Images中所有URL的标注结果存入了train_urls.txt和val_urls.txt

统计

在这里插入图片描述
Trainable class为超过100张训练图片的类

每个类的图片数和训练集中标注数量的额柱状图如下表:
在这里插入图片描述

训练

下载图片URL

完整的 train_urls.txt 非常大, 使用小文件 train_urls_tiny.txt 显示下下载流程

cd data
./download_urls_multithreading.sh

生成子文件夹 data/images 来存放下载的jpeg图片, rain_im_list_tiny.txt保存了图片列表和对应的标注

怎么样处理下载中的无效URL?

对于ImageNet的URL
train_urls.txt文件的前 10,706,941行和 val_urls.txt文件的前 50,000 行是来自ImageNet的图片。这些URL很大一部分已经过期。但ImageNet网站提供了原始图片(参考 http://image-net.org/download)也就是每张图片ID和原始URL的对应关系。因此,我们提供了两个新文件,用来告知我们数据库中每个URL的image ID,包括 train_urls_and_index_from_imagenet.txt和 val_urls_and_index_from_imagenet.txt。

n03874293_7679  http://image24.webshots.com/24/5/62/52/2807562520031003846EfpYGc_fs.jpg 2964:1  2944:1  2913:1  2896:1  2577:1  1833:1  1054:1  1041:1  865:1  2:1
n03580845_3376  http://i02.c.aliimg.com/img/offer/22/85/63/27/9/228563279  3618:1  3604:1  1835:1  1054:1  1041:1  865:1  2:1

每一行,第一列是ImageNet中的image ID,,其他列是对应的URL和标注。然后,获得在 ML-Images中使用的图片,选按照如下两步:

对于来自OpenImages的URL

train_urls.txt的后 6,902,811 行和val——urls.txt的后 38,739 行是来自OpenImage的,这些URL多数是有效的,可以直接使用提供的 download_urls_multithreading.sh脚本进行下载。

准备TFRecord文件

用多线程模块来生成tfrecords。首先切分 train_im_list_tiny.txt成多个小文件,然后保存他们到子文件夹 data/image_lists/

cd data
../tfrecord.sh

多个tfrecords(命名为 x.tfrecords)会保存到 data/tfrecords/

ML_Images预训练

训练前,需要把训练和验证的 tfrecords分别移到 data/ml-images/train和 data/ml-images/val。然后,

./example/train.sh

注意:我们这里只提供了单节点单GPU框架的训练代码,但我们真实的ML-Image是基于一个内部的分布式框架(未发布)。你可以按照 distributed tensorFlow.修改训练代码伪分布式框架

在ImageNet的调优

首先要下载ImageNet( ILSVRC2012)数据库,并按照 tfrecord.sh.转为tfrecord文件。然后,你可以使用在ML-Images上预训练的checkpoint来调优在Imagenet的模型ResNet-101

./example/finetune.sh

检查点

下载上面的两个checkpoint并把他们放在 checkpoints/目录下,可以用他们来抽取特征。

单标签图像分类

这里我们提供了一个单标签图像分类的demo,使用的是 ckpt-resnet101-mlimages-imagenet 检查点的

./example/image_classification.sh

预测结果保存到了 label_pred.txt。如果想识别其他图片,可以修改 data/im_list_for_classification.txt 文件来包含这些图片的路径。

特征抽取

./example/extract_feature.sh

结果

不同checkpoint的 ResNet-101在 ImageNet (ILSVRC2012)验证集上的结果总结如下表:
在这里插入图片描述
注意:

  • 非特殊情况,训练或调优的图片大小为224*224
  • 在ImageNet上的调优从224到299的意思是前期调优迭代中的图片大小是224224, 后期迭代为299299
  • Top-1 acc on Val 224 表示在224*224验证图片上的top1准确率

试用

已下载模型:
/home/tencent-ml
ckpt-resnet101-mlimages-imagenet.zip和ckpt-resnet101-mlimages.zip

解压到:/home/tencent-ml/tencent-ml-images-master/checkpoints下

  • 单标签图像分类
    这里我们提供了一个单标签图像分类的demo,使用的是 ckpt-resnet101-mlimages-imagenet 检查点的
./example/image_classification.sh 内容如下,修改相应的模型路径,并删除image_classification.py文件开头的注释,否则会报错:
python2.7 image_classification.py \
 --images=data/im_list_for_classification.txt \
 --top_k_pred=5 \ --model_dir=checkpoints/ckpt-resnet101-mlimages-imagenet/resnet.ckpt \
 --dictionary=data/imagenet2012_dictionary.txt

预测结果保存到了 label_pred.txt。内容如下:
在这里插入图片描述
如果想识别其他图片,可以修改 data/im_list_for_classification.txt 文件来包含这些图片的路径。

  • 特征抽取
./example/extract_feature.sh
# 修改相关参数
# 删除extract_feature.py文件开头的注释部分,否则会报错
#!/usr/bin/bash
set -x

PYTHON=python
RESNET=101
DATA_FORMAT='NCHW'
GPUID=0
CKPT="./checkpoints/ckpt-resnet101-mlimages-imagenet/resnet.ckpt"

$PYTHON extract_feature.py \
  --resnet_size=$RESNET \
  --data_format=$DATA_FORMAT \
  --visiable_gpu=${GPUID} \
  --pretrain_ckpt=$CKPT \
  --result=test.txt \
  --images=data/im_list_for_classification.txt

此外还需修改extract_feature.py文件中94行:
ffeat.write(sp[0] + “\t” + sp[1] + “\t” + " ".join([str(x) for x in list(feats)]) + ‘\n’)为
ffeat.write(sp[0] + “\t” + " ".join([str(x) for x in list(feats)]) + ‘\n’)
否则会报数组越界错误
运行后,生成结果文件test.txt
在这里插入图片描述

每行一张图片,一组该图片对应的特征。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值