第一步,下载自己的数据集,数据集的格式要符合,否则对后面转化为TFRecords格式的文件有影响,导致不成功。
第二步,转换数据集为TFRecords格式的文件
进入下载以后的文件夹中/models/research/slim/
,使用pycharm打开slim文件夹,打开转换格式的文件download_and_convert_data.py
,只有cifar10、flowers、mnist
这几种下载和转换的文件,为了转换自己的数据集,这里在文件夹datasets中复制粘贴download_and_convert_flowers.py
文件,得到副本download_and_convert_flowers
– 副本.py文件,将副本重命名为download_and_convert_dogs.py
然后download_and_convert_data.py
引入库文件
from datasets import download_and_convert_dogs
在main
函数中新增
elif FLAGS.dataset_name =='dogs':
download_and_convert_dogs.run(FLAGS.dataset_dir)
文件download_and_convert_flowers.py
就配置好的
接着配置download_and_convert_dogs.py
文件,由于数据集已经下载好的,不需要重复下载,这里注释掉run
函数中下载数据集的代码:
将文件中的字符flowers
全部替换为dogs
然后将函数 _get_filenames_and_classes
中的
flower_root = os.path.join(dataset_dir, 'flower_photos')
改为flower_root = os.path.join(dataset_dir, 'Images')
修改验证集图片的数量 _NUM_VALIDATION = 350
为 NUM_VALIDATION = 2100
(如果第一步已经修改,这一步可以跳过)修改函数get_dataset_filename
中的:
output_filename = 'flowers_%s_%05d-of-%05d.tfrecord'
为 output_filename = 'dogs_%s_%05d-of-%05d.tfrecord'
如果不需要生成TFRecords文件以后,图片数据集被删除,需要注释掉:
clean_up_temporary_files(dataset_dir)
谨记:
slim/datasets/datasets/dataset_utils.py
中
LABELS_FILENAME
时设置生成的lable.txt标签的位置
download_and_convert_dogs.py
中
_NUM_SHARDS
是设置生成的tfrecord的每一类的个数
生成TFRecords文件:
python download_and_convert_data.py --dataset_name=dogs –dataset_dir=~/桌面/data2
训练:
主文件就是train_image_classifier.py
,查看dataset_name
变量,dataset_factory.py
的文件中字典datasets_map
只有cifar10、flowers、imagenet、mnist
这四种数据集处理方式,训练我们自己的数据集就需要新增数据处理方式,这里在字典中添加新的item,'dogs':dogs
由于每个value都是一个py文件,所以需要在datasets文件夹中新建dogs.py文件,这里的做法是复制粘贴datasets文件夹中的flowers.py文件,得到副本flowers – 副本.py然后重命名为dogs.py
dataset_factory.py
引入库文件
from datasets import dogs
打开dogs.py
文件进行相应的修改:
将文件中的字符flowers
全部替换为dogs
,这样就修改_FILE_PATTERN
= 'flowers_%s_*.tfrecord'为_FILE_PATTERN = 'dogs_%s_*.tfrecord'
修改训练集和验证集的图片数量 SPLITS_TO_SIZES = {'train': 19000, 'validation': 2100}
修改类目数量 _NUM_CLASSES = 120
修改_ITEMS_TO_DESCRIPTIONS = { 'image': 'A color image of varying size.', 'label': 'A single integer between 0 and 122', }
修改get_split
函数中的图片解析格式’image/format'
: tf.FixedLenFeature((), tf.string, default_value='png')
修改为:'image/format': tf.FixedLenFeature((), tf.string, default_value='jpg')
运行命令开始训练网络:
python train_image_classifier.py \
--train_dir=./model/inception_v4_model \ #训练过程中用于保存ckpt、index、meta文件的目录
--dataset_name=dogs
--dataset_split_name=train
--dataset_dir=~/桌面/data \ #存放TFRecords文件的目录
--model_name=inception_v4 \ #网络的名称
--checkpoint_path=/home/lf/桌面/inception_v4.ckpt \ #预训练权重文件
--checkpoint_exclude_scopes=InceptionV4/Logits,InceptionV4/AuxLogits/Aux_logits \
--trainable_scopes=InceptionV4/Logits,InceptionV4/AuxLogits/Aux_logits \
--clone_on_cpu=False \
--max_number_of_steps=10000 \
--batch_size=50 \
--learning_rate=0.01 \
谨记:
resnet_v1_50是
--checkpoint_exclude_scopes=resnet_v1_50/logits \
--trainable_scopes=resnet_v1_50/logits \
tensorboard可视化
关于tensorboard的作用可查看tensorflow官网。
https://blog.csdn.net/jinlong_xu/article/details/71124589这篇文章中详细介绍了tensorboard的启动方法。
但是在微调过程中可能需要查看原模型和新生成模的网络结构,详见这篇文章:https://blog.csdn.net/czq7511/article/details/72480149
测试训练集:
python -u eval_image_classifier.py \
--dataset_name=birds \
--dataset_dir=/home/wh/桌面/data2 \
--dataset_split_name=train \
--model_name=inception_v4 \
--checkpoint_path=/home/wh/桌面/data \
--eval_dir=/home/wh/桌面/my_eval \
--batch_size=32 \
--num_examples=1328
测试验证集:
python -u eval_image_classifier.py \
--dataset_name=birds \
--dataset_dir=/home/wh/桌面/data2 \
--dataset_split_name=validation \
--model_name=inception_v4 \
--checkpoint_path=/home/wh/桌面/data \
--eval_dir=/home/wh/桌面/my_validation \
--batch_size=32 \
--num_examples=1328
将文件转换成pb文件:
resnet_v1_50:
python -u export_inference_graph.py \
--model_name=resnet_v1_50 \
--output_file=/home/lf/桌面/data/resnet_v1_50.pb \
--dataset_name=birds \
--dataset_dir=/home/lf/桌面/data2/
freeze权重:
resnet_v1_50:
python -u /home/lf/anaconda3/lib/python3.6/site-packages/tensorflow/python/tools/freeze_graph.py \
--input_graph=/home/lf/桌面/data/resnet_v1_50.pb \
--input_checkpoint=/home/lf/桌面/data/model.ckpt-100000 \
--output_graph=/home/lf/桌面/data/model.ckpt-100000.pb \
--input_binary=True \
--output_node_name=resnet_v1_50/predictions/Softmax
inceprion_v4:
python -u /usr/local/lib/python2.7/dist-packages/tensorflow/python/tools/freeze_graph.py \
--input_graph=my_inception_v4.pb \
--input_checkpoint=/media/han/code/my_train/model.ckpt-1835 \
--output_graph=./my_inception_v4_freeze.pb \
--input_binary=True \
--output_node_name=InceptionV4/Logits/Predictions
参考文章:https://blog.csdn.net/shiheyingzhe/article/details/82291199
https://blog.csdn.net/shiheyingzhe/article/details/82284853