机器学习

AI强化学习-策略迭代实战

以下代码演示策略迭代强化算法 前提: python语言 OpenAI gym库 主要演示AI自动寻路的算法。如图: 图中格子从做到右,从上到下依次编号,1~8.暗黄色的圆球,初始随机出现在1~5位置,在格子上移动。移动到黑色点失败,移动到黄色点胜利。 首先,写一个gym环境:grid_map.py,代码如下 import logging import numpy import random from gym import spaces import gym logger = logging.getLogger(__name__) class GridEnv(gym.Env): metadata = { 'render.modes': ['human', 'rgb_array'], 'video.frames_per_second': 2 } def __init__(self): self.states = [1,2,3,4,5,6,7,8] #状态空间 self.x = [140,220,300,380,460,140,300,460] self.y = [250,250,250,250,250,150,150,150] self.terminate_states = dict() #终止状态为字典格式 self.terminate_states[6] = 1 self.terminate_states[7] = 1 self.terminate_states[8] = 1 self.actions = ['n','e','s','w'] self.rewards = dict() #回报的数据结构为字典 self.rewards['1_s'] = -1.0 self.

机器学习、计算机视觉面经整理(持续完善整理中……)

算法岗计算机视觉方向求职经验总结 进入11月份,楼主找工作也基本进入尾声了,从7月份开始关注牛客网,在求职的过程中学到了不少,感谢牛客提供这样一个平台,让自己的求职历程不再孤单。 先说一下楼主教育背景,本科西部末流985,研究生调剂到帝都某文科学校.专业都是CS专业,求职方向都是计算机视觉算法。有某外企以及二线互联网实习经历,本科虽然CS出身,但实际动手能力并不强。研究生的研究方向并不是计算机视觉方向。实习的时候开始接触计算机视觉,自己比较感兴趣,开始转CV方向。回想这几个月的求职经历,其中的辛苦只有自己知道。最终拿到了百度SP,京东SSP,美团无人驾驶SP,顺丰科技SP,拼多多SP,以及虹软SP,思科,中电29等offer。 想把我学习与求职路上的一些心得告诉学弟学妹们。 1.一定要有一门自己比较熟悉的语言。 我由于使用C++比较多,所以简历上只写了C++。C++的特性要了解,C++11要了解一些,还有STL。面试中常遇到的一些问题,手写代码实现一个string类,手写代码实现智能指针类,以及STL中的容器的实现机制,多态和继承,构造函数, 析构函数等。推荐看一下网易云课堂翁恺老师的C++的视频以及经典的几本书。 2.一定要刷题 楼主主要刷了剑指offer以及leetcode上的easy,middle的题目。如果编程能力不是很强,推荐可以分类型进行刷题,按照tag来刷,对于某一类型的题目,可以先看一下该算法的核心思想,然后再刷题。楼主在求职的过程中,遇到好多跟leetcode上类似的题目,刷题的目的不是为了碰见原题,而是为了熟练算法。当然能够碰见原题最好不过啦。 3.机器学习的一些建议 推荐西瓜书,以及李航老师的统计学方法。另外熟悉一种深度学习框架。学习计算机,一定要实战,毕竟只有在实战的过程中,才能懂得更透彻。可以多参加一些比赛,比如kaggle,天池,滴滴的一些比赛。这对找工作的用处很大。 4.能实习就尽量实习。 如果导师是学术大牛,可以带你发顶会的论文,并且自己对方向比较感兴趣,那可以在实验室待着好好搞科研。如果你研究生的研究方向跟你以后的求职方向不一致,建议早点出来实习,找个对口的实习,实习才能发现,实际工作和在学校学习的东西差距比较大。 楼主能不能分享下面试问了哪些视觉的问题啊 问到的问题主要跟我实习做的东西有关,有关于视频拆分的一些算法,以及三维点云的一些问题,传统的图像处理的一些基本操作还是要了解的,比如滤波,边缘检测,以及常用的一些传统的特征,SIFT,SURF,HOG等。深度学习这方面,我主要做过目标检测,所以问到的就是rcnn,fast-rcnn,faster-rnn,yolo,ssd这些算法。另外,问过一些调参,正则化,Batch normalization,drop out,激活函数的选择。手动推导BP,LR,SVM,算法题主要有常规的排序,二分查找,BP相关的题目,还有一些就是关于二叉树的递归和非递归遍历,层次遍历,最近公共祖先等,其余的题目记得不太清楚了 深度学习面经 (1)代码题(leetcode类型),主要考察数据结构和基础算法,以及代码基本功 虽然这部分跟机器学习,深度学习关系不大,但也是面试的重中之重。基本每家公司的面试都问了大量的算法题和代码题,即使是商汤、face++这样的深度学习公司,考察这部分的时间也占到了我很多轮面试的60%甚至70%以上。我去face++面试的时候,面试官是residual net,shuffle net的作者;但他们的面试中,写代码题依旧是主要的部分。 大部分题目都不难,基本是leetcode medium的难度。但是要求在现场白板编程,思路要流畅,能做到一次性Bug-free. 并且,一般都是要给出时间复杂度和空间复杂度最优的做法。对于少数难度很大的题,也不要慌张。一般也不会一点思路也没有,尽力给面试官展现自己的思考过程。面试官也会引导你,给一点小提示,沿着提示把题目慢慢做出来也是可以通过面试的。 以下是我所遇到的一些需要当场写出完整代码的题目: <1> 二分查找。分别实现C++中的lower_bound和upper_bound. <2> 排序。 手写快速排序,归并排序,堆排序都被问到过。 <3> 给你一个数组,求这个数组的最大子段积 时间复杂度可以到O(n) <4> 给你一个数组,在这个数组中找出不重合的两段,让这两段的字段和的差的绝对值最大。 时间复杂度可以到O(n) <5> 给你一个数组,求一个k值,使得前k个数的方差 + 后面n-k个数的方差最小 时间复杂度可以到O(n) <6> 给你一个只由0和1组成的字符串,找一个最长的子串,要求这个子串里面0和1的数目相等。 时间复杂度可以到O(n) <7> 给你一个数组以及一个数K, 从这个数组里面选择三个数,使得三个数的和小于等于K, 问有多少种选择的方法? 时间复杂度可以到O(n^2) <8> 给你一个只由0和1组成的矩阵,找出一个最大的子矩阵,要求这个子矩阵是方阵,并且这个子矩阵的所有元素为1 时间复杂度可以到O(n^2) <9> 求一个字符串的最长回文子串 时间复杂度可以到O(n) (Manacher算法) <10> 在一个数轴上移动,初始在0点,现在要到给定的某一个x点, 每一步有三种选择,坐标加1,坐标减1,坐标乘以2,请问最少需要多少步从0点到x点。 <11> 给你一个集合,输出这个集合的所有子集。 <12> 给你一个长度为n的数组,以及一个k值(k < n) 求出这个数组中每k个相邻元素里面的最大值。其实也就是一个一维的max pooling 时间复杂度可以到O(n) <13> 写一个程序,在单位球面上随机取点,也就是说保证随机取到的点是均匀的。 <14> 给你一个长度为n的字符串s,以及m个短串(每个短串的长度小于10),每个字符串都是基因序列,也就是说只含有A,T,C,G这四个字母。在字符串中找出所有可以和任何一个短串模糊匹配的子串。模糊匹配的定义,两个字符串长度相等,并且至多有两个字符不一样,那么我们就可以说这两个字符串是模糊匹配的。

MATLAB surfl函数 surfc函数 效果图

function shili21 h0=figure('toolbar','none',... 'position',[200 100 450 450],... 'name','实例21'); [x,y,z]=peaks(30); subplot(2,1,1) x=x(1,:); y=y(:,1); i=find(y>0.8&y<1.2); j=find(x>-0.6&x<0.5); z(i,j)=nan*z(i,j); surfc(x,y,z) xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴'); title('Figure1:surfc函数形成的曲面') subplot(2,1,2) x=x(1,:); y=y(:,1); i=find(y>0.8&y<1.2); j=find(x>-0.6&x<0.5); z(i,j)=nan*z(i,j); surfl(x,y,z) xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴'); title('Figure2:surfl函数形成的曲面') surfl画的三维曲面有光照效果 surfc画的三维曲面在曲面底部有等高线图 有关nan的介绍: http://jingyan.baidu.com/article/afd8f4de42c3ab34e286e9bf.html

数字图像处理 – 图像分割 – 阈值处理

最近工作需要,开始学习图像处理啦。我们使用的软件是Adaptive Vision Studio。不过是收费的哟。无基础学习。所以先加强一下子基础啦咯 前期准备: 直方图 灰度直方图:不同灰度值的像素分量分别占像素总数的概率分布 p(rk) = nk/MN; rk:第k级的像素个数 MN:像素总数/行数 * 像素总数/列数 P(rk):归一化概率直方图 图像分割 输入图像,提取图像属性 一张图像R,可以分割为不同区域R1,R2,…,Rn 阈值处理(区域分割) 灰度阈值处理基础 —–《数字图像处理》 粗略的计算一下,阈值T T= (对象的灰度值+背景的灰度值)/ 2

【图像处理】Tensorflow:简易超分辨重建与坑

超分辨重建是图像复原领域的一大热点,能在硬件有限的情况下最大还原原始场景的信号,在天文探索、显微成像等领域有重要作用。成像设备对物体成像时,由于距离较远,成像会模糊,可以类比多尺度高斯滤波;受限于成像机能,成像像素达不到最理想条件,可类比为对原始像进行一个下采样。超分辨重建就是要在这种条件下复原原始图像。 假设上帝有最好的成像设备,成像为X;我们成像设备成像为B,高斯滤波模板设为G;为了防止问题病态,加入lasso正则。那么有: argmin [subsampling(conv(X,G))−B]2+λX 现在的问题是,Tensorflow如何表示subsampling并进行优化? Tensorflow支持以下几种图像缩放/采样: tf.image.resize_images,支持最近邻、双线性、双三次等缩放方法 tf.nn.max_pool 最大值下采样 tf.nn.avg_pool 均值下采样 现在我们逐个测试一下。图像经过三倍下采样: 1、tf.image.resize_images,双线性采样,振铃不严重,条纹很多: 2、tf.nn.max_pool,没有条纹、振铃,但是有一堆噪声,参数调了几次都没有什么更好的效果: 3、tf.nn.avg_pool,无条纹、噪声,有振铃,与原图相比颜色变暗,对比度下降: 4、来与原图做个对比 可以看出,效果最好的就是avg_pool了,在只有高斯模板参数,完全没有其他先验信息的情况,一秒钟内得到这个结果,已经让人非常惊讶了。猜测image-resize和max_pool其实在上下采样中都丢失相当多的信号,而avg_pool则保留了最多的信号,因此重建效果较好。 fast-neural-style文章提到过用感知特征来对图像进行超分辨重建,可以重建同样风格的细节,这个需要用生成网络对大量的图像进行训练,或者直接上vgg慢慢地计算感知特征来仿制风格细节。

Haar-like、HoG 、LBP 三种描述方法在目标识别中的优劣

Haar-like的优势在于能更好的描述明暗变化,因此用于检测正面的人脸 HoG的优势在于能更好的描述形状,在行人识别方面有很好的效果 LBP比haar快很多倍,但是提取的准确率会低(10-20% 取决于训练对象)如果是嵌入式或者移动端的开发,推荐使用LBP。 这也解释了为什么haar应用于人的正面检测要明显好于应用于侧脸检测:正脸由于鼻子等凸起的存在,使得脸上的光影变化十分明显。而侧脸侧脸最重要的特征是形状和轮廓。 所以用HoG描述符检测侧脸更加有效。 参考原文: https://www.quora.com/Why-are-HOG-features-more-accurate-than-Haar-features-in-pedestrian-detection It’s important to look at the most prominent feature of pedestrians. There can be more than one prominent feature but the defining feature of a typical pedestrian is the outline, the legs and head shape. Hence the detection method that best captures or describes the pedestrian outline will ultimately solve the pedestrian detection problem more accurately. HoG features are capable of capturing the pedestrian or object outline/shape better than Haar features.

骰子点数识别之图像分割

链接1:利用卷积神经网络识别骰子点数 链接1:利用神经网络识别骰子点数 前言 前段时间借用神经网络和卷积神经网络实现了骰子点数的识别,但是一个很严重的问题一直困扰我,那就是当两个骰子叠在一起的时候,将两个骰子分开并不是一件简单的事情。 下图是我在识别过程中产生的不能识别的,叠加在一起的图片素材。 面对这些形态各异的图片,有的时候是两个骰子一个角连在一起,有的是一条边,有的是三个骰子叠在一起。所以,很难找到一个满意的办法解决这个问题。 第一思路就是从原始的RGB图像着手,通过调整二值化阈值,希望能够将骰子对象分割开来,但是遗憾的是我试了好几种方法,都是不行的,原因在于原图像在交接的地方本来就很模糊,颜色变化很小,所以使用二值化阈值调整很难得到完美的解决方案。 期间我尝试了不同的方法 1. 分水岭 close all clc figure(1) subplot(231) RGB_img=imread('161220S010129.jpg'); imgsize =size(RGB_img); RGB_img = imcrop(RGB_img,[imgsize(1,2)*0.418 imgsize(1,1)*0.655 215 134]);%大部分图像布局固定 imshow(RGB_img) %% subplot(232) %imhist(A(:,:,1)); bw=im2bw(rgb2gray(RGB_img)); bw=medfilt2(bw); planes=bwareaopen(bw,100); imshow(planes) %% subplot(233) D=bwdist(imcomplement(planes)); D=mat2gray(D); imshow(D) figure subimage(D) hold on [C,h]=imcontour(D,0.2:0.2:0.8); set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2) text_handle = clabel(C,h,'color','g'); figure(1) %% subplot(234) M=imimposemin(imcomplement(D),D>.8); imshow(M); %% subplot(236) L=watershed(M); r=L & planes; imshow(r) %%%%%%%%%%%% stats=regionprops(r,'BoundingBox','Centroid'); hold on c=cat(1,stats.Centroid); plot(c(:,1),c(:,2),'r*') bb={stats.BoundingBox}; cellfun(@(x) rectangle('Position',x,'EdgeColor','y'),bb) %% subplot(235) L(r)=5; imshow(L,[]) 2.

matlab使用摄像头

1.整个过程需要做如下几件事情: 1)查询USB2.0Camera 的具体参数(imaqhwinfo) 2)创建视频输入对象(videoinput) 3)图像预览和显示(preview、stoppreview、closepreview和image) 4)获取视频图像(getsnapshot) 5)图像获取设备的获取和设置(get和set) 6)关闭视频对象(delete) 2.图像获取工具箱术语: 图像获取设备:比如摄像头、扫描仪 图像获取适配器:主要的目的是通过驱动在Matlab和图像获取设备之间传递信息 ROI:region-of-interest 感兴趣区域 3.常用函数 1)getselectedsource 2)imaqfind 3)isvalid 4)peekdata 5)getdata 6)imaqmontage 4.查询USB2.0Camera 的具体参数(imaqhwinfo) >> info=imaqhwinfo info = InstalledAdaptors: {'coreco' 'winvideo'} MATLABVersion: '7.10(R2010a)' ToolboxName: 'Image Acquisition Toolbox' ToolboxVersion: '3.5(R2010a)' >> win_info=imaqhwinfo('winvideo') win_info = AdaptorDllName:'D:\Program Files\MATLAB\R2010A\toobox\imaqadaptors\win32\mwwinvideoimaq.dll' AdaptorDllVersion: '3.5 (R2010a)' AdaptorName: 'winvideo' DeviceIDs: {[1]} DeviceInfo: [1x1 struct] > win_info.DeviceIDs ans = [1] >> dev_win_info=win_info.DeviceInfo dev_win_info = DefaultFormat: 'YUV2_160x120' DeviceFileSupported: 0 DeviceName: 'USB 口 口 口 口' DeviceID: 1 ObjectConstructor: 'videoinput('winvideo', 1)' SupportedFormats: {'YUV2_160x120' 'YUV2_176x144' 'YUV2_320x240' 'YUV2_352x288' 'YUV2_640x480'} >> dev_win_info.

基于深度学习的图像去噪(论文总结)

2015 深度学习、自编码器、低照度图像增强 Lore, Kin Gwn, Adedotun Akintayo, and Soumik Sarkar. “LLNet: A Deep Autoencoder Approach to Natural Low-light Image Enhancement.” arXiv preprint arXiv:1511.03995 (2015). 利用深度学习的自编码器方法训练不同低照度图像信号的特征来实现自适应变亮和去噪,主要是通过非线性暗化和添加高斯噪声的方法来模拟低照度环境,进行图像对比度增强和去噪。 2014 深度学习、深度卷积神经网络、图像去卷积 Xu, Li, et al. “Deep convolutional neural network for image deconvolution.”Advances in Neural Information Processing Systems. 2014. 利用深度卷积神经网络进行图像去卷积,实现图像复原,优点:相比于当前其他方法,有更好的PSNR值和视觉效果。 2014 深度学习、稀疏编码、自编码器、图像去噪 Li, HuiMing. “Deep Learning for Image Denoising.” International Journal of Signal Processing, Image Processing and Pattern Recognition 7.3 (2014): 171-180. 利用稀疏编码(sparsecoding)与自编码器(Auto-encoder)两种方法结合来实现图像去噪,不足之处是只对图像进行处理,没有涉及视频。 2014

泊松融合

拖拖拉拉快一个月了 这是探索出来的 但感觉效果不是特别好 我目前只能做到这样子了:想把左图的人放进右图的水池中 用泊松融合想实现无缝自然的效果: 左图是直接做mask镶嵌的结果 右图是解了泊松方程后的最终的结果 我所能得到的: 感觉效果不够好 因为这个理想结果是这样: 看这个就比我的自然很多很多 我的应该是有问题的 但我是按照步骤来的 目前不知道错在哪里 在找:[今天经过网友的提醒,找到了,原来是迭代次数问题,我这个效果是只迭代一次的,再迭代几次就能达到理想效果,那篇论文中没有提过这个迭代!害死我了] A=imread(‘F:\fisheye\pond.jpg’); src=A; [ma,na,ka]=size(A); dst=imread(‘F:\fisheye\swim.jpg’); se=strel(‘diamond’,10); B_erode=imerode(dst,se); Berodelogical=im2bw(B_erode); imshow(Berodelogical) B=dst; [mb,nb,kb]=size(B); >> for i=1:mb for j=1:nb if(Berodelogical(i,j)==1) Berodelogical(i,j)=0; else Berodelogical(i,j)=1; end end end dstX=100; dstY=100; for i=dstY:dstY+mb-1 for j=dstX:dstX+nb-1 ii=i-(dstY-1); jj=j-(dstX-1); if(Berodelogical(ii,jj)==1) A(i,j,1)=B(ii,jj,1); A(i,j,2)=B(ii,jj,2); A(i,j,3)=B(ii,jj,3); end end end ROI=uint8(zeros(mb,nb,3)); for i=dstY:dstY+mb-1 for j=dstX:dstX+nb-1 ii=i-(dstY-1); jj=j-(dstX-1); ROI(ii,jj,1)=A(i,j,1); ROI(ii,jj,2)=A(i,j,2); ROI(ii,jj,3)=A(i,j,3); end end w=[0,-1,1]; ROIgradienty=imfilter(double(ROI),w,’conv’); ROIgradientx=imfilter(double(ROI),w’,’conv’); %接下来对梯度求偏导得到融合图像的散度 lap