机器学习

AI:问题思考

人类在识别物体的时候也是分层次进行识别的,如果物体是一个比较简单的易于识别的物体,那么可能很快就会被识别出来,但是一个比较复杂的物体(比如被遮挡的物体,或者是明暗不明显的物体)可能需要进行仔细的观察然后才能识别出物体的具体信息。 该想法是否可以应用到AI领域(卷积神经网络中),即在卷积神经网络的不同层对已经识别的特征进行输出,这样可以减少网络的计算量,如果在较浅层无法输出清晰正确的结果,那么可以在深层继续进行输出。 在图片分类中采用线性分类,更多的是一种对颜色敏感的分类模型,如果是采用灰度图像,那么线性分类器的效果可能会很差。 对图片的线性分类中的权重矩阵W,可以取出每一行的数据,将其还原成和原始图片大小相同的图片,可以还原出和分类数量相同的图片数量。还原的每一张图片表示其分类中的颜色权重值。 正则化的作用: a. 增加模型的泛化作用 b. 对权重矩阵进行特征选择,L2可以让权重矩阵更加的平局,L1可以获得稀疏的权重空间,本质上正则化就是权重矩阵W解空间的一个选择器 ,在同样满足条件的W空间中,选取具有想要特征的W值 比较不同损失函数之间的区别 softmax 加交叉熵的损失 SVM hinge loss softmax 会考虑到所有的输出数值,而svm只会考虑到和真值相聚较小的数值(相距较大的数值被忽略,不会对损失造成影响) softmax计算损失的时候,为什么需要对数化目标概率 为了更加方便的计算,同时可以将损失缩放还原到一个相对合理的计算空间中。 也是为了数学上的优美

matlab中关于矩阵数组数据图像化的方法总结

应用目的 1、材料研究中试样接头处不同部位的硬度是不一样的,有时候为了形象的表示该现象,需要将不同位置的硬度数据图像化。 2、能谱面扫描时,牛津仪器给出的图像时依据明暗调节的,图像并不好看,如果可以保留原始数据,zaimatlab中将明暗做成云图将会让结果非常好看。 源数据类型 与位置相关的数据。可以理解为一个大的二维矩阵,每个位置存在不同的数据。 方法及命令 imshow等。 原始数据 。。。。。。。。。。。。。。。 方法0:最笨的方法 X=[对应每个点的横坐标,,,,,,,,,,] Y=[对应每个点的纵坐标,,,,,,,,,,] Z=[对应每个点的具体数值,,,,,,,,,] fill(X,Y,Z) shading interp; colorbar; axis equal; 方法1: 首先需要导入excel数据并保存呈mat格式 将mat格式打开并采用table2array命令转换成矩阵 然后采用imshow命令 load(hardness.mat) A=table2array(hardness) %该函数可以将table数据变为数组,即double. imshow(A) 然而存在如下问题 1 图片为白色;2 图片为灰度图 在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵A其数据类型会从unit8型变成double型。如果直接运行imshow(A),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。 即使采用采取各个数据与最大值相除,然而=1的位置仍为白色,因此imshow命令并不合适 imshow(B,[])等效于C=B/max(max(B)) imshow(C,[]) 方法2: linspace是Matlab中的一个指令,用于产生指定范围内的指定数量点数,相邻数据跨度相同,并返回一个行向量。 调用方法:linspace(x1,x2,N) 功 能:用于产生x1,x2之间的N点行矢量,相邻数据跨度相同。其中x1、x2、N分别为起始值、终止值、元素个数。若缺省N,默认点数为100。 举个例子 A=linspace(-6,6,4) 运行结果如下:A=-6 -2 2 6 意思就是 -6为起点 6为终点 4指向量的个数 且是均匀的分段的。 如在命令窗口中输入: X=linspace(5,100,20) 将输出: X = 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100

全局低照度图像增强matlab

clear; clc; close all; %读入图片 A=imread('before.png'); % A= rgb2gray(A); % mean2(A) % std2(A) %显示源图片 figure ; imshow(A); title('RGB Original Image') %调用ALTM outval = ALTM(A); % mean2(outval) % std2(outval) %输出目标图像 figure ; imshow(outval); %图像增强函数 function outval = ALTM(I) II = im2double(I); Ir=double(II(:,:,1)); Ig=double(II(:,:,2)); Ib=double(II(:,:,3)); % % % % Global Adaptation % input world luminance values Lw = 0.299 * Ir + 0.587 * Ig + 0.114 * Ib; % Lw = im2double(I); % % % the maximum luminance value Lwmax = max(max(Lw)); [m, n] = size(Lw);%[]矩阵表示 % % % log-average luminance Lwaver = exp(sum(sum(log(0.

MATLAB中如何设置网格线的颜色,透明度,粗细等

在MATLAB的命令窗中输入: help grid 打开grid的帮助页,最下面会有各种属性的设置命令: 从图中可见,GridColor可以调整颜色,GridAlpha可以调整网格线颜色深浅(也可以说是透明度),LineWidth可以调整线宽等等。 使用举例: set(gca,'ygrid','on','gridlinestyle','--','Gridalpha',0.4)

MATLAB中的plot()函数

xk=315:0.01:1575; temp=157.5; a=temp ./xk; plot(xk,a); %hold on %plot(xk,a); %hold off grid minor; axis([250 1650 0 0.6]); xlabel('5级暗纹的距离'); ylabel('a的距离'); grid minor; 添加细密的网格线 grid on;添加网格线 axis([xmin xmax ymin ymax]); 设置最大最小的xy坐标范围 xlabel(‘5级暗纹的距离’); 设置xy坐标的名称 ylabel(‘a的距离’); hold on 继续向plot()函数图像上添加图像 hold off 结束这个动作

MNIST手写数字数据集的读取,基于python3

MNIST 是一个入门级别的计算机视觉数据库,也是机器学习领域最有名的数据集之一。当我们开始学习编程的时候,第一件事往往就是打“Hello world”。而在机器学习中,识别 MNIST 就相当于编程中的“Hello world”。 MNIST 中包含了手写数字0~9的图片以及他们对应的标签。如下图所示: MNIST 数据集的官网是http://yann.lecun.com/exdb/mnist/,我们可以从这里手动下载数据集。 你可以在官网上下载到下面四个压缩包: train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz t10k-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz 解压后得到四个文件: 训练集图像:t10k-images.idx3-ubyte 训练集标签:t10k-labels.idx1-ubyte 测试集图像:train-images.idx3-ubyte 测试集标签:train-labels.idx1-ubyte MNIST数据集文件格式说明 训练集中有60,000个样本,测试集中有5,000个样本。所有图像都被标准化为28*28像素,像素值在0~255之间,0表示背景,255表示前景。 文件格式说明(以训练集为例): 图片文件格式说明: ---------------------------------------- [字节位置] [类型] [值] [描述] 0000 32位整型 2051 幻数 0004 32位整型 60000 图片数 0008 32位整型 28 行数 0012 32位整型 28 列数 0016 无符号字节 ?? 像素 0017 无符号字节 ?? 像素 ...... xxxx 无符号字节 ?? 像素 ---------------------------------------- 标签文件格式说明: ---------------------------------------- [字节位置] [类型] [值] [描述] 0000 32位整型 2049 幻数 0004 32位整型 60000 标签数 0008 无符号字节 ?

MATLAB打开USB摄像头的操作以及常见问题

1 前言 2 打开USB摄像头并写视频 2.1 摄像头相关操作 2.2 写视频相关操作 3 查询摄像头设备信息指令 4 常见问题 1 前言 如果你是视频技术处理研究领域的工程人员,那么用MATLAB&OpenCV打开摄像头,以及获取相关信息,是再常规不过的操作了。 本文是对MATLAB打开USB摄像头操作的知识点梳理和总结。 操作环境 MATLAB 2015b Logitech HD720P Windows 10 Enterprise 64Bit 2 打开USB摄像头并写视频 2.1 摄像头相关操作 video_source = videoinput('winvideo',1); preview(video_source); 这两行指令就可以打开USB摄像头,并预览显示了,当然,这里采用的都是默认参数,如果想控制视频参数,可以通过set方法。 video_source = videoinput('winvideo',1,‘RGB24_640x480’); set(video_source,'ReturnedColorSpace','rgb'); preview(video_source); 此时打开摄像头成功,会有一个弹窗出现显示实时的画面。 如果想在某一时刻获取视频帧,可以这样操作 frame = getsnapshot(video_source); image(frame); 获取的帧是从视频输入流中直接获取,可以通过时间函数来控制获取的频率,获取的帧可以存储在一个矩阵当中,作为一个视频流,方便计算。 2.2 写视频相关操作 打开摄像头,更多的操作是保存一段视频,这要用到一个保存操作。 video_source = videoinput('winvideo',1,'RGB24_640x480'); set(video_source,'ReturnedColorSpace','rgb'); preview(video_source); file_name = 'test.avi'; % 创建一个写文件的对象 writer = VideoWriter(file_name,'Motion JPEG AVI'); writer.FrameRate = 30.0; % 通过总帧数来控制视频长度 length = 300; % MATLAB里的视频文件其实是包含了两个部分的复合结构体, % 这两个部分,一个是色域colormap,一个是视频数据内容 file.

2017CS231n李飞飞深度视觉识别笔记(一)——计算机视觉概述和历史背景

第一章 计算机视觉概述和历史背景 课时1 计算机视觉概述 计算机视觉:针对视觉数据的研究。 关键是如何用算法来开发可以利用和理解的数据,视觉数据存在的问题是它们很难理解,有时把视觉数据称为“互联网的暗物质”,它们构成了网络上传输的大部分数据。 根据YouTube的一个统计实例:大概每秒钟,有长达5小时的数据内容会被上传到YouTube,所以通过人工给每个视频标上注释、分类是非常困难甚至不可能的,计算机视觉是解决这种问题的重要技术,它能够对照片进行标签、分类,处理视频的每一帧。 计算机视觉是一个与很多领域紧密关联的学科,它涉及到比如说工程、物理、生物等许多不同的领域: 对于CS231n这么课程,它专注于一类特定的算法,围绕神经网络,特别是卷积神经网络,并将其应用于各种视觉识别任务。 课时2 计算机视觉历史背景 视觉的历史可以追溯到很久以前,动物拥有视觉的开端: 如今,视觉成为了最重要的感知系统,人类的大脑皮层中有几乎一半的神经元与视觉有关,这项最重要的感知系统可以使人们生存、工作、运动等等,视觉对人们真的至关重要。 以上谈到了人类的视觉,那么人类让计算机获得视觉的历史又是怎么样的呢? 现在知道的最早的相机追溯到17世纪文艺复兴时期的暗箱,这是一种通过小孔成像的相机,这和动物早期的眼睛非常相似,通过小孔接收光线,后面的平板手机信息并且投影成像。 同时,生物学家开始研究视觉的机理,最具影响力并且启发了计算机视觉的一项研究是在五六十年代,休伯尔和威泽尔使用电生理学的研究,他们提出了“哺乳动物的视觉处理机制是怎样的”,通过观察何种刺激会引起视觉皮层神经的激烈反应,他们发现猫的大脑的初级视觉皮层有各种各样的细胞,其中最重要的是当它们朝着某个特定方向运动时,对面向边缘产生回应的细胞。 他们发现视觉处理是始于视觉世界的简单结构,面向边缘,沿着视觉处理的途径的移动信息也在变化,大脑建立了复杂的视觉信息,直到它可以识别更为复杂的视觉世界。 计算机视觉的历史是从60年代开始,从Larry Roberts的计算机视觉的第一篇博士论文开始。 1966年,一个如今非常著名的MIT暑期项目“Summer Vision Project”,它试图有效的使用暑期工作时间来构建视觉系统的重要组成部分,五十年来,计算机视觉领域已经从哪个夏季项目发展成为全球数千名研究人员的领域,并且仍然处理一些最根本的问题,这个领域已经成长为人工智能领域最重要和发展最快的领域之一。 70年代后期David Marr撰写的一本非常有影响力的书,内容包括了他是如何理解计算机视觉和应该如何开发可以使计算机识别世界的算法,他指出了为了拍摄一幅图像并获得视觉世界的最终全面3D表现必须经历的几个过程,如下图所示: 这是一个非常理想化的思想过程,也是一个非常直观化的方式并考虑如何解构视觉信息。 70年代另一个重要的开创性问题:如何越过简单的块状世界并开始识别或表示现实世界的对象? 一个被称为“广义圆柱体”,一个被称为“图形结构”,他们的基本思想是每个对象都是由简单的几何图形单位组成,所以任何一种表示方法是将物体的复杂结构简约成一个集合体。 80年代David lowe思考的如何重建或识别由简单的物体结构组成的视觉空间,它尝试识别剃须刀,通过线和边缘进行构建,其中大部分是直线之间的组合。 从60年代到80年代,考虑的问题是计算机视觉的任务是什么,要解决物体识别的问题非常难。所以,当思考解决视觉问题过程中出现的问题时,另一个重要的问题产生:如果识别目标太难,首先要做的是目标分割。 这个任务就是把一张图片中的像素点归类到有意义的区域,可能不知道这些像素点组合到一起是一个人形,但可以把属于人的像素点从背景中抠出来,这个过程就叫作图像分割。 下面是Malik和Jianbo shi完成的用一个算法对图像进行分割: 还有一个重要的研究是由Paul Viola和Michael Jones完成的,使用AdaBoost算法进行实时面部检测,在这个研究后不久推出了第一个能在数码相机中实现实时面部检测的数码相机,所以这是从基础科学研究到实际应用的一个快速转化。 关于如何做到更好的目标识别,是可以继续研究的领域,,所以在90年代末和21世纪的前几年,一个重要的思想方法就是基于特征的目标识别。由David Lowe完成的叫做SIFT特征,思路是匹配整个目标。 通过观察目标的某些部分、某些特征,它们往往能够在变化中具有表现性和不变性,所以目标识别的首要任务是在目标上确认这些关键的特征,然后把这些特征与相似的目标进行匹配,它比匹配整个目标要容易的多。例如,上图中一个stop标识中的SIFT特征与另一个stop标识中的SIFT特征相匹配。 有些工作是把这些特征放在一起以后,研究如何在实际图片中比较合理地设计人体姿态和辨认人体姿态,这方面一个工作被称为“方向梯度直方图”,另一个被称为“可变部件模型”。 所以,从60年代、70年代、80年代一直到21世纪,图片的质量随着互联网的发展,计算机视觉领域也能拥有更好的数据了,直到21世纪早期,才开始真正拥有标注的数据集能够衡量在目标识别方面取得的成果,其实一个最著名的数据集叫做PASCAL Visual Challenge。 与此同时,提出了一个重要的问题:是否具备了识别真是世界中的每一个物体的能力或者说大部分物体。这个问题也是由机器学习中的一个现象驱动:大部分的机器学习算法,无论是图模型还是SVM、AdaBoost都可能会在训练过程中过拟合。因此,有这两方面的动力,一是单纯想识别自然界中的万物,二是要回归机器学习克服瓶颈—过拟合问题,开始开展了一个ImageNet的项目,汇集所有能找到的图片,组建一个尽可能大的数据集。 这是当时AI领域最大的数据集,将目标检测算法的发展推到了一个新的高度,尤其重要的是如何推动基准测试的进展。 下面是ImageNet挑战赛的从2010到2015的图像分类结果: 横轴表示年份,纵轴表示比赛结果的错误率,可以看到错误率正在稳步下降。可以看到图中2012的错误率下降的非常显著,这一年的算法是一种卷积神经网络模型,这也将是这门课程学习的重点,深入研究什么是卷积神经网络模型,也就是现在被熟知的深度学习。 课时3 CS321n课程概述 CS321n将聚焦于视觉识别问题,第一个主要问题就是图像分类问题:让算法接收一张图作为输入,从固定的类别集合中选出该图像所属的类别。这个基本的分类器在很多地方都有不同的应用。 在CS231n课程中,将讨论一些其他的视觉识别问题,它们都建立在专门为图像分类而开发的各种工具之上,一些和图像分类的问题,比如目标检测或图像摘要生成。 图像分类关注的是大图整体,目标检测则告诉你物体具体出现在图片的哪个位置以及物体之间的联系是什么,图像摘要是当给到一幅图像,需要生成一段句子来描述这幅图像。 CNN,卷积神经网络只是深度学习架构的一种,但是它的成功是压倒性的,成为了目标识别的重要工具。回到ImageNet挑战赛中,2012年Krizhevsky和他的导师提出了卷积神经网络,并夺得了冠军;而在这之前,一直都是特征+支持向量机的结构,一种分层结构;而在这之后,获得冠军的算法都是卷积神经网络。 然而,卷积神经网络并不是一夜之间就成功的,事实上,这些算法可以追溯到更早的时候,与卷积神经网络有关的其中一项基础性工作是由Yann LeCun和他的伙伴于90年代完成的,1998年他们利用卷积神经网络进行数字识别。 所有既然这些算法在90年代就很突出,为什么到最近几年才变得这么流行呢?从数学的角度来说,有很重要的两点引起了深度学习架构的复兴,一个是摩尔定律,计算能力在变得越来越高;另一个是数据,算法需要大量的数据,需要给它们提供非常多的带标签的图像和像素,以便能最终取得更好的效果,有了大数据集,可以实现更强大的模型。 在计算机视觉领域,正尝试着制造一个拥有和人类一样视觉能力的机器,这样可以利用这些视觉系统可以实现很多惊奇的事情,但是当继续在该领域深入的时候,仍然有着大量的挑战和问题亟待解决,比如对整个照片进行密集标记、感知分组、使能够确定每个像素点的归属,这些仍是研究中的问题,所以需要持续不断地改进算法,从而做到更好。 与简单的“在物体上贴标签”比起来,我们往往希望深入地理解图片中的人们在做什么、各个物体之间的关系是什么,于是我们开始探究物体之间的联系,这是一个被称为视觉基因组的项目。 计算机视觉领域的一个愿景即是“看图说故事”,人类的生物视觉系统是非常强大的,看到一张图片,就能够描述图片的内容,并且只需不到一秒种的时间,如果能够让计算机也能做的同样的事情,那毋庸置疑是一项重大的突破;如果要实现真实深刻的图像理解,如今的计算机视觉算法仍然有很长的路要走。 计算机视觉能让世界变得更加美好,它还可以被应用到类似医学诊断、自动驾驶、机器人或者和这些完全版不同的领域。

DL学习笔记-图像预处理

一、为什么使用图像预处理 1、图像的亮度、对比度等属性对图像的影响是非常大的,相同物体在不同的亮度,对比度下差别非常大。在图像识别的问题中,我们经常会遇到阴影、强曝光之类的图片,这些因素都不应该影响最后的识别结果,所以我们要对图像进行预处理,使得得到的神经网络模型尽可能小的被无关因素所影响。 2、在我们遇到图像样本过少,或者不均衡时,也可以使用图像预处理,增加样本数量。 3、有时物体拍摄的角度不同,也会有很大的差异,所以刻意将图像进行随机的翻转,可以提高模型健壮性。 二、图像处理函数 1、读取图像的原始数据。 图像在存储是并不是直接记录这些矩阵中的数字,而是记录经过压缩编码之后的结果,所以要将一个图片还原成三维矩阵,需要一个解码的过程。 image_raw_data = tf.gfile.FastGFile('images/image_0043.jpg', 'rb').read() img_data = tf.image.decode_jpeg(image_raw_data) 2、图像大小调整 图像大小调整有两种方法, 第一种是通过算法使得新的图像尽量保存原始图像上的所有信息。 第二种是对图像进行裁剪或者填充,只获得感兴趣区域。 TensorFlow提供了四种缩放图像的算法,注意要加入截断函数,防止数值越界。 #重新调整图片大小 def resize(image_data): with tf.Session() as sess: image_data = tf.image.convert_image_dtype(image_data, dtype=tf.float32) methods=['Bilinear Interpolation', 'Nearest neighbor interpolation', 'Bicubic interpolation', 'Area interpolation'] plt.subplot(231), plt.imshow(image_data.eval()), plt.title('original') step = 231 for i in range(4): step += 1 resized = tf.image.resize_images(image_data, [300, 300], method=i) resized = tf.clip_by_value(resized, 0.0, 1.0) plt.subplot(step),plt.imshow(resized.eval()), plt.title(methods[i]) plt.show() 显示图像如下: 剪裁和填充图片,通过tf.image.resize_image_with_crop_or_pad函数实现,第一参数是输入图像,后面是裁剪以后的大小。如果小于输入图像,那么就裁剪输入图像居中部分的大小;如果大于输入图像,就填充输入图像四周。 #裁剪和填充图片 def crop_and_pad(image_data): with tf.

先验算法(Apriori Algorithm)原理及python代码实现

先验算法(Apriori Algorithm)是关联规则学习的经典算法之一。先验算法的设计目的是为了处理包含交易信息内容的数据库(例如,顾客购买的商品清单,或者网页常访清单。)而其他的算法则是设计用来寻找无交易信息(如Winepi算法和Minepi算法)或无时间标记(如DNA测序)的数据之间的联系规则。关联分析的目的是从大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:频繁项集或者关联规则。频繁项集(frequent item sets)是指经常出现在一起的物品的集合,关联关系(association rules)暗示两种物品之间可能存在很强的关系。 先验算法采用广度优先搜索算法进行搜索并采用树结构来对候选项目集进行高效计数。它通过长度为 k-1的候选项目集来产生长度为k的候选项目集,然后从中删除包含不常见子模式的候选项。根据向下封闭性引理,该候选项目集包含所有长度为 k的频繁项目集。之后,就可以通过扫描交易数据库来决定候选项目集中的频繁项目集。 from __future__ import division, print_function import numpy as np import itertools class Rule(): def __init__(self, antecedent, concequent, confidence, support): self.antecedent = antecedent self.concequent = concequent self.confidence = confidence self.support = support class Apriori(): """A method for determining frequent itemsets in a transactional database and also for generating rules for those itemsets. Parameters: ----------- min_sup: float The minimum fraction of transactions an itemets needs to occur in to be deemed frequent min_conf: float: The minimum fraction of times the antecedent needs to imply the concequent to justify rule "