hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

图像识别模子

2019-11-18杂谈搜奇网23°c
A+ A-

一、数据预备

  起首要做一些数据预备方面的事情:一是把数据集切分为练习集和考证集, 二是转换为tfrecord 花样。在data_prepare/文件夹中供应了会用到的数据集和代码。起首要将本身的数据集切分为练习集和考证集,练习集用于练习模子, 考证集用来考证模子的准确率。这篇文章已供应了一个实验用的卫星图片分类数据集,这个数据集一共6个种别, 见下表所示

   

  在data_prepare目次中,有一个pic文件夹保存原始的图象文件,这内里有train 和validation 两个子目次,离别示意练习运用的图片和考证运用的图片。在每一个目次中,离别以种别号为文件夹名保存一切图象。在每一个种别文件夹下,寄存的就是原始的图象(如jpg 花样的图象文件)。下面在data_prepare 文件夹下,运用预先编制好的剧本data_convert .py,运用以下敕令将图片转换为为tfrecord花样。

python data_convert.py

  data_convert.py代码中的一些参数诠释为:

# -t pic/: 示意转换pic文件夹中的数据。pic文件夹中必需有一个train目次和一个validation目次,离别代表练习和考证数据集。
#–train-shards 2:将练习数据集分红两块,即末了的练习数据就是两个tfrecord花样的文件。假如本身的数据集较大,可以斟酌将其分为更多的数据块。
#–validation-shards 2: 将考证数据集分为两块。
#–num-threads 2:采纳两个线程发生数据。注重线程数必须要能整除train-shaeds和validation-shards,来保证每一个线程处置惩罚的数据块是雷同的。
#–dataset-name satellite: 给生成的数据集起一个名字。这里将数据集起名叫“satellite”,末了生成的头文件就是staellite_trian和satellite_validation。

  运转上述敕令后,就可以在pic文件夹中找到5个新生成的文件,离别是两个练习数据和两个考证数据,另有一个文本文件label.txt ,其示意图片的内部标签(数字)到实在种别(字符串)之间的映照递次。如图片在tfrecord 中的标签为0 ,那末就对应label.txt 第一行的种别,在tfrecord的标签为1,就对应label.txt 中第二行的种别,依此类推。
   

二、运用TensorFlow Slim微调模子

1、引见TensorFlow Slim源码

  TensorFlow Slim 是Google 公司宣布的一个图象分类工具包,它不仅定义了一些轻易的接口,还供应了许多ImageNet数据集上经常使用的收集构造和预练习模子。停止2017 年7 月, Slim 供应包括VGG16 、VGG19 、InceptionVl ~ V4, ResNet 50 、ResNet 101, MobileNet 在内大多数经常使用模子的构造以及预练习模子,更多的模子还会被延续增加进来。假如须要运用Slim 微调模子,起首要下载Slim的源代码。Slim的源代码保存在tensorflow/models 项目中https://github.com/tensorflow/models/tree/master/research/slim。供应的代码内里已包括了这份代码,在chapter3/slim目次下。下面简朴引见下Slim的代码构造,以下表所示:

   

2、定义新的datasets文件

  在slim/datasets 中, 定义了一切可以运用的数据库,为了可以运用在前面中建立的tfrecord数据举行练习,必须要在datasets中定义新的数据库。起首,在datasets/目次下新建一个文件satellite.py,并将flowers.py 文件中的内容复制到satellite.py 中。接下来,须要修正以下几处内容:第一处是_FILE_PATTERN 、SPLITS_TO SIZES 、_NUM_CLASSES , 将其举行以下修正:

_FILE_PATTERN = 'satellite_%s_*.tfrecord'
SPLITS_TO_SIZES = {'train':4800, 'validation':1200}
_NUM_CLASSES = 6

  第二处修正image/format部份,将之修正为:

'image/format' tf.FixedLenFeature( (), tf. string, default_value ='jpg'),

  此处定义了图片的默许花样。收集的卫星图片的花样为jpg图片,因而修正为jpg 。修正完satellite.py后,还须要在同目次的dataset_factory.py文件中注册satellite数据库。注册后dataset_factory. py 中对应代码为:

from datasets import cifar10
from datasets import flowers
from datasets import imagenet
from datasets import mnist
from datasets import satellite # 自行增加

datasets_map = {
    'cifar10': cifar10,
    'flowers': flowers,
    'imagenet': imagenet,
    'mnist': mnist,
    'satellite':satellite,  # 自行增加
}

3、预备练习文件夹

  定义完数据集后,在slim文件夹下再新建一个satellite目次,在这个目次中,完成末了的几项预备事情:

  新建一个data目次,并将前面预备好的5 个转换好花样的练习数据(4个tfrecords文件和1个txt文件)复制进去。
  新建一个空的train_dir 目次,用来保存练习历程当中的日记和模子。
  新建一个pretrained目次,在slim的GitHub页面找到Inception_V3 模子的下载地点,下载并解压后,会获得一个inception_v3 .ckpt 文件,将该文件复制到pretrained 目次下。

  末了构成的目次以下所示:  

   

4、最先练习

  在slim 文件夹下,运转以下敕令就可以最先练习了:

python train_image_classifier.py

  train_image_classifier.py中部份参数诠释以下:

# –trainable_scopes=InceptionV3/Logits,InceptionV3/AuxLogits:起首来诠释trainable_scope的作用,因为它非常重要。
  trainable_scopes划定了在模子中微调变量的局限。这里的设定示意只对InceptionV3/Logits,InceptionV3/AuxLogits 两个变量举行微调,
  别的的变量都不动。InceptionV3/Logits,InceptionV3/AuxLogits就相当于在VGG模子中的fc8,他们是Inception V3的“末尾层”。
  假如不设定trainable_scopes,就会对模子中一切的参数举行练习。 # –train_dir=satellite/train_dir:表明会在satellite/train_dir目次下保存日记和checkpoint。 # –dataset_name=satellite、–dataset_split_name=train:指定练习的数据集。在3.2节中定义的新的dataset就是在这里发挥用途的。 # –dataset_dir=satellite/data: 指定练习数据集保存的位置。 # –model_ name=inception_v3 :运用的模子称号。 # –checkpoint_path=satellite/pretrained/inception_v3.ckpt:预练习模子的保存位置。 # –checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits : 在恢复预练习模子时,不恢复这两层。正如之前所说,
  这两层是InceptionV3模子的末尾层,对应着ImageNet 数据集的1000 类,和当前的数据集不符, 因而不要去恢复它。 # –max_number_of_steps 100000 :最大的实行步数。 # –batch_size =32 :每步运用的batch 数目。 # –learning_rate=0.001 : 进修率。 # –learning_rate_decay_type=fixed:进修率是不是自动下落,此处运用牢固的进修率。 # –save_interval_secs=300 :每隔300s ,顺序会把当前模子保存到train_dir中。此处就是目次satellite/train_dir 。 # –save_summaries_secs=2 :每隔2s,就会将日记写入到train_dir 中。可以用TensorBoard 检察该日记。此处为了轻易视察,
  设定的时刻距离较多,现实练习时,为了机能斟酌,可以设定较长的时刻距离。 # –log_every_n_steps=10: 每隔10 步,就会在屏幕上打出练习信息。 # –optimizer=rmsprop: 示意选定的优化器。 # –weight_decay=0.00004 :选定的weight_decay值。即模子中一切参数的二次正则化超参数。

  然则经由笔者本身实验,发如今书上给出的下载地点下载的inception_v3.ckpt,会报出以下毛病:DataLossError (see above for traceback): Unable to open table file satellite/pretrained/inception_v3.ckpt: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need touse a different restore operator?。以下图所示:

   

  解决办法:文件毛病,笔者挑选从CSDN从新下载inception_v3.ckpt。这才可以练习起来。以下图所示是胜利练习起来的截图

   

  以上参数是只练习末尾层InceptionV3/Logits, InceptionV3/AuxLogits, 还可以去掉–trainable_ scopes 参数。原本的–trainable_scopes= InceptionV3 /Logits ,InceptionV3/AuxLogits 示意只对末尾层InceptionV3/Logits 和InceptionV3/AuxLogits 举行练习,去掉后就可以练习模子中的一切参数了。

5、练习顺序行动

  当train_image_classifier.py顺序启动后,假如练习文件夹(即satellite/train_dir)里没有已保存的模子,就会加载checkpoint_path中的预练习模子,紧接着,顺序会把初始模子保存到train_dir中,定名为model.ckpt-0,0示意第0步。这以后,每隔5min(参数--save_interval_secs=300指定了每隔300s保存一次,即5min)。顺序还会把当前模子保存到一样的文件夹中,定名花样和第一次保存的花样一样。因为模子比较大,顺序只会保存最新的5个模子。

  别的,假如中断了顺序并再次运转,顺序会起首搜检train_dir中有无已保存的模子,假如有,就不会去加载checkpoint_path中的预练习模子,而是直接加载train_dir中已练习好的模子,并以此为出发点举行练习。Slim之所以如许设想,是为了在微调收集的时刻,可以轻易地按阶段手动调解进修率等参数。

6、考证模子准确率

  运用eval_image_classifier.py顺序考证模子在考证数据集上的准确率,实行以下指令:

python eval_image_classifier.py

  eval_image_classifier.py中部份参数诠释以下

# –checkpoint_path=satellite/train_ dir: 这个参数既可以吸收一个目次的途径,也可以吸收一个文件的途径。假如吸收的是一个目次的途径,
# 如这里的satellite/train_dir,就会在这个目次中寻觅最新保存的模子文件,实行考证。也可以指定一个模子考证,以第300步为例,
# 假如要对它实行考证,通报的参数应当为satellite/train_ dir/model.ckpt-300 。 # –eval_dir=satellite/eval_dir :实行效果的曰志就保存在eval_dir 中,一样可以经由历程TensorBoard 检察。 # –dataset_name=satellite 、–dataset_split_name=validation 指定须要实行的数据集。注重此处是运用考证集( validation )实行考证。 # –dataset_dir=satellite/data :数据集保存的位置。 # –model_ name「nception_ v3 :运用的模子。

  实行后,涌现以下效果:

   

  Accuracy示意模子的分类准确率,而Recall_5 示意Top 5 的准确率,即在输出的各种别几率中,准确的种别只需落在前5 个就算对。因为此处的种别数比较少,因而可以不实行Top 5 的准确率,换而实行Top 2 或许Top 3的准确率,只需在eval_image_classifier.py 中修正下面的部份就可以了: 

    # Define the metrics:
    names_to_values, names_to_updates = slim.metrics.aggregate_metric_map({
        'Accuracy': slim.metrics.streaming_accuracy(predictions, labels),
        'Recall_5': slim.metrics.streaming_recall_at_k(
            logits, labels, 5),
    })

7、导出模子

  练习完模子后,罕见的运用场景是:布置练习好的模子并对单张图片举行辨认。此处供应了freeze_graph.py用于导出辨认的模子,classify_image_inception_v3.py是运用inception_v3模子对单张图片举行辨认的剧本。导出模子:TensorFlow Slim供应了导出收集构造的剧本export_inference_graph.py 。 起首在 slim 文件夹下运转指令:

python export_inference_graph.py

  这个敕令会在 satellite 文件夹中生成一个 inception_v3_inf_graph.pb 文件 。

   

  注重: inception_v3 _inf _graph.pb 文件中只保存了Inception V3 的收集构造,并不包括练习获得的模子参数,须要将checkpoint 中的模子参数保存进来。要领是运用freeze_graph. py 剧本(在chapter_3 文件夹下运转):在 项目根目次 实行以下敕令(需将10085改成train_dir中保存的现实的模子练习步数)

python freeze_graph.py 

  freeze_graph.py中部份参数诠释以下

#–input_graph slim/satellite/inception_v3_inf_graph.pb。示意运用的收集构造文件,即之前已导出的inception_v3 _inf_gr aph.pb 。
#–input_checkpoint slim/satallite/train_dir/model.ckpt-10085。详细将哪个checkpoint 的参数载入到收集构造中。
# 这里运用的是练习文件夹train _d让中的第10085步模子文件。我们须要依据练习文件夹下checkpoint的现实步数,将10085修正成对应的数值。 #input_binary true。导入的inception_v3_inf_graph.pb现实是一个protobuf文件。而protobuf 文件有两种保存花样,一种是文本情势,一种是二进制情势。
# inception_v3_inf_graph.pb 是二进制情势,所以对应的参数是–input_binary true 。初学的话对此可以不必穷究,如有兴致的话可以参考资料。 #--output_node_names 在导出的模子中指定一个输出结点,InceptionV3/Predictions/Reshape_1是Inception_V3末了的输出层 #–output_graph slim/satellite/frozen_graph.pb。末了导出的模子保存为slim/satellite/frozen_graph.pb 文件

  末了导出的模子文件以下:

   

三、展望图片

  怎样运用导出的frozen_graph.pb文件对单张图片举行展望?此处运用一个编写的文件classify_image_inception_v3.py 剧原本完成这件事 。先来看这个剧本的运用要领:

python classify_image_inception_v3.py

  classify_image_inception_v3.py中部份参数诠释以下

# 一model_path 很好明白,就是之前导出的模子frozen_graph. pb 。
# –label_path 指定了一个label文件, label文件中按递次存储了各个种别的称号,如许剧本就可以把种别的id号转换为现实的种别号。
# –image _file 是须要测试的单张图片。

  剧本的运转效果应当类似于:
   

  这就示意模子展望图片对应的最能够的种别是water,接着是wetland 、urban 、wood 等。score 是各个种别对应的Logit 。

四、TensorBoard 可视化与超参数挑选

  在练习时,可以运用TensorBoard 对练习历程举行可视化,这也有助于设定练习模子的体式格局及超参数。在slim文件夹下运用以下敕令可以翻开TensorBoard (实在就是指定练习文件夹):

tensorboard --logdir satellite/train_dir

   

  在TensorBoard中,可以看到丧失的变化如上图 所示。视察丧失曲线有助于调解参数。当丧失曲线比较平缓,收敛较慢时,可以斟酌增大进修率,以加速收敛速率;假如丧失曲线波动较大,没法收敛,就能够是因为进修率过大,此时就可以尝试恰当减小进修率

  别的,在上面的进修中,在笔者本身举行实验的历程当中,一些小的毛病就没有粘贴出来了,读者自行搜刮即可获得解决要领。这篇博文重要来自《21个项目玩转深度进修》这本书内里的第三章,内容有删减,另有本书的一些代码的实验效果,经由笔者本身修正,已可以完整胜利运转。随书附赠的代码库链接为:https://github.com/hzy46/Deep-Learning-21-Examples。

 

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
图像识别模子

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282087.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>