2019-06-16 09:40:51 weixin_42137700 阅读数 1592
  • 深度学习基础TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

https://www.toutiao.com/a6701130271518884366/

 

医学图像处理与深度学习入门

 

利用深度学习技术,分析图像与视频,并且将之应用在诸如自动驾驶,无人机等等领域已经成为最新研究方向。在最新的一篇名为“A Neural Algorithm of Artistic Style”[1508.06576] A Neural Algorithm of Artistic Style中,作者描述了一种新的方式,从艺术作品中获得,并且应用到图像中,生成新的图像。另外,在 “Generative Adversarial Networks” [1406.2661] Generative Adversarial Networks(GAN) and “Wasserstein GAN” https://arxiv.org/pdf/1701.07875.pdf文章中,作者提出了新的模型,这些模型能够生成,类似于我们给出的原始数据。至此开启了半监督学习的新世界,并且为半监督学习铺平了道路。

然而这些研究领域仍然停留在普通图像上,然而我们的目标是将这些研究应用于医学图像,进而辅助医疗诊断。在进入主题之前,我们将从图像处理的基础开始,介绍基本的医学图像格式数据,并且将这些数据可视化。在下一篇文章中,我们将深入CNN方法,并且利用Keras(Keras Documentation),对肺癌进行预测。

 

图像处理基础(python)

当前,图像处理工具可谓层出不穷,其中,OpenCV(OpenCV library) 因为其强大的社区支持,以及广泛的可用性,在c++, java python等等编程语言中皆可使用,因此,OpenCV已经成为图像处理主流工具。在这篇文章中,我们将使用jupyter notebook与OpenCV。

安装OpenCV:

pip install opencv-python 或者直接从http://opencv.org中下载并安装。

医学图像处理与深度学习入门

 

打开jupyter notebook, 并且确认是否可以 import cv2. 接下来我们将使用到numpy 和 matplotlib。

医学图像处理与深度学习入门

 

在notebook中 ,输入以下代码检验是否可以打开并且查看图像。

医学图像处理与深度学习入门

 

 

基本脸部识别

让我们做一些有趣的事情,比如检测脸部。为了检测脸部,我们将使用最初由Rainer Lienhart创建的基于开源xml残片的20x20柔和的adaboost正面人脸检测器。这里有一个好的帖子,详细介绍哈尔级联检测Face Detection using Haar Cascades。

医学图像处理与深度学习入门

 

在http://opencv.org中,还有很多类似的例子,http://docs.opencv.org/trunk/d6/d00/tutorial_py_root.html , 读者可以多多练习。现在我们已经了解一些基本的图像处理知识,下面我们将学习如何处理医学图像。

医学图像数据格式

医学图像采用数字成像和通信(DICOM)作为存储和交换医学图像数据的标准解决方案。这个标准的第一个版本是在1985年发布的。发展到现在,该方案有了一些改变。该标准使用文件格式和通信协议。

文件格式 - 所有患者医疗图像都以DICOM文件格式保存。除了其他图像相关数据(例如用于拍摄图像的设备以及医疗处理的一些背景)之外,该格式具有关于患者的PHI(受保护的健康信息),例如姓名,性别,年龄。医学影像设备创建DICOM文件。医生使用DICOM查看器,可显示DICOM图像的计算机软件应用程序,读取和诊断图像中的发现。

通信协议 - DICOM通信协议用于搜索档案中的成像研究,并将成像研究恢复到工作站以显示。连接到医院网络的所有医疗成像应用程序都使用DICOM协议来交换信息,主要是DICOM图像,还包括患者和手术信息。还有更先进的网络命令,用于控制和跟踪治疗,调度程序,报告状态,分担医生和成像设备之间的工作量。关于DICOM标准细节,在这里推荐一个很好的博客http://dicomiseasy.blogspot.com

分析DICOM图像

用于分析DICOM图像的一个很好的python包是pydicom。在本节中,我们将看到如何在Jupyter笔记本上呈现DICOM图像。安装OpenCV使用:pip install pydicom

安装pydicom软件包后,请回到jupyter笔记本。在笔记本中,导入dicom包和其他包,如下所示。

医学图像处理与深度学习入门

 

初次之外,我们还可以用pandas,scipy, skimage,mpl_toolkit 进行数据处理和分析。

医学图像处理与深度学习入门

 

接下来,我们介绍一些可以获得DICOM 数据库,如下:

  • kaggle competitions and Datasets
  • Dicom Library
  • Osirix Datasets
  • Visible Human Datasets
  • The Zubal Phantom

从以上数据库中下载dicom文件,并且载入jupyter notebook

医学图像处理与深度学习入门

 

医学图像处理与深度学习入门

 

第一步:在jupyter 中读取DICOM文件,并可视化

医学图像处理与深度学习入门

 

上图中,第一行代码,我们导入第一个dicom文件,我们使用它作为一个reference,用来获取元数据。

医学图像处理与深度学习入门

 

然后我们计算三维NumPy数组的总和,它们等于(切片中像素行的数量)x(切片中像素列的数量)x(切片的数量)沿着x,y和z笛卡尔坐标轴。最后,我们使用PixelSpacing和SliceThickness属性来计算三个轴上的像素之间的间距。我们将数组维存储在ConstPixelDims中,并将间距存储在ConstPixelSpacing [1]中。

医学图像处理与深度学习入门

 

医学图像处理与深度学习入门

 

医学图像处理与深度学习入门

 

第二步:进一步了解DICOM 格式数据:

CT扫描的测量单位是Hounsfield单位(HU),它是放射性强度的量度。仔细校准CT扫描仪以准确测量。关于这方面的详细了解可以在这里找到。https://web.archive.org/web/20070926231241/http://www.intl.elsevierhealth.com/e-books/pdf/940.pdf

每个像素被分配一个数值(CT值),它是相应体素中所有衰减值的平均值。将这个数字与水的衰减值进行比较,并在戈弗雷·豪斯菲尔德爵士(Sir Godfrey Hounsfield)之后以胡恩斯菲尔德单位(Hounsfield units,HU)的任意单位的比例显示。

这个标度将水分配为零的衰减值(HU)。CT数字的范围是2000HU宽,尽管一些现代扫描仪的HU的范围可以达到4000.每个数字代表在光谱两端的+1000(白色)和-1000(黑色)的灰色阴影。

医学图像处理与深度学习入门

 

一些扫描仪具有圆柱扫描边界,但是输出图像是方形的。落在这些边界之外的像素的固定值为-2000。

医学图像处理与深度学习入门

 

第一步通常是将这些值设置为0.接下来,让我们回到HU单位,通过乘以重新调整斜率并添加拦截(这些拦截方便地存储在扫描的元数据中!)。

 

Acknowledgements

【1】https://pyscience.wordpress.com/2014/09/08/dicom-in-python-
【2】importing-medical-image-data-into-numpy-with-pydicom-and-vtk/
【3】http://www.osirix-viewer.com/resources/dicom-image-library/
【4】http://wearables.cc.gatech.edu/paper_of_week/viola01rapid.pdf
【5】http://adilmoujahid.com/posts/2016/06/introduction-deep-learning-python-caffe/
【6】http://dicomiseasy.blogspot.com/
【7】https://www.kaggle.com/c/data-science-bowl-2017
【8】http://docs.opencv.org/trunk/d6/d00/tutorial_py_root.html
Kaggle community for all the different scripts and support

 

作者 | william张真人william张真人 - 知乎

版权声明

本文版权归《william张真人》,转载请自行联系

2018-05-30 17:25:09 fengzhongluoleidehua 阅读数 1403
  • 深度学习基础TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

深度学习笔记
深度学习(六十九)darknet 实现实验 Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffma

深度学习(六十八)darknet使用

深度学习(六十七)metal forge深度学习库使用

深度学习(六十六)生成模型、最大化似然、KL散度

深度学习(六十五)移动端网络MobileNets

深度学习(六十四)Faster R-CNN物体检测

深度学习(六十三)空间变换网络

深度学习(六十二)SqueezeNet网络设计思想笔记

深度学习(六十一)NNPACK 移植与实验

深度学习(六十)网络压缩简单总结

深度学习(五十九)mxnet移植至android

深度学习(五十八)caffe移植至mxnet

深度学习(五十七)tensorflow andorid yolo物体检测测试

深度学习(五十六)tensorflow项目构建流程

深度学习(五十五)tensorflow分布式训练

深度学习(五十四)图片翻译WGAN实验测试

深度学习(五十三)对抗网络

深度学习(五十二)变分贝叶斯自编码器(下)

深度学习(五十一)变分贝叶斯自编码器(上)

深度学习(五十)基于条件对抗网络的图片翻译

深度学习(四十九)Tensorflow提高代码效率笔记

深度学习(四十八)InfoGAN学习笔记

深度学习(四十七)DSD正则化训练方法

深度学习(四十六)Adversarial Autoencoders

深度学习(四十五)条件对抗网络

深度学习(四十四)变分贝叶斯自编码器(上)

深度学习(四十三)条件变分自编码器概述

深度学习(四十二)word2vec词向量学习笔记

深度学习(四十一)cuda8.0+ubuntu16.04+theano、caffe、tensorflow环境搭建

深度学习(四十)caffe使用点滴记录

深度学习(三十九)可视化理解卷积神经网络(2.0)

深度学习(三十八)卷积神经网络入门学习(2.0)

深度学习(三十七)优化求解系列之(1)简单理解梯度下降

深度学习(三十六)异构计算CUDA学习笔记(1)

深度学习(三十五)异构计算GLSL学习笔记(1)

深度学习(三十四)对抗自编码网络-未完待续

深度学习(三十三)CRF as RNN语义分割-未完待续

深度学习(三十二)半监督阶梯网络学习笔记

深度学习(三十一)基于深度矩阵分解的属性表征学习

深度学习(三十)贪婪深度字典学习

深度学习(二十九)Batch Normalization 学习笔记

深度学习(二十八)基于多尺度深度网络的单幅图像深度估计

深度学习(二十七)可视化理解卷积神经网络

深度学习(二十六)Network In Network学习笔记

深度学习(二十五)基于Mutil-Scale CNN的图片语义分割、法向量估计

深度学习(二十四)矩阵分解之基于k-means的特征表达学习

深度学习(二十三)Maxout网络学习

深度学习(二十二)Dropout浅层理解与实现

深度学习(二十一)基于FCN的图像语义分割

深度学习(二十)基于Overfeat的图片分类、定位、检测

深度学习(十九)基于空间金字塔池化的卷积神经网络物体检测

深度学习(十八)基于R-CNN的物体检测

深度学习(十七)基于改进Coarse-to-fine CNN网络的人脸特征点定位

深度学习(十六)基于2-channel network的图片相似度判别

深度学习(十五)基于级联卷积神经网络的人脸特征点定位

深度学习(十四)基于CNN的性别、年龄识别

深度学习(十三)caffe之训练数据格式

深度学习(十二)从自编码到栈式自编码

深度学习(十一)RNN入门学习

深度学习(十)keras学习笔记

深度学习(九)caffe预测、特征可视化python接口调用

深度学习(八)RBM受限波尔兹曼机学习-未完待续

深度学习(七)caffe源码c++学习笔记

深度学习(六)caffe入门学习

深度学习(五)caffe环境搭建

深度学习(四)卷积神经网络入门学习

深度学习(三)theano入门学习

深度学习(二)theano环境搭建

深度学习(一)深度学习学习资料

图像处理
图像处理2

图像处理(二十三)基于调色板的图像Recoloring

图像处理(二十二)贝叶斯抠图

图像处理(二十一)基于数据驱动的人脸卡通动画生成

图像处理(十九)基于移动最小二乘的图像变形

图像处理(十四)图像分割(4)grab cut的图割实现

图像处理(十三)保刚性图像变形算法

图像处理(十二)图像融合(1)Seamless cloning泊松克隆

图像处理(十一)图像分割(3)泛函能量LevelSet、snake分割

图像处理(九)人物肖像风格转换

图像处理(十)基于特征线的图像变形-

图像处理(七)导向滤波磨皮

图像处理(六)递归双边滤波磨皮

图像处理(四)图像分割(2)测地距离Geodesic图割

图像处理(三)图像分割(1)Random Walks分割

https://blog.csdn.net/hjimce/article/details/50573444

主要阐述了一系列rcnn用到的算法以及目前发展流程,做一个综合的整理 rcnn->spp-net->fast-rcnn->faster-rcnn->yolo->ssd->R-FCN 小小搬运工,希望对大家有帮助 :)

https://blog.csdn.net/column/details/ym-alanyannick.html

2018-11-20 10:04:47 liaopiankun0618 阅读数 1790
  • 深度学习基础TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

医学图像数据格式

医学图像采用数字成像和通信(DICOM)作为存储和交换医学图像数据的标准解决方案。这个标准的第一个版本是在1985年发布的。发展到现在,该方案有了一些改变。该标准使用文件格式和通信协议。

文件格式 - 所有患者医疗图像都以DICOM文件格式保存。除了其他图像相关数据(例如用于拍摄图像的设备以及医疗处理的一些背景)之外,该格式具有关于患者的PHI(受保护的健康信息),例如姓名,性别,年龄。医学影像设备创建DICOM文件。医生使用DICOM查看器,可显示DICOM图像的计算机软件应用程序,读取和诊断图像中的发现。

通信协议 - DICOM通信协议用于搜索档案中的成像研究,并将成像研究恢复到工作站以显示。连接到医院网络的所有医疗成像应用程序都使用DICOM协议来交换信息,主要是DICOM图像,还包括患者和手术信息。还有更先进的网络命令,用于控制和跟踪治疗,调度程序,报告状态,分担医生和成像设备之间的工作量。关于DICOM标准细节,在这里推荐一个很好的博客http://dicomiseasy.blogspot.com

分析DICOM图像

用于分析DICOM图像的一个很好的python包是pydicom。初次之外,我们还可以用pandas,scipy, skimage,mpl_toolkit 进行数据处理和分析。
接下来,我们介绍一些可以获得DICOM 数据库,如下:

  • kaggle competitions and Datasets
  • Dicom Library
  • Osirix Datasets
  • Visible Human Datasets
  • The Zubal Phantom

在医学影像处理中使用的到的深度学习的模型框架主要有:

  • SAE(stack auto-encoder) 无监督学习方案,逐层训练,得到特征描述为主
  • RBM(restricted Boltzmann machine) 无监督学习方案,与SAE 类似
  • CNN(convolutional neural network)
    卷积神经网络,使用最为广泛,可以用来提取图片特征或者直接完成分类检测等任务
  • RNN(recurrent neural network) 循环神经网络,用来获取时序上的信息,在CT等逐行扫描图像中使用
  • U-net (with a single downsampling stage)
    类似于带short-cut的全卷机网络,用来融合不同尺度的图像的特征
  • FCNN(fully convolutional neural network)
  • 全卷机网络,可以获取与原图相同分辨率的图片,常用于分割等任务 FRCNN(Faster Region-proposal based neural network)

深度学习框架

  • caffe
  • tensorflow
  • torch
  • Theano

暂时没有使用到的深度学习技术

  • VAE
  • GAN

State of Arts
在这里插入图片描述

深度学习在医学图像领域的一些限制

  • 缺少高质量的标注的训练样本,因此训练出来的模型可能是过拟合的或者说推广性不好,因此需要将的到的模型放在各种情况下测试推广性]

  • 深度学习得到的模型是一个黑盒子,无法解释其有效性,在一些特殊的情况下会出现非常奇怪无法解释的问题,因此在医疗行业中的接受度也是一个问题[^doc3]
    在商业系统中使用临床上的图片资料会存在法律和伦理上的问题而不使用这样的样本无法进一步的提高深度学习模型的水平

2D VS 3D

从文献综述来看,大部分的工作都是基于2D图像的,其实在医学图像中,CT 和 MRI都是3D的数据2D化的结果,在医疗图像处理的算法中3D重建等等也是非常重要的一大类算法,但是现有的基于3D的算法一来耗时比较高,二来并没有比基于2D的算法提高很多,使用2D还是3D是一个值得思考的问题。

Feature vs Result

从文献综述中来看,稍微久远一些的算法就是把CNN当作是一个特征提取的算子获得图像的描述特征而最新的一些方法直接将CNN的结果就作为最终的输出结果来使用, 这里喔感觉直接使用CNN的输出作为结果,会涉及到文献中所说的黑盒子的限制,可解释型一般是比较差的,而作为特征来使用解释性可能会好一些,因为后续的一些后处理中可以增加的规则类的比较多,解释性会更佳

过滤 vs 诊断

一直以来作者觉得在医疗行业中,计算机能做的最大的贡献就是帮助医生做大量医学影像的过滤工作,至于使用诊断上最多也只是一个辅助的诊断工具,而机器学习到达了深度学习的时代,有些本来以为不太可能的任务都被深度学习算法一个一个的攻克了,在未来的工作做,计算机深度学习是不是可能独立的进行本属于医生独享的诊断工作我还是不得而知,然后我们可以知道的是,技术的发展使得过滤的正确率大大的提高,极大的提高生产的效率,这一方面是肯定有助于医疗行业的,相应深度学习在医疗领域的前景还是很广阔的。
原文:https://zhuanlan.zhihu.com/p/27568550

2018-08-28 18:45:32 dimei0938 阅读数 1670
  • 深度学习基础TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

这两天为了找工作,焦头烂额,越查别人的面试经越深知自己实力不济,基础不牢,毕竟半路出家,在基础上会有很多大不如人的地方。。
没办法,反正选择了这条路,只能一头扎进去了,大不了读个图像的博(实在是不想)
想来想去,还是来更个博,一来在总结中学习的可以稍微扎实一点,二来我的这个辣鸡博客也写简历上了,能稍微多加一点是一点。。
这篇博客里,我会总结一下各种深度学习+图像处理的算法,可能细节部分会有所遗失,希望有人能在下面补充啦。。
首先第一项是图像识别,也就是给一张图片,输入到一个网络里,然后会输出结果,这个结果就是整个网络对这张图片识别的结果。这里网络主要是使用CNN网络。
在说CNN网络之前,要先提一下BP(back propagation)神经网络。BP神经网络是86年由D.E.Ru melhart提出的。如名,这种神经网络是具有反向传播能力的,它可以对组成前向多层网络的各人工神经元之间的连接权值进行不断的修改,从而使该前向多层网络能够将输入它的信息变换成所期望的输出信息。之所以将其称作为反向学习算法,是因为在修改各人工神经元的连接权值时,所依据的是该网络的实际输出与其期望的输出之差,将这一差值反向一层一层的向回传播,来决定连接权值的修改。
这种网络的结构是一个前向的多层网络,学习过程是由信号的正向传播与误差的反向传播两个过程完成。这种过程一直进行到网络输出的误差减小到可以接受的程度或者到了预定学习次数为止。各节点的传输函数一般用sigmoid函数。训练之后,一般得到的是每一层之间的权重矩阵。
这个误差一般用什么来表示呢?一说是用损失(loss)函数,另一说是用代价(cost)函数,还有一说是目标(object)函数。实际上代价函数可以认为是所有损失函数的加总,代价函数越小,说明结构鲁棒性就越好。还有一个概念要先提一下,是风险(risk)函数。风险函数是损失函数的期望值,而由于分布是未知的,所以无法计算。不过我们有训练集,这个训练集的损失函数期望叫做经验风险(experiment risk)。
在拟合过程中,经验风险函数最小并不是最好的状态,由于过度学习历史数据的关系,在真正预测时效果会很不好,这种情况称之为过拟合(over fitting)。这种结果的原因一般都是因为拟合的函数过于复杂,使结构风险增大。
结构风险也就是函数的复杂度有另一个函数来度量,在机器学习中称为正则化(regularization)。一般常用的有L1,L2范数。我们最终需要优化的结果,就是结构风险加经验风险,也就是上面所说的目标函数。
说一下L1,L2范数。对于线性回归模型,L1正则化的模型叫做lasso回归,L2正则化的模型叫做Ridge回归(岭回归)。区别在于:
L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为||w||1;
L2正则化是指权值向量w中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为||w||2。
L1正则化容易产生稀疏权值矩阵,即产生稀疏模型,进而可以用于特征的选择;而L2正则化不容易产生稀疏权值,他们的作用都是防止模型过拟合。
(原理层面有一篇文章说的非常好,给出链接:
https://blog.csdn.net/zouxy09/article/details/24971995
说完了目标函数的问题,接下来就说如何通过反向传播来改变目标函数值。
简要来讲,就是首先计算输出层的误差,然后计算隐含层的误差,推导出参数变化率,再向着梯度的反方向更新参数。
更细节的部分由于时间问题,不在上边摆了,推荐两篇博客:
https://blog.csdn.net/u014303046/article/details/78200010(数学推导)
https://blog.csdn.net/mao_xiao_feng/article/details/53048213(推导例子)
如果你看完了这两篇博客,那应该对bp神经算法有所了解了。
bp神经算法还有各种改进版本,最为人所知的就是增加动量项:
标准BP算法在调整权值时,只按t时刻误差的梯度下降方向调整,而没有考虑t时刻以前的梯度方向,从而常使训练过程发生振荡,收敛缓慢。为了提高训练速度,可以在权值调整公式中加一动量项。大多数BP算法中都增加了动量项,以至于有动量项的BP算法成为一种新的标准算法。
还有一些改进方式,比如学习速度可变(VLBP)、学习速度自适应调节、引入陡度因子等。这方面了解不多,以后可能会单独拿出来总结www
(另:听说有的面试岗位还要写bp的代码实现还有svm的代码实现,惊了,对我来说还是有难度,在这里写一下,权当预习)

import math
import random
import string

random.seed(0)

# 生成区间[a, b)内的随机数
def rand(a, b):
    return (b-a)*random.random() + a

# 生成大小 I*J 的矩阵,默认零矩阵 (当然,亦可用 NumPy 提速)
def makeMatrix(I, J, fill=0.0):
    m = []
    for i in range(I):
        m.append([fill]*J)
    return m

# 函数 sigmoid,这里采用 tanh,因为sigmoid梯度下降的好慢啊(不知道为啥)
def sigmoid(x):
    return math.tanh(x)

# 函数 sigmoid 的派生函数, 为了得到输出 (即:y)(另,如上面使用sigmoid,此处应该是x*(1-x))
def dsigmoid(y):
    return 1.0 - y**2

class NN:
    ''' 三层反向传播神经网络 '''
    def __init__(self, ni, nh, no):
        # 输入层、隐藏层、输出层的节点(数)
        self.ni = ni + 1 # 增加一个偏差节点
        self.nh = nh
        self.no = no

        # 激活神经网络的所有节点(向量)
        self.ai = [1.0]*self.ni
        self.ah = [1.0]*self.nh
        self.ao = [1.0]*self.no

        # 建立权重(矩阵)
        self.wi = makeMatrix(self.ni, self.nh)
        self.wo = makeMatrix(self.nh, self.no)
        # 权重设为随机值
        for i in range(self.ni):
            for j in range(self.nh):
                self.wi[i][j] = rand(-0.2, 0.2)
        for j in range(self.nh):
            for k in range(self.no):
                self.wo[j][k] = rand(-2.0, 2.0)

        # 最后建立偏置(矩阵)
        self.ci = makeMatrix(self.ni, self.nh)
        self.co = makeMatrix(self.nh, self.no)

    def update(self, inputs):
        if len(inputs) != self.ni-1:
            raise ValueError('与输入层节点数不符!')

        # 激活输入层
        for i in range(self.ni-1):
            #self.ai[i] = sigmoid(inputs[i])
            self.ai[i] = inputs[i]

        # 激活隐藏层
        for j in range(self.nh):
            sum = 0.0
            for i in range(self.ni):
                sum = sum + self.ai[i] * self.wi[i][j]
            self.ah[j] = sigmoid(sum)

        # 激活输出层
        for k in range(self.no):
            sum = 0.0
            for j in range(self.nh):
                sum = sum + self.ah[j] * self.wo[j][k]
            self.ao[k] = sigmoid(sum)

        return self.ao[:]

    def backPropagate(self, targets, N, M):
        ''' 反向传播 '''
        if len(targets) != self.no:
            raise ValueError('与输出层节点数不符!')

        # 计算输出层的误差
        output_deltas = [0.0] * self.no
        for k in range(self.no):
            error = targets[k]-self.ao[k]
            output_deltas[k] = dsigmoid(self.ao[k]) * error

        # 计算隐藏层的误差
        hidden_deltas = [0.0] * self.nh
        for j in range(self.nh):
            error = 0.0
            for k in range(self.no):
                error = error + output_deltas[k]*self.wo[j][k]
            hidden_deltas[j] = dsigmoid(self.ah[j]) * error

        # 更新输出层权重
        for j in range(self.nh):
            for k in range(self.no):
                change = output_deltas[k]*self.ah[j]
                self.wo[j][k] = self.wo[j][k] + N*change + M*self.co[j][k]
                self.co[j][k] = change
                #print(N*change, M*self.co[j][k])

        # 更新输入层权重
        for i in range(self.ni):
            for j in range(self.nh):
                change = hidden_deltas[j]*self.ai[i]
                self.wi[i][j] = self.wi[i][j] + N*change + M*self.ci[i][j]
                self.ci[i][j] = change

        # 计算误差
        error = 0.0
        for k in range(len(targets)):
            error = error + 0.5*(targets[k]-self.ao[k])**2
        return error

    def test(self, patterns):
        for p in patterns:
            print(p[0], '->', self.update(p[0]))

    def weights(self):
        print('输入层权重:')
        for i in range(self.ni):
            print(self.wi[i])
        print()
        print('输出层权重:')
        for j in range(self.nh):
            print(self.wo[j])

    def train(self, patterns, iterations=1000, N=0.05, M=0.1):
        # N: 学习速率(learning rate)
        # M: 动量因子(momentum factor)
        for i in range(iterations):
            error = 0.0
            for p in patterns:
                inputs = p[0]
                targets = p[1]
                self.update(inputs)
                error = error + self.backPropagate(targets, N, M)
            if i % 100 == 0:
                print('误差 %-.5f' % error)


def demo():
    # 教神经网络学习逻辑异或(XOR
    pat = [
        [[0,0], [0]],
        [[0,1], [1]],
        [[1,0], [1]],
        [[1,1], [0]]
    ]

    # 创建一个神经网络:输入层有两个节点、隐藏层有两个节点、输出层有一个节点
    n = NN(2, 2, 1)
    # 用一些模式训练它
    n.train(pat)
    # 测试训练的成果
    n.test(pat)
    # 看看训练好的权重
    n.weights()


if __name__ == '__main__':
    demo()

记下来也不是一件简单的事呀。。
好吧,算这一块pass了,日后再来复习。
然后说到最常用的是CNN(卷积神经网络)。卷积代码实现倒是蛮简单的,主要来说一下不同结构之间的区别,优劣,以及不同层的作用等等,想到哪说哪。。
ps: 会不会有点长?要不要分下p?
先介绍一下及基础的吧!
这里写图片描述
这个图是发展历程,可以看到我们比较熟悉的LeNet,AlexNet,VGG,ResNet,还有后面要总结的R-CNN等等,还有一张图片是说明准确率和运算量的关系的:
这里写图片描述
终于上传图成功了,有时间我会把之前的图给补上的!(找完工作之后八)
然后这篇就到这里,我会直接跟进下一章的,主要就是讲上上面这个图,把这些神经网络的特点啊,突破啊乱七八糟的东西都总结一下w
鸣谢我引用的几个文章,都在文章里有链接!还有后面这张图的链接也鸣谢一下:
https://www.cnblogs.com/whenyd/p/7886637.html

2019-02-26 16:49:15 mvcreating 阅读数 428
  • 深度学习基础TensorFlow实践教程

    本课程主要介绍了深度学习的基础原理和TensorFlow系统基本使用方法。TensorFlow是目前机器学习、深度学习领域优秀的计算系统之一,本课程将结合实例介绍使用TensorFlow开发机器学习应用的详细方法和步骤,着重讲解了用于图像识别的卷积神经网络和用于自然语言处理的循环神经网络的理论知识及其TensorFlow实现方法,并结合实际场景和例子描述了深度学习技术的应用范围与效果。 所有案例均来自讲师团队工作中的亲身实践,所选案例均是深度学习的经典应用,非常具有代表性。

    21447 人正在学习 去看看 AI100讲师

深度学习算法现在是图像处理软件库的组成部分。在他们的帮助下,可以学习和训练复杂的功能;但他们的应用也不是万能的。

“机器学习”和“深度学习”有什么区别?

在机器视觉和深度学习中,人类视觉的力量和对视觉信息的理解可以被再现甚至超越。借助深度学习,作为机器学习的一部分,可以在应用实例的基础上学习和训练复杂的关系。

机器学习中的另一种技术是例如“超级矢量机”。与深度学习相比,必须手动定义和验证功能。在深度学习中,神经网络采用这一手动步骤:在训练过程中,独立地自动识别和提取特征。

深度学习为图像处理技术和图像处理检查提供了哪些选择?

深度学习可用于典型的分类应用,例如缺陷检测或“好”和“坏”对象之间的区别。经过适当训练的网络可用于解决所有图像处理任务,其中系统决定图像中是否存在某些类型的缺陷。深度学习对于传统机器视觉方法无效应用尤其有用。例如,当由于对象或错误类的复杂性而没有普遍有效的方法来解决问题时就是这种情况。

由于各种潜在缺陷,实际上不可能手动开发能够检测和定位整个可想到的错误范围的算法。这些可以是各种损坏,例如划痕,裂缝或凹痕,其又可以具有许多不同的形状或尺寸。在用于错误检测的传统方法中,机器视觉专家将不得不单独地查看和评估大量图像,并且在此基础上编程尽可能详细地描述相应缺陷的算法。这个过程非常耗时耗力。

深度学习可以显着简化缺陷检测和缺陷检查:该技术可以自主学习特定缺陷特征,从而可以识别特定的问题类别。如果用户使用预训练的深度学习网络,例如MVTec的图像处理软件Halcon的那些网络,则每节课只需要几百个单独的样本图像。基于样本图像,算法可以训练各种各样的缺陷类型,然后可靠地识别它们。

图像处理技术中的深度学习和基于图像处理的检查有哪些局限性?

深度学习通常用于分类,对象检测和语义分割领域。

深度学习是一种有用的工具,可以补充机器视觉应用作为一种补充技术。然而,单靠深度学习无法解决这些复杂的任务,因为技术只是分类数据的另一种方法。在这种情况下非常重要的是一个提供所有图像处理工具的综合工具箱。因为只有通过不同过程的组合才能完全掌握包括预处理和后处理在内的复杂应用。

特别是在嵌入式视觉系统中,必须考虑其他因素:由于此处必须分析大量数据,因此培训通常会消耗大量资源,因此在嵌入式设备上无利可图。而且,数据分类引起了很多努力,因此需要大的计算能力和适当的硬件。因此,特别是对于时间要求极高的应用,标准CPU通常是不够的。相反,需要功能强大的硬件,如高性能GPU,这是工业嵌入式系统中的例外。

作为图像处理软件的一部分,深度学习需要哪些算法?

作为综合训练过程的一部分,深度学习算法可以独立地学习这些特征的典型特定模式。系统分析预先分类的图像,自动将它们分配给特定的类,并检查该“预测”是否与实际类别相对应。重复该过程直到实现最佳“预测”结果。通过这种方式,您可以训练模型(分类器),使用这些模型可以将新捕获的图像分类到此处学习的类中。

目前已经存在哪些具有深度学习的图像处理技术应用程序,这些应用程序是未来可以想到的?

存在大量深度学习架构,每个架构对于各个应用具有某些优点和缺点。为了在高度专业化和复杂的应用中实现强大的检测率,客户需要针对其需求进行优化和培训的网络。 “一刀切”的原则通常与此无关。

许多基于深度学习的应用程序都包含在嵌入式领域中。这里使用各种硬件组件来加速深度学习算法的运行时间。所需要的是可以在各种专用深度学习计算单元上使用的框架。

转载请注明:新机器视觉 » 图像处理中的深度学习技术

没有更多推荐了,返回首页