在TensorFlow里把Image Resize到固定尺寸同时保持宽高比

尚无评论

使用TensorFlow读入一幅图片后,有时候我们需要将图片的尺寸进行一些修正,比如AlexNet所做的crop操作,或者某些网络需要固定的输入而将图片resize到固定的大小,等等。如果是针对类似numpy array这样的内容进行这些操作,可能大家都能手到擒来,但在TensorFlow里进行这样的操作需要一些tensor操作,这些操作有些反人类,而且调试不易。所以,本文我们就对这些东西进行一些总结,以便备忘,并方便后来者查阅。

在 2018-06-27 发布于 人工智能 类别下以来已有1,118人读过本文
阅读全文

通过加权解决Detectron训练object detection模型时的类间不平衡问题

尚无评论

使用深度学习解决分类问题时,类间不平衡是一个常见的问题,我们也有很多常用的方法去解决这一问题。比如,对类别少的样本进行augment,或者重采样;对类别多的样本进行降采样;根据不同类别的样本数目对损失函数进行加权;或者简单粗暴地对较少的样本在数据集内进行复制;等等。

不过这些方法中,考虑到数据对深度学习的重要性,一般不会使用对数据进行降采样的方法;而augment、重采样以及复制数据,都需要对数据进行直接操作,也并不如修改损失函数进行加权的方法简单优雅。这种对损失函数进行加权的方法如下:

Loss = class_of_less_samples_loss * weights + class_of_more_samples_loss

不过,这种方法虽然简单优雅,对分类问题进行处理也简单方便,但如果是目标检测问题,则可能需要考虑更多东西;如果我们使用的是像Detectron这样包装严密的框架,处理起来可能难上加难。本文,我们就以Detectron里的Faster-RCNN来详细描述一下这一问题,以期提供一些经验参考。

在 2018-05-04 发布于 人工智能 类别下以来已有2,220人读过本文
阅读全文

使用Python在图像上标注汉字

尚无评论

如果我们的classes是汉字,在使用Faster-RCNN检测完成后,需要将其标注到图片上查看效果时,可能会面临一些问题。一是Python2的编码问题比较混乱,可能带来错误;第二个是Python2的默认字体不支持中文,即使打印到图片上,也可能显示的是乱码。

因此,在将汉字classes打印到图片上的过程中,需要进行一些特殊的处理。我们在这里进行一下记录以便备忘。

在Python里,对图片进行处理时,我们通常使用Matplotlib或PIL,因此,这里我们也对这两个方法分别加以介绍。

在 2018-02-10 发布于 人工智能 类别下以来已有1,740人读过本文
阅读全文

将自己的数据集转换成pascal_voc格式

尚无评论

在RCNN、Fast-RCNN、Faster-RCNN等一系列深度学习用于目标检测(Object Detection)的众多开源实现里,基本上都是基于pascal_voc的数据集进行处理的,给出了使用该数据集进行训练和测试的完整代码。

诚然,我们可以基于这些开源项目来进行定制,并在自己的数据集跑起来。但这样需要修改大量代码,稍有不慎可能带来很多注意不到的错误。而从另一个方面入手,如果将我们的数据集按照pascal_voc的格式进行转换,然后进行训练,则会简单地多,只需要修改很少量的代码即可。不过这样一来,我们的任务则集中在了将数据集转换为pascal_voc的格式上。

在 2018-02-07 发布于 人工智能 类别下以来已有3,992人读过本文
阅读全文

使用TensorFlow Dataset读取数据备忘

尚无评论

在使用TensorFlow构建模型并进行训练时,如何读取数据并将数据恰当地送进模型,是一个首先需要考虑的问题。以往通常所用的方法无外乎以下几种:

1.建立placeholder,然后使用feed_dict将数据feed进placeholder进行使用。使用这种方法十分灵活,可以一下子将所有数据读入内存,然后分batch进行feed;也可以建立一个Python的generator,一个batch一个batch的将数据读入,并将其feed进placeholder。这种方法很直观,用起来也比较方便灵活,但是这种方法的效率较低,难以满足高速计算的需求。

2.使用TensorFlow的QueueRunner,通过一系列的Tensor操作,将磁盘上的数据分批次读入并送入模型进行使用。这种方法效率很高,但因为其牵涉到Tensor操作,不够直观,也不方便调试,所有有时候会显得比较困难。使用这种方法时,常用的一些操作包括tf.TextLineReader,tf.FixedLengthRecordReader以及tf.decode_raw等等。如果需要循环,条件操作,还需要使用TensorFlow的tf.while_loop,tf.case等操作,更是难上加难。

在 2018-01-30 发布于 人工智能 类别下以来已有3,409人读过本文
阅读全文

Visualize the outputs of intermediate layers of a Keras model

尚无评论

训练完成各种CNN的模型之后,为了查看模型的效果以及模型到底能够从原始图像中抽取什么样的特征,有时候我们需要模型的中间输出结果,并将其图示出来进行查看。在TensorFlow中这很简单,直接将中间层的Tensor作为输出,以图像数据通过feed_dict进行输入,然后使用tf.Session将Tensor的结果run出来图示即可。但Keras对模型的输入输出以及训练过程整合的比较严密,耦合度较高,尤其是使用Keras自带的一些经典模型进行fine-tuning时,想要得到其中间层的结果并将其输出并不容易。

下面我们就来看一下,如何取出Keras模型中的某一层输出,并图示出来进行查看。

在 2017-12-29 发布于 人工智能 类别下以来已有2,320人读过本文
阅读全文

使用python将mask绘制到对应的图像上

尚无评论

在使用深度学习等方法处理计算机视觉问题而对图像进行处理的过程中,不可避免地要处理原始图像及其相应的mask。比如将mask绘制到原始图像上,将mask的轮廓绘制到原始图像上,提取mask的轮廓,或者已知mask的轮廓而将mask填充,等等。

尽管这些问题都不是复杂的问题,但使用频率比较高,而每一次对其进行处理时都会浪费时间甚至分心,而耽误真正的任务的执行。因此,本文就将在处理这些问题中的经验进行一下总结,同时也为以后的使用备忘。

当然,因为我的经验主要还是在医学图像的处理上,所以这里就以医学图像为例来进行处理。

在 2017-10-13 发布于 人工智能 类别下以来已有4,269人读过本文
阅读全文

用TensorFlow训练神经网络解决Fizz Buzz问题

尚无评论

在西方国家,Fizz Buzz是一个经典的游戏,经常用来帮助孩子们锻炼学习除法。其从1开始数数,遇到能被3整除的,将数字替换为fizz,遇到能被5整除的,将其替换为buzz,而遇到能同时被3和5整除的数字,则将其替换为fizzbuzz,对其余数字,则保持不变将其直接输出。

当然,这是一个很简单的问题,尤其是编码实现,原本不需要动用TensorFlow这样的牛刀。而本篇博客的来源却是有个牛人在Google面试的时候,面试官出了这个问题给他,他独辟蹊径尝试用TensorFlow训练模型对问题进行了解决。考虑到使用TensorFlow来解决这个问题时,无需外部数据(直接通过程序生成训练数据和测试数据),可以将所有的焦点集中到TensorFlow的使用上,因此,这个问题是一个很好的锻炼TensorFlow的机会,所以我也尝试着用TensorFlow来写一下。

在 2017-09-29 发布于 人工智能 类别下以来已有2,764人读过本文
阅读全文

用TensorFlow写一个简单网络实现异或(XOR)

尚无评论

最近读到一个网友的博客,记录他在一次面试时,碰到面试官要求他在白板上用TensorFlow写一个简单的网络实现异或(XOR)功能。这个本身并不难,单层感知器不能解决异或问题是学习神经网络中的一个常识,而简单的两层神经网络却能将其轻易解决。但这个问题的难处在于,我们接触TensorFlow通常直接拿来写CNN,或者其他的深度学习相关的网络了,而实现这种简单网络,基本上从未做过;更何况,要求在白板上写出来,如果想bug free,并不是容易的事儿啊。

下面,我们就来简单写一下吧。其实,无论复杂还是简单,用TensorFlow写一个网络无非这样几个部分:

在 2017-09-20 发布于 人工智能 类别下以来已有3,681人读过本文
阅读全文

TensorFlow保存和恢复模型的方法总结

尚无评论

使用TensorFlow训练模型的过程中,需要适时对模型进行保存,以及对保存的模型进行restore,以方便后续对模型进行处理。比如进行测试,或者部署;比如拿别的模型进行fine-tune,等等。当然,直接的保存和restore比较简单,无需多言,但是保存和restore中还牵涉到其他问题,以及针对各种需求的各种参数等,可能不便一下都记好。因此,有必要对此进行一个总结。本文就是对使用TensorFlow保存和restore模型的相关内容进行一下总结,以便备忘。

在 2017-09-15 发布于 人工智能 类别下以来已有10,814人读过本文
阅读全文