Tencent/tencent-ml-images说明
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
数据
下载
- train_urls.txt https://pan.baidu.com/s/1cx6n6CYNqegKVq1O2YVCJg
- val_urls.txt https://pan.baidu.com/s/1BfipStD2PY7MAMRoZa9ecg
train_url.txt格式如下:
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。
- train_urls_and_index_from_imagenet.txt https://pan.baidu.com/s/145sGwH8Tv3RVwXZ95DuN4w
- val_urls_and_index_from_imagenet.txt https://pan.baidu.com/s/1p5sQrMUbfxiG94OjHj9-mQ
格式如下:
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中使用的图片,选按照如下两步:
- 从 http://image-net.org/download) 下载整个ImageNet数据库的原始图片,和关联URL文件 List of all image URLs of Fall 2011 Release (参考 http://image-net.org/download-imageurls))
- 利用 train_urls_and_index_from_imagenet.txt和val_urls_and_index_from_imagenet.txt 挑出用在 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
检查点
- ckpt-resnet101-mlimages(https://pan.baidu.com/s/1166673BNWuIeWxD7lf6RNA):在 ML-Images上预训练的
- ckpt-resnet101-mlimages-imagenet(https://pan.baidu.com/s/1UE7gavcVznYVA5NZ-GFAvg):在 ML-Images上预训练,且在 ImageNet (ILSVRC2012)上调优过的
下载上面的两个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
每行一张图片,一组该图片对应的特征。