【无标题】
用keras框架较为方便首先安装anaconda,然后通过pip安装keras以下转自wphh的博客。#coding:utf-8'''GPU run command:THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 pythonCPU run command:python 2016.06.06更新:这份代码是keras开发初期写的,当时ker
怎样用python构建一个卷积神经网络
用keras框架较为方便首先安装anaconda,然后通过pip安装keras以下转自wphh的博客。
#coding:utf-8''' GPU run command: THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python CPU run command: python 2016.06.06更新:这份代码是keras开发初期写的,当时keras还没有现在这么流行,文档也还没那么丰富,所以我当时写了一些简单的教程。
现在keras的API也发生了一些的变化,建议及推荐直接上看更加详细的教程。
'''#导入各种用到的模块组件from __future__ import absolute_importfrom __future__ import print_functionfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom import Dense, Dropout, Activation, Flattenfrom keras.layers.advanced_activations import PReLUfrom keras.layers.convolutional import Convolution2D, MaxPooling2Dfrom keras.optimizers import SGD, Adadelta, Adagradfrom keras.utils import np_utils, generic_utilsfrom six.moves import rangefrom data import load_dataimport randomimport numpy as np(1024) # for reproducibility#加载数据data, label = load_data()#打乱数据index = [i for i in range(len(data))]random.shuffle(index)data = data[index]label = label[index]print(data.shape[0], ' samples')#label为0~9共10个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数label = np_utils.to_categorical(label, 10)################开始建立CNN模型################生成一个modelmodel = Sequential()#第一个卷积层,4个卷积核,每个卷积核大小5*5。
1表示输入的图片的通道,灰度图为1通道。
#border_mode可以是valid或者full,具体看这里说明:.conv2d#激活函数用tanh#你还可以在(Activation('tanh'))后加上dropout的技巧: (Dropout(0.5))(Convolution2D(4, 5, 5, border_mode='valid',input_shape=(1,28,28))) (Activation('tanh'))#第二个卷积层,8个卷积核,每个卷积核大小3*3。
4表示输入的特征图个数,等于上一层的卷积核个数#激活函数用tanh#采用maxpooling,poolsize为(2,2)(Convolution2D(8, 3, 3, border_mode='valid'))(Activation('tanh'))(MaxPooling2D(pool_size=(2, 2)))#第三个卷积层,16个卷积核,每个卷积核大小3*3#激活函数用tanh#采用maxpooling,poolsize为(2,2)(Convolution2D(16, 3, 3, border_mode='valid')) (Activation('relu'))(MaxPooling2D(pool_size=(2, 2)))#全连接层,先将前一层输出的二维特征图flatten为一维的。
#Dense就是隐藏层。16就是上一层输出的特征图个数。
4是根据每个卷积层计算出来的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4#全连接有128个神经元节点,初始化方式为normal(Flatten())(Dense(128, init='normal'))(Activation('tanh'))#Softmax分类,输出是10类别(Dense(10, init='normal'))(Activation('softmax'))##############开始训练模型###############使用SGD + momentum#model.compile里的参数loss就是损失函数(目标函数)sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=["accuracy"])#调用fit方法,就是一个训练过程. 训练的epoch数设为10,batch_size为100.#数据经过随机打乱shuffle=True。
verbose=1,训练过程中输出的信息,0、1、2三种方式都可以,无关紧要。show_accuracy=True,训练时每一个epoch都输出accuracy。
#validation_split=0.2,将20%的数据作为验证集。
(data, label, batch_size=100, nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)"""#使用data augmentation的方法#一些参数和调用的方法,请看文档datagen = ImageDataGenerator( featurewise_center=True, # set input mean to 0 over the dataset samplewise_center=False, # set each sample mean to 0 featurewise_std_normalization=True, # divide inputs by std of the dataset samplewise_std_normalization=False, # divide each input by its std zca_whitening=False, # apply ZCA whitening rotation_range=20, # randomly rotate images in the range (degrees, 0 to 180) width_shift_range=0.2, # randomly shift images horizontally (fraction of total width) height_shift_range=0.2, # randomly shift images vertically (fraction of total height) horizontal_flip=True, # randomly flip images vertical_flip=False) # randomly flip images# compute quantities required for featurewise normalization # (std, mean, and principal components if ZCA whitening is applied)(data)for e in range(nb_epoch): print('-'*40) print('Epoch', e) print('-'*40) print("Training...") # batch train with realtime data augmentation progbar = generic_utils.Progbar(data.shape[0]) for X_batch, Y_batch in (data, label): loss,accuracy = model.train(X_batch, Y_batch,accuracy=True) (X_batch.shape[0], values=[("train loss", loss),("accuracy:", accuracy)] )"""。
谷歌人工智能写作项目:神经网络伪原创

怎样用python构建一个卷积神经网络模型
上周末利用python简单实现了一个卷积神经网络,只包含一个卷积层和一个maxpooling层,pooling层后面的多层神经网络采用了softmax形式的输出写作猫。
实验输入仍然采用MNIST图像使用10个featuremap时,卷积和pooling的结果分别如下所示。
部分源码如下:[python] viewplain copy#coding=utf-8'''''Created on 2014年11月30日@author: Wangliaofan'''import numpyimport structimport matplotlib.pyplot as pltimport mathimport randomimport copy#testfrom BasicMultilayerNeuralNetwork import BMNN2def sigmoid(inX):if (-inX)== 0.0:return 999999999.999999999return 1.0/((-inX))def difsigmoid(inX):return sigmoid(inX)*(1.0-sigmoid(inX))def tangenth(inX):return (1.0*(inX)-1.0*(-inX))/(1.0*(inX)+1.0*(-inX))def cnn_conv(in_image, filter_map,B,type_func='sigmoid'):#in_image[num,feature map,row,col]=>in_image[Irow,Icol]#features map[k filter,row,col]#type_func['sigmoid','tangenth']#out_feature[k filter,Irow-row+1,Icol-col+1]shape_image=numpy.shape(in_image)#[row,col]#print "shape_image",shape_imageshape_filter=numpy.shape(filter_map)#[k filter,row,col]if shape_filter[1]>shape_image[0] or shape_filter[2]>shape_image[1]:raise Exceptionshape_out=(shape_filter[0],shape_image[0]-shape_filter[1]+1,shape_image[1]-shape_filter[2]+1)out_feature=numpy.zeros(shape_out)k,m,n=numpy.shape(out_feature)for k_idx in range(0,k):#rotate 180 to calculate convc_filter=numpy.rot90(filter_map[k_idx,:,:], 2)for r_idx in range(0,m):for c_idx in range(0,n):#conv_temp=numpy.zeros((shape_filter[1],shape_filter[2]))(in_image[r_idx:r_idx+shape_filter[1],c_idx:c_idx+shape_filter[2]],c_filter)(conv_temp)if type_func=='sigmoid':out_feature[k_idx,r_idx,c_idx]=sigmoid(sum_temp+B[k_idx])elif type_func=='tangenth':out_feature[k_idx,r_idx,c_idx]=tangenth(sum_temp+B[k_idx])else:raise Exceptionreturn out_featuredef cnn_maxpooling(out_feature,pooling_size=2,type_pooling="max"):k,row,col=numpy.shape(out_feature)max_index_Matirx=numpy.zeros((k,row,col))out_row=int(numpy.floor(row/pooling_size))out_col=int(numpy.floor(col/pooling_size))out_pooling=numpy.zeros((k,out_row,out_col))for k_idx in range(0,k):for r_idx in range(0,out_row):for c_idx in range(0,out_col):temp_matrix=out_feature[k_idx,pooling_size*r_idx:pooling_size*r_idx+pooling_size,pooling_size*c_idx:pooling_size*c_idx+pooling_size]out_pooling[k_idx,r_idx,c_idx](temp_matrix)max_index=numpy.argmax(temp_matrix)#print max_index#print max_index/pooling_size,max_index%pooling_sizemax_index_Matirx[k_idx,pooling_size*r_idx+max_index/pooling_size,pooling_size*c_idx+max_index%pooling_size]=1return out_pooling,max_index_Matirxdef poolwithfunc(in_pooling,W,B,type_func='sigmoid'):k,row,col=numpy.shape(in_pooling)out_pooling=numpy.zeros((k,row,col))for k_idx in range(0,k):for r_idx in range(0,row):for c_idx in range(0,col):out_pooling[k_idx,r_idx,c_idx]=sigmoid(W[k_idx]*in_pooling[k_idx,r_idx,c_idx]+B[k_idx])return out_pooling#out_feature is the out put of convdef backErrorfromPoolToConv(theta,max_index_Matirx,out_feature,pooling_size=2):k1,row,col=numpy.shape(out_feature)error_conv=numpy.zeros((k1,row,col))k2,theta_row,theta_col=numpy.shape(theta)if k1!=k2:raise Exceptionfor idx_k in range(0,k1):for idx_row in range( 0, row):for idx_col in range( 0, col):error_conv[idx_k,idx_row,idx_col]=\max_index_Matirx[idx_k,idx_row,idx_col]*\float(theta[idx_k,idx_row/pooling_size,idx_col/pooling_size])*\difsigmoid(out_feature[idx_k,idx_row,idx_col])return error_convdef backErrorfromConvToInput(theta,inputImage):k1,row,col=numpy.shape(theta)#print "theta",k1,row,coli_row,i_col=numpy.shape(inputImage)if row>i_row or col> i_col:raise Exceptionfilter_row=i_row-row+1filter_col=i_col-col+1detaW=numpy.zeros((k1,filter_row,filter_col))#the same with conv valid in matlabfor k_idx in range(0,k1):for idx_row in range(0,filter_row):for idx_col in range(0,filter_col):subInputMatrix=inputImage[idx_row:idx_row+row,idx_col:idx_col+col]#print "subInputMatrix",numpy.shape(subInputMatrix)#rotate theta 180#print numpy.shape(theta)theta_rotate=numpy.rot90(theta[k_idx,:,:], 2)#print "theta_rotate",theta_rotate(subInputMatrix,theta_rotate)detaW[k_idx,idx_row,idx_col](dotMatrix)detaB=numpy.zeros((k1,1))for k_idx in range(0,k1):detaB[k_idx](theta[k_idx,:,:])return detaW,detaBdef loadMNISTimage(absFilePathandName,datanum=60000):images=open(absFilePathandName,'rb')()index=0magic, numImages , numRows , numColumns = struct.unpack_from('>IIII' , buf , index)print magic, numImages , numRows , numColumnsindex += struct.calcsize('>IIII')if magic != 2051:raise Exceptiondatasize=int(784*datanum)datablock=">"+str(datasize)+"B"#nextmatrix=struct.unpack_from('>47040000B' ,buf, index)nextmatrix=struct.unpack_from(datablock ,buf, index)nextmatrix=numpy.array(nextmatrix)/255.0#nextmatrix=nextmatrix.reshape(numImages,numRows,numColumns)#nextmatrix=nextmatrix.reshape(datanum,1,numRows*numColumns)nextmatrix=nextmatrix.reshape(datanum,1,numRows,numColumns)return nextmatrix, numImagesdef loadMNISTlabels(absFilePathandName,datanum=60000):labels=open(absFilePathandName,'rb')()index=0magic, numLabels = struct.unpack_from('>II' , buf , index)print magic, numLabelsindex += struct.calcsize('>II')if magic != 2049:raise Exceptiondatablock=">"+str(datanum)+"B"#nextmatrix=struct.unpack_from('>60000B' ,buf, index)nextmatrix=struct.unpack_from(datablock ,buf, index)nextmatrix=numpy.array(nextmatrix)return nextmatrix, numLabelsdef simpleCNN(numofFilter,filter_size,pooling_size=2,maxIter=1000,imageNum=500):decayRate=0.01MNISTimage,num1=loadMNISTimage("F:\Machine Learning\UFLDL\data\common\\train-images-idx3-ubyte",imageNum)print num1row,col=numpy.shape(MNISTimage[0,0,:,:])out_Di=numofFilter*((row-filter_size+1)/pooling_size)*((col-filter_size+1)/pooling_size)MLP=BMNN2.MuiltilayerANN(1,[128],out_Di,10,maxIter)MLP.setTrainDataNum(imageNum)MLP.loadtrainlabel("F:\Machine Learning\UFLDL\data\common\\train-labels-idx1-ubyte")MLP.initialweights()#MLP.printWeightMatrix()rng = numpy.random.RandomState(23455)W_shp = (numofFilter, filter_size, filter_size)W_bound = (numofFilter * filter_size * filter_size)W_k=rng.uniform(low=-1.0 / W_bound,high=1.0 / W_bound,size=W_shp)B_shp = (numofFilter,)B= numpy.asarray(rng.uniform(low=-.5, high=.5, size=B_shp))cIter=0while cIter。
Python主要内容学的是什么?
第一步:Python开发基础Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。
第二步:Python高级编程和数据库开发Python全栈开发与人工智能之Python高级编程和数据库开发知识学习内容包括:面向对象开发、Socket网络编程、线程、进程、队列、IO多路模型、Mysql数据库开发等。
第三步:前端开发Python全栈开发与人工智能之前端开发知识学习内容包括:Html、CSS、JavaScript开发、Jquery&bootstrap开发、前端框架VUE开发等。
第四步:WEB框架开发Python全栈开发与人工智能之WEB框架开发学习内容包括:Django框架基础、Django框架进阶、BBS+Blog实战项目开发、缓存和队列中间件、Flask框架学习、Tornado框架学习、RestfulAPI等。
第五步:爬虫开发Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。
第六步:全栈项目实战Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具学习、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。
第七步:数据分析Python全栈开发与人工智能之数据分析学习内容包括:金融量化分析。
第八步:人工智能Python全栈开发与人工智能之人工智能学习内容包括:机器学习、数据分析、图像识别、自然语言翻译等。
第九步:自动化运维&开发Python全栈开发与人工智能之自动化运维&开发学习内容包括:CMDB资产管理系统开发、IT审计+主机管理系统开发、分布式主机监控系统开发等。
第十步:高并发语言GO开发Python全栈开发与人工智能之高并发语言GO开发学习内容包括:GO语言基础、数据类型与文件IO操作、函数和面向对象、并发编程等。
Python如何图像识别?
1.简介。图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的Python当然不会错过这一门盛宴。
PIL(PythonImagingLibrary)是Python中最常用的图像处理库,目前版本为1.1.7,我们可以 在这里 下载学习和查找资料。
Image类是PIL库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。2.使用。导入Image模块。
然后通过Image类中的open方法即可载入一个图像文件。如果载入文件失败,则会引起一个IOError;若无返回错误,则open函数返回一个Image对象。
现在,我们可以通过一些对象属性来检查文件内容,即:1>>>importImage2 >>>im=("j.jpg")3 >>>printim.format,,4JPEG(440,330)RGB这里有三个属性,我们逐一了解。
format:识别图像的源格式,如果该文件不是从文件中读取的,则被置为None值。size:返回的一个元组,有两个元素,其值为象素意义上的宽和高。
mode:RGB(truecolorimage),此外还有,L(luminance),CMTK(pre-pressimage)。
现在,我们可以使用一些在Image类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:1>>>()2 >>>输出原图:3.函数概貌。
3.1 ReadingandWritingImages:open(infilename),save(outfilename)3.2 CuttingandPastingandMergingImages:crop():从图像中提取出某个矩形大小的图像。
它接收一个四元素的元组作为参数,各元素为(left,upper,right,lower),坐标系统的原点(0,0)是左上角。
paste():merge():1>>>box=(100,100,200,200)2 >>>region=(box)3 >>>()4 >>>region=region.transpose(Image.ROTATE_180)5 >>>()6 >>>im.paste(region,box)7 >>>()其效果图为:旋转一幅图片:1defroll(image,delta):2 "Rollanimagesideways"34 xsize,ysize=56 delta=delta%xsize7 ifdelta==0:returnimage89 part1=((0,0,delta,ysize))10 part2=((delta,0,xsize,ysize))11 image.paste(part2,(0,0,xsize-delta,ysize))12 image.paste(part1,(xsize-delta,0,xsize,ysize))1314 returnimage3.3 几何变换。
3.3.1 简单的几何变换。
1>>>out=im.resize((128,128)) #2 >>>out=im.rotate(45) #逆时针旋转45度角。
3 >>>out=im.transpose(Image.FLIP_LEFT_RIGHT) #左右对换。
4 >>>out=im.transpose(Image.FLIP_TOP_BOTTOM) #上下对换。
5 >>>out=im.transpose(Image.ROTATE_90) #旋转90度角。
6 >>>out=im.transpose(Image.ROTATE_180) #旋转180度角。
7>>>out=im.transpose(Image.ROTATE_270) #旋转270度角。
各个调整之后的图像为:图片1:图片2:图片3:图片4:3.3.2 色彩空间变换。convert():该函数可以用来将图像转换为不同色彩模式。3.3.3 图像增强。
Filters:在ImageFilter模块中可以使用filter函数来使用模块中一系列预定义的增强滤镜。
1>>>importImageFilter2>>>imfilter=im.filter(ImageFilter.DETAIL)3>>>()3.4 序列图像。
即我们常见到的动态图,最常见的后缀为.gif,另外还有FLI/FLC。PIL库对这种动画格式图也提供了一些基本的支持。当我们打开这类图像文件时,PIL自动载入图像的第一帧。
我们可以使用seek和tell方法在各帧之间移动。
1importImage2(1) #skiptothesecondframe34try:5 while1:6 (()+1)7 #dosomethingtoim8exceptEOFError:9 pass3.5 更多关于图像文件的读取。
最基本的方式:im=("filename")类文件读取:fp=open("filename","rb");im=(fp)字符串数据读取:importStringIO;im=(StringIO.StringIO(buffer))从归档文件读取:importTarIO;fp=TarIo.TarIO("","");im=(fp)基本的PIL目前就练习到这里。
其他函数的功能可点击 这里 进一步阅读。
学习Python应该掌握哪些知识点
阶段一:Python开发基础Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。
阶段二:Python高级编程和数据库开发Python全栈开发与人工智能之Python高级编程和数据库开发知识学习内容包括:面向对象开发、Socket网络编程、线程、进程、队列、IO多路模型、Mysql数据库开发等。
阶段三:前端开发Python全栈开发与人工智能之前端开发知识学习内容包括:Html、CSS、JavaScript开发、Jquery&bootstrap开发、前端框架VUE开发等。
阶段四:WEB框架开发Python全栈开发与人工智能之WEB框架开发学习内容包括:Django框架基础、Django框架进阶、BBS+Blog实战项目开发、缓存和队列中间件、Flask框架学习、Tornado框架学习、RestfulAPI等。
阶段五:爬虫开发Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。
阶段六:全栈项目实战Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具学习、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。
阶段七:算法&设计模式阶段八:数据分析Python全栈开发与人工智能之数据分析学习内容包括:金融量化分析。
阶段九:机器学习、图像识别、NLP自然语言处理Python全栈开发与人工智能之人工智能学习内容包括:机器学习、图形识别、人工智能玩具开发等。
阶段十:Linux系统&百万级并发架构解决方案阶段十一:高并发语言GO开发Python全栈开发与人工智能之高并发语言GO开发学习内容包括:GO语言基础、数据类型与文件IO操作、函数和面向对象、并发编程等。
如何利用Python做简单的验证码识别
1 摘要验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。
本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义。
然后经过了一年的时间,笔者又研究和get到了一种更强大的基于CNN卷积神经网络的直接端到端的验证识别技术(文章不是我的,然后我把源码整理了下,介绍和源码在这里面):基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)2 关键词关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL3 免责声明本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源。
本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 做任何多余操作。本文在书写相关报告的时候已经 隐去 漏洞网站的身份信息。本文作者 已经通知 网站相关人员此系统漏洞,并积极向新系统转移。
本报告的主要目的也仅是用于 OCR交流学习 和引起大家对 验证安全的警觉 。
4 引言关于验证码的非技术部分的介绍,可以参考以前写的一篇科普类的文章:互联网安全防火墙(1)--网络验证码的科普里面对验证码的种类,使用场景,作用,主要的识别技术等等进行了讲解,然而并没有涉及到任何技术内容。
本章内容则作为它的 技术补充 来给出相应的识别的解决方案,让读者对验证码的功能及安全性问题有更深刻的认识。
5 基本工具要达到本文的目的,只需要简单的编程知识即可,因为现在的机器学习领域的蓬勃发展,已经有很多封装好的开源解决方案来进行机器学习。
普通程序员已经不需要了解复杂的数学原理,即可以实现对这些工具的应用了。
主要开发环境:python3.5pythonSDK版本PIL图片处理库libsvm开源的svm机器学习库关于环境的安装,不是本文的重点,故略去。
6 基本流程一般情况下,对于字符型验证码的识别流程如下:准备原始图片素材图片预处理图片字符切割图片尺寸归一化图片字符标记字符图片特征提取生成特征和标记对应的训练数据集训练特征标记数据生成识别模型使用识别模型预测新的未知图片集达到根据“图片”就能返回识别正确的字符集的目标7 素材准备7.1 素材选择由于本文是以初级的学习研究目的为主,要求 “有代表性,但又不会太难” ,所以就直接在网上找个比较有代表性的简单的字符型验证码(感觉像在找漏洞一样)。
最后在一个比较旧的网站(估计是几十年前的网站框架)找到了这个验证码图片。原始图:放大清晰图:此图片能满足要求,仔细观察其具有如下特点。
有利识别的特点 :由纯阿拉伯数字组成字数为4位字符排列有规律字体是用的统一字体以上就是本文所说的此验证码简单的重要原因,后续代码实现中会用到不利识别的特点 :图片背景有干扰噪点这虽然是不利特点,但是这个干扰门槛太低,只需要简单的方法就可以除去7.2 素材获取由于在做训练的时候,需要大量的素材,所以不可能用手工的方式一张张在浏览器中保存,故建议写个自动化下载的程序。
主要步骤如下:通过浏览器的抓包功能获取随机图片验证码生成接口批量请求接口以获取图片将图片保存到本地磁盘目录中这些都是一些IT基本技能,本文就不再详细展开了。
关于网络请求和文件保存的代码,如下:defdownloads_pic(**kwargs): pic_name=('pic_name',None) url='httand_code_captcha/' res=(url,stream=True) withopen(pic_path+pic_name+'.bmp','wb')asf: forchunkinres.iter_content(chunk_size=1024): ifchunk: #filteroutkeep-alivenewchunks f.write(chunk) f.flush() f.close()循环执行N次,即可保存N张验证素材了。
下面是收集的几十张素材库保存到本地文件的效果图:8 图片预处理虽然目前的机器学习算法已经相当先进了,但是为了减少后面训练时的复杂度,同时增加识别率,很有必要对图片进行预处理,使其对机器识别更友好。
针对以上原始素材的处理步骤如下:读取原始图片素材将彩色图片二值化为黑白图片去除背景噪点8.1 二值化图片主要步骤如下:将RGB彩图转为灰度图将灰度图按照设定阈值转化为二值图image=(img_path)imgry=image.convert('L') #转化为灰度图table=get_bin_table()out=imgry.point(table,'1')上面引用到的二值函数的定义如下:呵呵11121314 def get_bin_table(threshold=140): """ 获取灰度转二值的映射table :paramthreshold: :return: """ table = [] for i in range(256): if i
二值化后带噪点的 6937 的像素点输出后如下图:1111000111111000111111100001111100000011111011101111011101111101111011110011011110011100111101111010110110101011011101111101111111110110101111110101111111101111110100011111011100111111001111111110111111001110111110000011111110010111110111111101110001111111101011010110111111011111110111101111111110111101111011111101111111011110111101110011110111101111110111001110000111111000011101100001110111011111如果你是近视眼,然后离屏幕远一点,可以隐约看到 6937 的骨架了。
8.2 去除噪点在转化为二值图片后,就需要清除噪点。本文选择的素材比较简单,大部分噪点也是最简单的那种 孤立点,所以可以通过检测这些孤立点就能移除大量的噪点。
关于如何去除更复杂的噪点甚至干扰线和色块,有比较成熟的算法: 洪水填充法FloodFill ,后面有兴趣的时间可以继续研究一下。
本文为了问题简单化,干脆就用一种简单的自己想的 简单办法 来解决掉这个问题:对某个 黑点 周边的九宫格里面的黑色点计数如果黑色点少于2个则证明此点为孤立点,然后得到所有的孤立点对所有孤立点一次批量移除。
下面将详细介绍关于具体的算法原理。
将所有的像素点如下图分成三大类顶点A非顶点的边界点B内部点C种类点示意图如下:其中:A类点计算周边相邻的3个点(如上图红框所示)B类点计算周边相邻的5个点(如上图红框所示)C类点计算周边相邻的8个点(如上图红框所示)当然,由于基准点在计算区域的方向不同,A类点和B类点还会有细分:A类点继续细分为:左上,左下,右上,右下B类点继续细分为:上,下,左,右C类点不用细分然后这些细分点将成为后续坐标获取的准则。
主要算法的python实现如下:defsum_9_region(img,x,y): """ 9邻域框,以当前点为中心的田字框,黑点个数 :paramx: :paramy: :return: """ #todo判断图片的长宽度下限 cur_pixel=img.getpixel((x,y)) #当前像素点的值 width=img.width height=img.height ifcur_pixel==1: #如果当前点为白色区域,则不统计邻域值 return0 ify==0: #第一行 ifx==0: #左上顶点,4邻域 #中心点旁边3个点 sum=cur_pixel\ +img.getpixel((x,y+1))\ +img.getpixel((x+1,y))\ +img.getpixel((x+1,y+1)) return4-sum elifx==width-1: #右上顶点 sum=cur_pixel\ +img.getpixel((x,y+1))\ +img.getpixel((x-1,y))\ +img.getpixel((x-1,y+1)) return4-sum else: #最上非顶点,6邻域 sum=img.getpixel((x-1,y))\ +img.getpixel((x-1,y+1))\ +cur_pixel\ +img.getpixel((x,y+1))\ +img.getpixel((x+1,y))\ +img.getpixel((x+1,y+1)) return6-sum elify==height-1: #最下面一行 ifx==0: #左下顶点 #中心点旁边3个点 sum=cur_pixel\ +img.getpixel((x+1,y))\ +img.getpixel((x+1,y-1))\ +img.getpixel((x,y-1)) return4-sum elifx==width-1: #右下顶点 sum=cur_pixel\ +img.getpixel((x,y-1))\ +img.getpixel((x-1,y))\ +img.getpixel((x-1,y-1)) return4-sum else: #最下非顶点,6邻域 sum=cur_pixel\ +img.getpixel((x-1,y))\ +img.getpixel((x+1,y))\ +img.getpixel((x,y-1))\ +img.getpixel((x-1,y-1))\ +img.getpixel((x+1,y-1)) return6-sum else: #y不在边界 ifx==0: #左边非顶点 sum=img.getpixel((x,y-1))\ +cur_pixel\ +img.getpixel((x,y+1))\ +img.getpixel((x+1,y-1))\ +img.getpixel((x+1,y))\ +img.getpixel((x+1,y+1)) return6-sum elifx==width-1: #右边非顶点 #print('%s,%s'%(x,y)) sum=img.getpixel((x,y-1))\ +cur_pixel\ +img.getpixel((x,y+1))\ +img.getpixel((x-1,y-1))\ +img.getpixel((x-1,y))\ +img.getpixel((x-1,y+1)) return6-sum else: #具备9领域条件的 sum=img.getpixel((x-1,y-1))\ +img.getpixel((x-1,y))\ +img.getpixel((x-1,y+1))\ +img.getpixel((x,y-1))\ +cur_pixel\ +img.getpixel((x,y+1))\ +img.getpixel((x+1,y-1))\ +img.getpixel((x+1,y))\ +img.getpixel((x+1,y+1)) return9-sumTips:这个地方是相当考验人的细心和耐心程度了,这个地方的工作量还是蛮大的,花了半个晚上的时间才完成的。
计算好每个像素点的周边像素黑点(注意:PIL转化的图片黑点的值为0)个数后,只需要筛选出个数为 1或者2 的点的坐标即为 孤立点 。这个判断方法可能不太准确,但是基本上能够满足本文的需求了。
经过预处理后的图片如下所示:对比文章开头的原始图片,那些 孤立点 都被移除掉,相对比较 干净 的验证码图片已经生成。
9 图片字符切割由于字符型 验证码图片 本质就可以看着是由一系列的 单个字符图片 拼接而成,为了简化研究对象,我们也可以将这些图片分解到 原子级 ,即: 只包含单个字符的图片。
于是,我们的研究对象由 “N种字串的组合对象” 变成 “10种阿拉伯数字” 的处理,极大的简化和减少了处理对象。9.1 分割算法现实生活中的字符验证码的产生千奇百怪,有各种扭曲和变形。
关于字符分割的算法,也没有很通用的方式。这个算法也是需要开发人员仔细研究所要识别的字符图片的特点来制定的。当然,本文所选的研究对象尽量简化了这个步骤的难度,下文将慢慢进行介绍。
使用图像编辑软件(PhoneShop或者其它)打开验证码图片,放大到像素级别,观察其它一些参数特点:可以得到如下参数:整个图片尺寸是40*10单个字符尺寸是6*10左右字符和左右边缘相距2个像素字符上下紧挨边缘(即相距0个像素)这样就可以很容易就定位到每个字符在整个图片中占据的像素区域,然后就可以进行分割了,具体代码如下:defget_crop_imgs(img): """ 按照图片的特点,进行切割,这个要根据具体的验证码来进行工作.#见原理图 :paramimg: :return: """ child_img_list=[] foriinrange(4): x=2+i*(6+4) #见原理图 y=0 child_img=((x,y,x+6,y+10)) child_img_list.append(child_img) returnchild_img_list然后就能得到被切割的 原子级 的图片元素了:9.2 内容小结基于本部分的内容的讨论,相信大家已经了解到了,如果验证码的干扰(扭曲,噪点,干扰色块,干扰线……)做得不够强的话,可以得到如下两个结论:4位字符和40000位字符的验证码区别不大纯字母不区分大小写。
分类数为26区分大小写。分类数为52纯数字。分类数为10数字和区分大小写的字母组合。
分类数为62纯数字 和 数字及字母组合 的验证码区别不大在没有形成 指数级或者几何级 的难度增加,而只是 线性有限级 增加计算量时,意义不太大。
10 尺寸归一本文所选择的研究对象本身尺寸就是统一状态:6*10的规格,所以此部分不需要额外处理。但是一些进行了扭曲和缩放的验证码,则此部分也会是一个图像处理的难点。
11 模型训练步骤在前面的环节,已经完成了对单个图片的处理和分割了。后面就开始进行 识别模型 的训练了。
整个训练过程如下:大量完成预处理并切割到原子级的图片素材准备对素材图片进行人为分类,即:打标签定义单张图片的识别特征使用SVM训练模型对打了标签的特征文件进行训练,得到模型文件12 素材准备本文在训练阶段重新下载了同一模式的4数字的验证图片总计:3000张。
然后对这3000张图片进行处理和切割,得到12000张原子级图片。
在这12000张图片中删除一些会影响训练和识别的强干扰的干扰素材,切割后的效果图如下:13 素材标记由于本文使用的这种识别方法中,机器在最开始是不具备任何数字的观念的。
所以需要人为的对素材进行标识,告诉 机器什么样的图片的内容是1……。这个过程叫做 “标记”。
具体打标签的方法是:为0~9每个数字建立一个目录,目录名称为相应数字(相当于标签)人为判定 图片内容,并将图片拖到指定数字目录中每个目录中存放100张左右的素材一般情况下,标记的素材越多,那么训练出的模型的分辨能力和预测能力越强。
例如本文中,标记素材为十多张的时候,对新的测试图片识别率基本为零,但是到达100张时,则可以达到近乎100%的识别率14 特征选择对于切割后的单个字符图片,像素级放大图如下:从宏观上看,不同的数字图片的本质就是将黑色按照一定规则填充在相应的像素点上,所以这些特征都是最后围绕像素点进行。
字符图片 宽6个像素,高10个像素 ,理论上可以最简单粗暴地可以定义出60个特征:60个像素点上面的像素值。但是显然这样高维度必然会造成过大的计算量,可以适当的降维。
通过查阅相应的文献 [2],给出另外一种简单粗暴的特征定义:每行上黑色像素的个数,可以得到10个特征每列上黑色像素的个数,可以得到6个特征最后得到16维的一组特征,实现代码如下:defget_feature(img): """ 获取指定图片的特征值, 1.按照每排的像素点,高度为10,则有10个维度,然后为6列,总共16个维度 :paramimg_path: :return:一个维度为10(高度)的列表 """ width,height= pixel_cnt_list=[] height=10 foryinrange(height): pix_cnt_x=0 forxinrange(width): ifimg.getpixel((x,y))==0: #黑色点 pix_cnt_x+=1 pixel_cnt_list.append(pix_cnt_x) forxinrange(width): pix_cnt_y=0 foryinrange(height): ifimg.getpixel((x,y))==0: #黑色点 pix_cnt_y+=1 pixel_cnt_list.append(pix_cnt_y) returnpixel_cnt_list然后就将图片素材特征化,按照 libSVM 指定的格式生成一组带特征值和标记值的向量文。
python怎么学习?
学习Python编程技术的流程与步骤,自学与参加培训学习都适用。一、清楚学习目标无论是学习什么知识,都要有一个对学习目标的清楚认识。
只有这样才能朝着目标持续前进,少走弯路,从学习中得到不断的提升,享受python学习计划的过程。虽然目前的编程语言有很多,但是基础语法上的概念,本质上都是相通的。可以做到一通百通。
所以没有必要为了学哪门语言纠结太多。python是目前市面上,我个人认为是最简洁&&最优雅&&最有钱途&&最全能的编程语言,没有之一。
所以既然你决定了要学习python,那么就需要先下一个决心,至少决定要作为自己的主力语言。python是全能语言,社区庞大,有太多的库和框架。你只需要找到合适的工具来实现想法,省去了造轮子的精力。
coder可以写尽可能少的代码来实现同等的功能。“人生苦短,我用python”是至理名言。
如果实现一个中等业务复杂度的项目,在相同的时间要求内,用java实现要4-5个码农的话,用python实现也许只需要1个。这就是python最大的优势了。
二、基本python知识学习1. 了解Python是什么,都能做些什么?
2. 知道什么是变量、算法、解释器3. Python基本数据类型4. 列表和元组的操作方法5. 字符串操作方法6. 基本的字典操作方法以上这些可以略微掌握之后就进行下一步,遇到忘记不会的可以再参考一下书和笔记。
虽然看书学编辑是效率最低的事情。且不说书的内容基本过时。就是比较较的翻译也很晦涩,照书写了代码跑不通,不断报错。是很打击学习积极性的。不过,介绍语法的基础书,还是可以买一本,作为手册查阅之用。
这类基础书籍买一本就好,找个周末休息时间,一天便可看完。三、掌握Python的条件、循环和相关的执行语句任何知识它的基础知识都是有些枯燥的,现在我们就可以动手来做一些逻辑层面的东西了。
掌握if、else、elif、while、for、continue、break和列表推导式等这些语句的使用,还有程序中的异常处理。
四、面对对象知识面对对象OOP,更高层次的Python程序结构,代码的重用避免代码冗余,打包你的代码,函数的参数、作用域等。类,可以帮助我们减少大量的开发时间,提高编程的效率,对中大型项目十分关键。
五、项目实践在这个阶段,一定要多动手实践,查找和处理过程中遇到的错误和异常,遇到问题多上网搜索,也可以参考公众号内的一些文章,或者加上咱们文章下方的老师领取合适的项目实例。
在成功的解决了这些问题之后,会有一种很大的成就感,这样一个良性循环,才是你学习Python这类程序语言的最大动力。以上是小姐姐总结学习Python的步骤和流程。
当然参加我们的Python培训课程,可以更快速、系统全面地掌握Python的各种知识。通过课后习题,让大家动手动脑的参与,课后问题解答会让你茅塞顿开。
培训班还会有很多实用的Python项目,从零开始带领大家一块解决项目遇到的问题,避免浪费大量精力和时间。最终让大家可以自行编写想要的各种Python程序。
六:缺点当然任何一门语言都有缺点,Python也不例外。小姐姐认为学习一门语言不仅需要清楚的知道学习步骤,做到心中有规划。也需要适当的了解一下他的缺点,也是为了更好的掌握、完善。
1、第一个缺点就是运行速度和C程序比要慢很多,因为Python是解释型语言,代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。2、第二个缺点就是代码不能加密。
如果要发布你的Python程序实际上就是发布源代码,还好我们大部分用python是来写应用程序,给用户提供服务的,用户其实不需要也不关心你的源码。
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐


所有评论(0)