图像处理语意理解_语意分割 图像标注 - CSDN
  • 图像处理之语义分割

    2019-10-02 15:19:07
    语义分割 语义分割的含义 语义分割是在像素级别上的分类,属于同一类的像素都要被归为一类, 如图所示,属于人类的像素归为一类,属于摩托车的像素归为一类,除此之外,属于背景的像素也归为一类。...

    语义分割

    语义分割的含义

    语义分割是在像素级别上的分类,属于同一类的像素都要被归为一类,
    在这里插(a)原图入图片描述
    如图所示,属于人类的像素归为一类,属于摩托车的像素归为一类,除此之外,属于背景的像素也归为一类。语义分割与实例分割是不同的。如果一张照片中不同的人,实例分割需要把不同的人的像素归为不同的类,相当于是在语义分割的基础上更进一步。

    语义分割的研究方法

    传统方法

    1. TextonForest分割法
    2. 基于随机森林分类器分割法

    深度学习下的思路

    1. ** Patch classification **:这是最初的深度学习方法应用于图像分割中。
      因为全连接层需要固定大小的图像。所以图像是切成块交给深度模型处理的,然后对像素进行分类。
    2. 全卷积方法(FCN):FCN将网络全连接层用卷积取代,因此使任意图像大小的输入都变成可能,而且速度比Patch classification方法快很多。CNN模型用于语义分割还存在一个问题,就是下采样操作(比如,pooling)。pooling操作可以扩大感受野因而能够很好地整合上下文信息(context中文称为语境或者上下文,通俗的理解就是综合了更多的信息来进行决策),对high-level的任务(比如分类),这是很有效的。但同时,由于pooling下采样操作,使得分辨率降低,因此削弱了位置信息,而语义分割中需要score map和原图对齐,因此需要丰富的位置信息。
    3. encoder-decoder架构:encoder-decoder是基于FCN的架构。encoder由于pooling逐渐减少空间维度,而decoder逐渐恢复空间维度和细节信息。
    4. 空洞卷积:dilated/atrous (空洞卷积)架构,这种结构代替了pooling,一方面它可以保持空间分辨率,另外一方面它由于可以扩大感受野因而可以很好地整合上下文信息
    5. 条件随机场

    深度学习下的语义分割

    现在的深度学习语义分割模型基本上是基于FCN发展而来的。下图可以概括FCN的延伸方法。图片来自链接
    在这里插入图片描述

    展开全文
  • 语义分割(semantic segmentation)问题关注的是如何将图像分割成属于不同语义类别的区域。这些语义区域的标注和预测都是像素级的。 下图展示了语义分割中图像有关狗、猫和背景的标签。与目标检测相比,语义分割...

    摘自《动手学习深度学习

    图像分类会给每张图像分配一个标签或类别。但如果想知道物体在图像中的位置、物体的形状、以及哪个像素属于哪个物体等,就需要分割图像,给图像中的每个像素各分配一个标签。因此,图像分割的任务是训练一个神经网络来输出该图像对每一个像素的掩码。从更底层(像素层级)来理解图像。图像分割在例如医疗图像、自动驾驶车辆以及卫星图像等领域有很多应用。

    语义分割(semantic segmentation)问题关注的是如何将图像分割成属于不同语义类别的区域。这些语义区域的标注和预测都是像素级的。

    下图展示了语义分割中图像有关狗、猫和背景的标签。与目标检测相比,语义分割标注的像素级的边框更加精细

     

     

    图像分割和实例分割

    另两个相似问题。

    • 图像分割(image segmentation):常利用图像中像素之间的相关性,将图像分割成若干组成区域。在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。只是将图像分割不分类
    • 实例分割(instance segmentation):不仅需要区分语义,还要区分不同的目标实例。分类还要识别具体身份

     

    全卷积网络(fully convolutional network,FCN)

    采用CNN实现了从图像像素到像素类别的变换。

    通过转置卷积(transposed convolution)层将中间层特征图的高和宽变换回输入图像的尺寸,从而令预测结果与输入图像在空间维(高和宽)上一一对应:给定空间维上的位置,通道维的输出即该位置对应像素的类别预测。

    转置卷积层得名于矩阵的转置操作;而卷积运算可以通过矩阵乘法来实现

     

    卷积运算的矩阵描述

    设输入向量为\boldsymbol{x},权重矩阵为\boldsymbol{W},卷积的前向计算可看作:\boldsymbol{y} = \boldsymbol{W}\boldsymbol{x}

    反向传播需要依据链式法则。由于\nabla_{\boldsymbol{x}} \boldsymbol{y} = \boldsymbol{W}^\top,卷积的反向传播函数可看作乘以\boldsymbol{W}^\top

    转置卷积层交换了卷积层的前向计算函数与反向传播函数:可看作将函数输入向量分别乘以\boldsymbol{W}^\top\boldsymbol{W}。所以转置卷积层可以用来交换卷积层输入和输出的形状。

    设权重矩阵是4\times16的矩阵,对于长度为16的输入向量,卷积前向输出长度为4的向量。将此输出送至形状为16\times4的转置权重矩阵,输出长度为16的向量。

    转置卷积层常用于将较小的特征图变换为更大的特征图。在全卷积网络中,当输入是高和宽较小的特征图时,转置卷积层可以用来将高和宽放大到输入图像的尺寸

     

    全卷机网络模型

    全卷积网络先使用卷积神经网络抽取图像特征,然后通过1\times 1卷积层将通道数变换为类别个数,最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。模型输出与输入图像的高和宽相同,并在空间位置上一一对应:最终输出的通道包含了该空间位置像素的类别预测(猫、狗、背景)(可能是因为网络都是卷积层而得名吧)

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 语义理解的看法

    2019-01-08 14:06:38
    给你一篇文章或者一个句子,人们在理解这些句子时,头脑中会进行上下文的搜索和...目前的nlp根本达不到,都是浅层次的操作,因为目前的nlp基本上借鉴了图像处理机制,根本没有触及nlp的本质。nlp的进展将会十分艰难...

           给你一篇文章或者一个句子,人们在理解这些句子时,头脑中会进行上下文的搜索和知识联想。对于一篇有思想的文章,作者的创作构思以及核心思想,我们人脑基本的处理逻辑都是结合过去学习过的规则和概念进行抽象总结。作者的创作过程可以形成一个图模型,清晰地展示出路径。目前的nlp根本达不到,都是浅层次的操作,因为目前的nlp基本上借鉴了图像处理机制,根本没有触及nlp的本质。nlp的进展将会十分艰难,因为机器永远不能理解字符串背后的涵义以及说话者到底发生了什么。目前来看,只有知识图谱算是当今Ai最有前景,道路最正确的一个研究方向。逻辑推理还有很长的路,吴文俊公式在理论上已经给出了支持,但是应用在计算机中困难重重。
           通常情况下,人在理解语义时头脑会搜寻与之相关的知识。知识图谱的创始人人为,构成这个世界的是实体,而不是字符串,这从根本上改变了过去的搜索体系。语义理解其实是基于知识、概念以及这些概念间的关系。人们在解答问题时,往往会讲述与这个问题相关的知识,这是语义理解的过程。这种机制完全不同于人对图像或者语音的认识。CNN在图像或者语音领域取得成果是不足为奇的,因为生物学家已经对人脑神经元在图像识别过程中的机制非常熟悉,但是对于人脑如何理解文字的神经元机制却知之甚少,所以导致了目前nlp语义理解方面进展非常缓慢。然而有的学者研究规则专家系统已经长达20多年,本人坚信这是正确的方向,最起码比单纯研究深度学习更有实际意义。研究nlp,语言逻辑,语言学是必修课,目前深度学习的瓶颈早就已经显现出来了,而且门槛儿远低于知识图谱,规则专家系统。
           单就深度学习来看的话,学院派的人花费大量精力在NLG,seq2seq,多任务自然语言生成等等上面。这些在知识图谱专家或者语言学家眼中就是学术界的玩票儿。本人在刚开始介入nlp学习的过程中,对深度学习很疯狂,尤其是seq2seq,后来请教王昊奋专家,王就很坦白地跟我说seq2seq是玩票儿,坑了很多人,包括在校研究生。所以本人从那以后重新反思之前的学习,重新确立方向,先把数学专业的数学进修好,包括6本数学著作涵盖泛函数,微积分,线代,统计学,矩阵论,凸优化。然后重点转向图模型推理,知识图谱的研究学习。在学习的过程中,前期走了很多弯路,幸亏及时修正了方向,要不然将会陷入深度学习的陷阱之中。当然深度学习并不是一无是处,最起码在图像中取得了非常好的效果,是成功的。在nlp中,深度学习与图模型结合初步解决推理问题也是成功的,谷歌大脑和DeepMind在18年已经做了尝试并且开源了代码。也就说深度学习引入到nlp中需要改进,一方面要改进自身的算法,比如CNN的动态池化层改进,输入层embedding的知识图谱嵌入扩展,另一方面又要与图模型,统计学进行融合。现在Ai界比较热的两大研究方向:一是AutoML,二是神经规则推理。在神经网络参数优化方面,遗传算法是重点。在联结主义和符号主义融合方面,国内的吕正东博士是先锋,他的深度好奇公司已经迈出来第一步。
           之前在网上看到很多介绍word2vector的博客,本人发现其中有很多错误。论述很多篇幅并没有抓住他的本质。还有一部分人质疑word2vector不是深度学习,说层数太浅达不到深度的级别,这是一种误解。word2vector是地地道道的深度学习,能够抽取出词的高阶特征。他的成功,关键是基于他的核心思想:相同语境出现的词语义相近。这在nlp中是非常重要的一个思想,利用上下文。除去上下文的影响因素,单纯从数学公式来看,w2v的skip_gram是logistic regression的升级版。所以w2v其实是很简单的,但是背后的想法不简单。这也是国内的研究人员与美国的研究人员的差距,国内人员习惯于复杂的公式推导,但是想法很low,美国正好相反。这一点从数学教育就可以看出来,国内热衷于感知层面的数学学习,和机器差不多。而国外主要从认知层面来学习数学。物理学,数学,神经生物学,生活常识都可以是想法的来源,比如上个世纪的pagerank好像很简单,但是欧洲的学者利用随机游走模型能够模拟出成功和运气之间存在很强的相关性。即使是简单的算法,国内的人也想不出来,原因是人天性里的好奇心和创造力从小被解题和刷题给灭掉了。
           再比如,给你一篇文章,抽取出其中的中心句或者总结出中心思想(当然了,只有中国的语文教学这样教学生,把学生教傻了,当前的在线教育利用Ai助纣为虐就是个妖魔化方向)。首先你得研究作为一个人本身的处理逻辑,然后从中抽象出数学模型然后再与Ai结合。
    Ai的研究本质上就是对人脑逻辑的研究。这就是上层的灵感,尤其是幼儿时期的非经验主义的学习,不需要海量数据的灌输。这一点国内非常落伍,基本都是从google扒美国的论文,拿过来研究一下改改。去年百度副总闭关几个月阅读《脑科学导论》反思当下的深度学习,请问AI创业公司有几个能做到?除了吹牛还有别的本事吗?更进一步说,人本身就是十分复杂精密的机器,从DNA指导蛋白质合成过程就可以看出,人一定是上帝造出来的机器,不可能是随机组合,概率真的真的太太太低了。只有修正了认知才会进步。回到刚提出的问题,抽出中心句的过程,人脑逻辑是衡量上下文和假设中心句的语义相似度。所以才会有另一篇本人写的博客。
           目前来看,LSTM以及Attention Model是比较成功的,但是仍然基于形式化的,对于深层语义仍然没有解决,必须依靠规则专家系统!目前来看,深度学习算法LSTM,Attention Model等在nlp中的应用,仅限于上下文和词,句子向量。计算一下句子相似度,聚类之类的,要想真正让机器理解文字,还达不到。也就是说只在语义表示层做文章是远远不够的,底层的知识图谱是关键。Google提出的知识图谱是一种变革,nlp是一个完整的生态圈,从最底层的存储,GDB三元组(entry,relation,entry),到上层的语义表示(这个阶段可以借助深度学习直接在语义层进行训练),比如(head,relation,tail)三元组表示的图结构,表达了实体与实体间的关系,可以用深度学习训练出一个模型:h + r = t,获取语义表示。这样在预测时,得到了两个实体的语义表示,进行减法运算就可以知道两者的关系。这个不同于word2vector,但是还是有共性的。word2vector的模型训练和kg的向量化,两者其实存在一定的关联。前者可以看成是kg图结构碾平之后的序列化的向量表示。目前trans系列和基于语义相似度模型都可以解决kg的向量化。
           实体,关系和规则是深度学习引入到nlp中必须考虑的,也是逻辑推理的基本要素。深度学习获取语义表示(不仅限于文字,也可是一个有多维度的图节点),必须与规则交互,规则表明了实体之间如何交互。语义表示和规则是深度学习两大构成要素,二者相互交互。
           语义表示是深度学习在nlp文字应用中的方向。之前在词embedding上word2vector获取了巨大成功,现在主要方向是由词embedding迁移到句子或者文章embedding。之前的博客siamese lstm已经有论述了,在2014~2015年间,国外的学者探索了各种方法,比如tree-lstm,convnet,skip-thougt,基于ma机构的siamese lstm来计算句子或者文章的相似度。目前从数据来看,基于ma结构的siamese lstm效果最好,最适应nlp的规律。在github上已经有了siamese lstm的实验,进一步改进是基于BiLSTM+self_attention(本人提出),至于增加层数是否能够带来准确率的提升,有待于进一步论证,个人持中立态度。

    展开全文
  • 前言:在7月份我参加了同济大学主办的DigitalFutures夏令营,成功申请参加东南大学建筑运算研究所课题组,在最终的作业完成过程中我将图像语意分割城市街景信息使用pixplot编码网络进行数据聚类分析,将聚类结果使用...

    前言:在7月份我参加了同济大学主办的DigitalFutures夏令营,成功申请进入到东南大学建筑运算研究所课题组,在最终的作业完成过程中我将图像语意分割7条城市街道图像的城市街景信息结果使用pixplot编码网络进行数据聚类,将聚类结果使用python-pandas库可视化(下图),有机会希望可以在我成功发表论文后公布算法详解。
    在这里插入图片描述
    另一个解决掉的问题便是语意分割图像信息统计,我统计的是绿色像素在整张图像所占比率,在城市科学中的意义便是计算街景图像的绿视率。用该算法只需替换掉[r,g,b]对应颜色数值,即可统计其他语意信息所占比率。至此是我热情的想和大家分享我近期所做的研究成果,圆(yan)规(gui)正转,本期主要内容还是详解DeepLabNet-XceptionNet神经网络训练过程。

    我使用百度地图API获取了天津大学门口的一处坐标点街景图片进行识别测试。
    其中神经网络模型迁移学习(冻结预训练网络)15epoch,训练全部神经网络(解冻预训练网络)15epoch。

    在这里插入图片描述
    在这里插入图片描述
    1.图片数据获取
    需要使用Cityscapes这一数据集训练神经网络模型:
    该数据集主要用来做汽车自动驾驶识别,要么是像我用来做城市街景信息的识别分类。模型训练出来后,识别数据的获取就至关重要,在我的另一篇博客中:
    Python通过百度全景图API爬取街景图像
    我详细讲解了如何通过百度地图官方API,通过Python的爬虫代码批量获取坐标全景图片。
    2.数据集预处理
    我们知道,在深度学习图像语意分割的训练过程中,需要有数据集及分好类的标签,这样才可以让你的神经网络进行学习,进而训练出模型,用来识别你想要识别的图片场景等。Cityscapes便是包含大量街道图片、视频用来训练识别的数据集。
    在我另一篇博客中对数据集的下载、处理都进行了详细的解释,这里就不做过多解释。
    图像语意分割Cityscapes训练数据集使用方法分享
    3.图像语意分割神经网络列举
    这里还是要感谢博主:Bubbliiiing提供的神经网络合集及博文讲解。
    博主提供的神经网络代码均是基于2分类的斑马线图像分割,而我需要多分类的图像语意分割,各位朋友在学习时可以仔细对照修改前后的网络代码差别,会对网络细节需要修改的参数更深层的理解。
    我将博主共享的模型代码做了一份整理(下图),我将分两篇博文选取其中两个进行讲解。
    分别是SenNet-ConvNet(简单)和DeepLabNet-XceptionNet(复杂)。
    在这里插入图片描述
    4.Make_Dataset
    神经网络通过图片进行网络参数训练时,图片的获取需要从电脑异步读取,例如读取2张训练2张,如果读取所有上千张图片再抽取训练这样并不可行。
    通过将图片和标签名称写入txt文件,在网络中读取txt文件合成完整的图片路径,进行读取。

    import os
    
    #自行修改文件绝对路径
    left = os.listdir(r"F:\202006Practice\cityscapesScripts-master\leftImg8bit\val")
    gtfine = os.listdir(r"F:\202006Practice\cityscapesScripts-master\gtFine\val")
    
    #自行修改txt文件相对路径
    with open("read_data/val_data0.txt","w") as f:
        for name in left:
            png = name.replace("leftImg8bit","gtFine_labelTrainIds")
            # 判断left是否存在对应的gtfine
            if png in gtfine:
                f.write(name+";"+png+"\n")
    

    我将leftImg8bit和gtFine下的train和val数据集,将图片从各个城市的文件夹中剪切到了一个文件下。原因是我并没有想到什么非常好的办法,可以让程序按城市顺序读取图片并训练,不如将2974张train及500张val图片分别放到一起进行训练及验证。feed数据阶段若有朋友了解更好操作方法还请不吝赐教!
    代码第4、5行路径可以更改为你电脑中图片绝对路径。我这里放一张文件夹截图作为示例。
    因为有原图及标签两个文件夹,所以也需要生成两个txt文件,第4、5行路径及第7行生成文件名称需要相对应的修改。
    在这里插入图片描述
    5.DeepLabNet-XceptionNet神经网络图像语意分割多分类训练
    为了篇幅美观及阅读舒适,所有代码均放到了文章末尾。
    好的,上文的街景图片爬取及数据集预处理内容在上个月发布的博客中均进行了讲解,接下来才是重头戏,相较于SegNet-CongNet网络本次代码更加复杂难懂的代码主要增加在

    1. 数据增强函数模块:将数据集图像随机变换颜色,使训练数据增加,增加神经网络鲁棒性
    2. 迁移学习函数模块:冻结预训练网络参数权重,仅训练解码网络,使训练时间大幅度减少
    3. 验证集获取函数模块:读取验证集数据进行神经网络识别精度检测,而非从训练集中抽取10%检测

    本次主函数代码行数较上次大大增加,我带着大家从整体去理解各个函数作用,会对学习代码起到至关重要的作用。

    import 各基本库
    
    #定义语意分割数量
    NCLASSES = 19
    #定义数据集图像读取进来的长和宽
    HEIGHT = 512
    WIDTH = 512
    
    #将图片填充为正方形,便于在后边数据增强时使用
    def letterbox_image
    
    #产生随机数
    def rand
    #使用随机数随机变换图像颜色,产生新的数据
    def get_random_data
    
    #训练集生成器
    def generate_arrays_from_file
    #验证集生成器
    def generate_arrays_from_file2
    
    #定义交叉熵损失函数
    def loss
    
    #程序入口
    if __name__ == "__main__":
    #获取网络模型,从txt获取数据集路径,调用函数
    xxxxxxxxxxxxxxxxxxxxxx略
    
    #迁移学习,冻结主干网络不训练
    训练15个epoch
    保存训练结果权重
    
    #解冻主干网络,训练全部网络
    训练15个epoch
    保存训练权重
    

    接下来我将在train这一训练主函数模块中,逐行进行代码讲解:

    • 9行:导入matplotlib.colors库,在数据增强中会用到此函数中的功能
    • 14行:将N_CLASSES由2改为19,从2分类改为19分类
    • 18-33行:将喂入的数据填补为正方形
    • 35-38行:数据增强,将上一函数输出的正方形图像数据随机变换颜色
    • 131-175行:验证集生成器,原代码仅有训练集生成器,将其中的10%抽出作为验证集。在代码280、283行分别使用训练集生成器和验证集生成器
    • 185行:classes的2分类改为19分类,同上
    • 186-188行:此代码用来枚举神经网络中每一层的神经元及名称,方便迁移学习冻结预训练神经网络可以精确的设置冻结层数。本网络已设置好冻结层数(代码243行)为前359层,故已将186-188注释掉
    • 197-203行:分别从txt文件中读取数据集原图与标签的路径,原代码由于只有训练集只读取一次,本文代码加入了验证集,故进行了两次读取
    • 209行:将读取进来的验证集和208行代码一样,进行顺序打乱
    • 215-216行:使用len()函数计算出读取进来的训练集、验证集数据长度
    • 241-265行:迁移学习模块,冻结预训练模型网络不训练,只训练解码网络,243行设置冻结网络层数,262行设置迁移学习训练epoch
    • 267-288行:训练全部网络权重参数,270行设置解冻网络模型,285行设置训练epoch

    至此为代码全部修改内容。
    6问题解答及下期预告
    凝聚了我图像语意分割学习心得的详解文章便告一段落,针对上篇文章留言中网络训练完成后,使用predict(预测)代码中的问题我会放到下篇文章去分享。夏令营中使用的图像聚类分析pixplot,GAN对抗生成式神经网络pix2pix生成建筑立面及对物体追踪识别yolov3,yolov4非常感兴趣,希望有机会一一成文,记录心得。
    接下来一段时间我希望将学习到的此项技术应用到解决城市问题中去,或许会对于我学习成果的反馈更加有意义。

    from nets.deeplab import Deeplabv3
    from keras.utils.data_utils import get_file
    from keras.optimizers import Adam
    from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
    from PIL import Image
    import keras
    from keras import backend as K
    import numpy as np
    from matplotlib.colors import rgb_to_hsv,hsv_to_rgb
    
    ALPHA = 1.0
    # WEIGHTS_PATH_X = "https://github.com/bonlime/keras-deeplab-v3-plus/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5"
                        
    NCLASSES = 19
    HEIGHT = 512
    WIDTH = 512
    
    #将图片填充为正方形
    def letterbox_image(image, size, type):
        iw, ih = image.size
        w, h = size
        scale = min(w / iw, h / ih)
        nw = int(iw * scale)
        nh = int(ih * scale)
    
        image = image.resize((nw, nh), Image.NEAREST)
        # if (type == "jpg"):
        #     new_image = Image.new('RGB', size, (0, 0, 0))
        # elif (type == "png"):
        #     new_image = Image.new('RGB', size, (0, 0, 0))
        new_image = Image.new('RGB', size, (0, 0, 0))
        new_image.paste(image, ((w - nw) // 2, (h - nh) // 2))
        return new_image, nw, nh
    
    #获取随机改变图片
    def rand(a=0, b=1):
        return np.random.rand()*(b-a) + a
    def get_random_data(image, label, input_shape, jitter=.1, hue=.1, sat=1.1, val=1.1):
    
        h, w = input_shape
    
        # resize image
        rand_jit1 = rand(1-jitter,1+jitter)
        rand_jit2 = rand(1-jitter,1+jitter)
        new_ar = w/h * rand_jit1/rand_jit2
        scale = rand(.7, 1.3)
        if new_ar < 1:
            nh = int(scale*h)
            nw = int(nh*new_ar)
        else:
            nw = int(scale*w)
            nh = int(nw/new_ar)
        image = image.resize((nw,nh), Image.NEAREST)
        label = label.resize((nw,nh), Image.NEAREST)
        # place image
        dx = int(rand(0, w-nw))
        dy = int(rand(0, h-nh))
        new_image = Image.new('RGB', (w,h), (0,0,0))
        new_label = Image.new('RGB', (w,h), (0,0,0))
        new_image.paste(image, (dx, dy))
        new_label.paste(label, (dx, dy))
        image = new_image
        label = new_label
        # flip image or not
        flip = rand()<.5
        if flip:
            image = image.transpose(Image.FLIP_LEFT_RIGHT)
            label = label.transpose(Image.FLIP_LEFT_RIGHT)
    
        # distort image
        hue = rand(-hue, hue)
        sat = rand(1, sat) if rand()<.5 else 1/rand(1, sat)
        val = rand(1, val) if rand()<.5 else 1/rand(1, val)
        x = rgb_to_hsv(np.array(image)/255.)
        x[..., 0] += hue
        x[..., 0][x[..., 0]>1] -= 1
        x[..., 0][x[..., 0]<0] += 1
        x[..., 1] *= sat
        x[..., 2] *= val
        x[x>1] = 1
        x[x<0] = 0
        image_data = hsv_to_rgb(x)
        return image_data,label
    
    #训练集生成器
    def generate_arrays_from_file(lines,batch_size):
        # 获取总长度
        n = len(lines)
        i = 0
        while 1:
            X_train = []
            Y_train = []
            # 获取一个batch_size大小的数据
            for _ in range(batch_size):
                if i==0:
                    np.random.shuffle(lines)
                name = lines[i].split(';')[0]
                # 从文件中读取图像
                img = Image.open(r"F:\202006Practice\cityscapesScripts-master\leftImg8bit\train" + '/' + name)
                img, _, _ = letterbox_image(img, (WIDTH, HEIGHT), "jpg")
    
                # img = img.resize((WIDTH,HEIGHT))
                # img = np.array(img)
                # img = img/255
                # X_train.append(img)
    
                name = (lines[i].split(';')[1]).replace("\n", "")
                # 从文件中读取图像
                label = Image.open(r"F:\202006Practice\cityscapesScripts-master\gtFine\train" + '/' + name)
                label, _, _ = letterbox_image(label, (HEIGHT, WIDTH), "png")
    
                img, label = get_random_data(img, label, [WIDTH, HEIGHT])
    
                # img = img.resize((WIDTH, HEIGHT))
                # img = np.array(img)
                # img = img / 255
                X_train.append(img)
    
                label = label.resize((int(WIDTH),int(HEIGHT)))
                label = np.array(label)
                seg_labels = np.zeros((int(HEIGHT),int(WIDTH),NCLASSES))
                for c in range(NCLASSES):
                    seg_labels[: , : , c ] = (label[:,:,0] == c ).astype(int)
                seg_labels = np.reshape(seg_labels, (-1,NCLASSES))
                Y_train.append(seg_labels)
    
                # 读完一个周期后重新开始
                i = (i+1) % n
            yield (np.array(X_train),np.array(Y_train))
    
    #验证集生成器
    def generate_arrays_from_file2(lines2,batch_size):
        # 获取总长度
        n = len(lines2)
        i = 0
        while 1:
            X_train = []
            Y_train = []
            # 获取一个batch_size大小的数据
            for _ in range(batch_size):
                if i==0:
                    np.random.shuffle(lines2)
                name = lines2[i].split(';')[0]
                # 从文件中读取图像
                img = Image.open(r"F:\202006Practice\cityscapesScripts-master\leftImg8bit\val" + '/' + name)
                img, _, _ = letterbox_image(img, (WIDTH, HEIGHT), "jpg")
    
                # img = img.resize((WIDTH,HEIGHT))
                # img = np.array(img)
                # img = img/255
                # X_train.append(img)
    
                name = (lines2[i].split(';')[1]).replace("\n", "")
                # 从文件中读取图像
                label = Image.open(r"F:\202006Practice\cityscapesScripts-master\gtFine\val" + '/' + name)
                label, _, _ = letterbox_image(label, (HEIGHT, WIDTH), "png")
    
                img, label = get_random_data(img, label, [WIDTH, HEIGHT])
    
                # img = img.resize((WIDTH, HEIGHT))
                # img = np.array(img)
                # img = img / 255
                X_train.append(img)
    
                label = label.resize((int(WIDTH),int(HEIGHT)))
                label = np.array(label)
                seg_labels = np.zeros((int(HEIGHT),int(WIDTH),NCLASSES))
                for c in range(NCLASSES):
                    seg_labels[: , : , c ] = (img[:,:,0] == c ).astype(int)
                seg_labels = np.reshape(seg_labels, (-1,NCLASSES))
                Y_train.append(seg_labels)
    
                # 读完一个周期后重新开始
                i = (i+1) % n
            yield (np.array(X_train),np.array(Y_train))
    
    
    def loss(y_true, y_pred):
        loss = K.categorical_crossentropy(y_true,y_pred)
        return loss
      
    if __name__ == "__main__":
        log_dir = "logs/"
        # 获取model
        model = Deeplabv3(classes=19,input_shape=(HEIGHT,WIDTH,3))
        # model.summary()
        # for i, layer in enumerate(model.layers):
        #     print(i, layer.name)
    
        # weights_path = get_file('deeplabv3_xception_tf_dim_ordering_tf_kernels.h5',WEIGHTS_PATH_X,cache_subdir='models')
    
        # weights_path = r"model/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5"
        weights_path = r"logs/middle1.h5"
        # weights_path = r"logs/ep009-loss0.188-val_loss0.232.h5"
        model.load_weights(weights_path,by_name=True)
    
        # 打开数据集的txt
        with open(r"F:\202006Practice\1.make_dataset\read_data\train_data0.txt","r") as f:
            lines = f.readlines()
    
        # 打开验证集数据集的txt
        with open(r"F:\202006Practice\1.make_dataset\read_data\val_data0.txt", "r") as f:
            lines2 = f.readlines()
    
        # 打乱行,这个txt主要用于帮助读取数据来训练
        # 打乱的数据更有利于训练
        np.random.seed(10101)
        np.random.shuffle(lines)
        np.random.shuffle(lines2)
        np.random.seed(None)
    
        # 90%用于训练,10%用于估计。
        # num_val = int(len(lines)*0.1)
        # num_train = len(lines) - num_val
        lines_len = int(len(lines))
        lines2_len = int(len(lines2))
    
        # 保存的方式,3世代保存一次
        checkpoint_period = ModelCheckpoint(
                                        log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
                                        monitor='val_loss', 
                                        save_weights_only=True, 
                                        save_best_only=True, 
                                        period=1
                                    )
        # 学习率下降的方式,acc三次不下降就下降学习率继续训练
        reduce_lr = ReduceLROnPlateau(
                                monitor='val_loss', 
                                factor=0.5, 
                                patience=3, 
                                verbose=1
                            )
        # 是否需要早停,当val_loss一直不下降的时候意味着模型基本训练完毕,可以停止
        early_stopping = EarlyStopping(
                                monitor='val_loss', 
                                min_delta=0, 
                                patience=10, 
                                verbose=1
                            )
    
        #=================================================================================================
        # #迁移学习,冻结主干网络不训练
        trainable_layer = 359
        for i in range(trainable_layer):
            model.layers[i].trainable = False
        print('freeze the first {} layers of total {} layers.'.format(trainable_layer, len(model.layers)))
    
        # 交叉熵
        model.compile(loss = loss,
                optimizer = Adam(lr=1e-3),
                metrics = ['accuracy'])
    
        batch_size = 2
        print('Train on {} samples, val on {} samples, with batch size {}.'.format(lines_len, lines2_len, batch_size))
    
        # 开始训练
        model.fit_generator(generate_arrays_from_file(lines, batch_size),
                steps_per_epoch=max(1, lines_len//batch_size),
    
                validation_data=generate_arrays_from_file2(lines2, batch_size),
                validation_steps=max(1, lines2_len//batch_size),
                epochs=15,
                initial_epoch=0,
                callbacks=[checkpoint_period, reduce_lr,early_stopping])
        model.save_weights(log_dir+'middle1.h5')
    
        #=================================================================================================
        # #训练全部网络
        # for i in range(len(model.layers)):
        #     model.layers[i].trainable = True
        # 交叉熵
        model.compile(loss=loss,
                      optimizer=Adam(lr=1e-3),
                      metrics=['accuracy'])
    
        batch_size = 2
        print('Train on {} samples, val on {} samples, with batch size {}.'.format(lines_len, lines2_len, batch_size))
    
        # 开始训练
        model.fit_generator(generate_arrays_from_file(lines, batch_size),
                            steps_per_epoch=max(1, lines_len // batch_size),
    
                            validation_data=generate_arrays_from_file2(lines2, batch_size),
                            validation_steps=max(1, lines2_len // batch_size),
                            epochs=15,
                            initial_epoch=0,
                            callbacks=[checkpoint_period, reduce_lr, early_stopping])
        model.save_weights(log_dir + 'last1.h5')
    
    展开全文
  • 图像处理笔记(1)

    2013-07-10 22:27:04
    (1)用计算机进行图像处理的前提是图像必须是以数字格式存储,以数字格式存放的图像称为数字图像。 (2)常见的各种照片、图片、海报、广告画都是模拟图像,要将模拟图像数字化需要使用数字化设备。目前将模拟图像...
  • 谷歌I/O走进TensorFlow开源模型世界:从图像识别到语义理解 2017-05-23 16:13:11 TensorFlow  2 0 0 一年一度的谷歌开发者大会 Google I/O 在山景城成功举行,在首日的 Keynote 中,谷歌宣布了...
  • 我们知道,在深度学习图像语意分割的训练过程中,需要有数据集及分好类的标签,这样才可以让你的神经网络进行学习,进而训练出模型,用来识别你想要识别的图片场景等。Cityscapes便是包含大量街道图片、视频用来训练...
  • 百度高级副总裁、AI技术平台体系(AIG)总负责人王海峰发布百度大脑3.0,并指出,百度大脑3.0的核心是“多模态深度语义理解”,包括数据的语义,知识的语义,以及图像、视频、声音、语音等各方面的理解。 多模态...
  • 2017年就这么悄无声息地过去了。在工业界,2016年是推荐的元年,2017年是中国的AI元年,这意味着路漫漫其修远兮~,而学术界往往会超前于工业界,有些时候难免会一厢情愿。过去的一年在nlp领域里,知识图谱的发展是...
  • 图像文件格式一般的图像文件结构主要都包含有文件头、文件体和文件尾等三部分文件头: 软件ID、软件版本号、图像分辨率、图像尺寸、图像深度、彩色类型、编码方式、压缩算法 文件体:图像数据、彩色变换表 文件尾:...
  • 第二篇文章,我们不介绍 反卷积结构,而是介绍CRF, 主要是因为,网络结构上,大家只要有相关的CNNs知识,是很好理解的,主要难于作者的创造性思想。这也是FCN能引用1500+的主要原因吧。这里从数学入手,来看DeepLab...
  • 机器学习(ML)、深度学习(DL)和图像处理(opencv)专用英语词典 百度翻译 http://fanyi.baidu.com/ A AAN (Active Appearance Model)主动外观模型 Adam(adaptive moment estimation,适应性矩估计),Adam是一...
  • 图像语意分割顾名思义是将图像像素按照表达的语义含义的不同进行分组/分割,图像语义是指对图像内容的理解,例如,能够描绘出什么物体在哪里做了什么事情等,分割是指对图片中的每个像素点进行标注,标注属于哪一...
  • 前言:经过将近一个月的陆续学习研究,在神经网络中训练多分类任务识别Cityscapes数据集,终于在最近得到了理想中的实验结果。在我陷入对细节参数调整不当及诸多问题时,苦于没有一篇能够“面向新手编程”的博客,...
  • 本文是对《Teaching Robots to Understand Semantic Concepts》一文进行的翻译。 原文地址 ...机器学习可以使机器人获得复杂的技能,如抓住和打开门。 然而,学习这些技能需要我们手动编制机
  • 利用图卷积模型大大提高生成图像语意丰富性的文章,一作是来自李飞飞实验组的 Justin Johnson,这位小哥的文章总是会有开源代码保证,点个赞先。由语意到生成图像,需要神经网络具有创造能力。所以,本文开头就引用...
  • 2015/02/04机器学习、自然语言处理、计算广告学vincentyao 3 图片语义分析 3.1 图片分类 图片分类是一个最基本的图片语义分析方法。 基于深度学习的图片分类 传统的图片分类如下图所示,首先需要先手工提取图片...
  • 云机器人软件结构

    2020-07-08 18:04:56
    关键:机器人+云计算+图像处理 图像处理相关 生成对抗式网络GAN,StackGAN 语意解析工具 NLTKF(Natural Language Toolkit) 根据像素坐标定义位置 机器人和云计算相关 RoboCloud (一个机器人云平台(找的信息较少...
  • ,以人工智能作为技术支撑,透过语音语意理解图像识别、衣物识别、人脸识别为入口,通过人工智能机器学习,理解用户所想,主动为用户提供舒适健康的生活。在我看来物联网的核心,尤其与物联网有关联的可穿戴、智能...
1 2 3 4 5 ... 20
收藏数 2,122
精华内容 848
关键字:

图像处理语意理解