python人工智能:完整的图像识别(非图像验证码),以及模型的使用
我们一直在谈论人工智能和图像识别,但是有多少人知道呢?网上有堆积如山的文章。前段时间,由于工作需要,只有我一个人做后端开发,要做图像识别。
于是我开始了疯狂的寻找。首先我们来说说目前互联网上介绍最多、最好、最棘手的模型——AIimage。它用了10行代码就完成了图像识别。可以通过代码来识别对象,但必须使用它们的模型。他们不能自己训练,所以我开始寻找AIimage的训练模型。我找到了它并且它能够被训练。我使用了训练好的模型并正式进行了测试。哇,看起来像屎一样!
后来得到了一位大哥的真实消息,给了我这套完整的训练+完整的使用代码。先说说这位大哥吧。他真是个好人。我从git获取代码,然后自己运行。各种bug+都不行。我不好意思问调试的事情,但是这位大哥亲自帮我调试,解决bug,远程调试到半夜。太难了。我给他发了红包,他没收了,还留言:学*!
大哥永远是大哥
之所以写这篇文章,主要是为了让像我这样的纯粹新手更容易使用代码。由于源码没有完整的结构,并且存在一些小问题,所以我给出的是完全通过的代码。
我不懂人工智能。以下内容来自老大哥原创文章:TensorFlow复刻ResNet系列模型
:
阅读之前需要了解的事项:
如果读者在阅读中发现任何错误,请在评论中指出,共同进步。
编译环境:Python3.5
张量流GPU 1.3.0
1.结构分析
说起卷积模型,LeNet、Inception、Vgg都是图像识别领域学*神经网络的经典模型。上图模型是经典的Vgg-19与34层传统卷积网络和ResNet-34的对比。
在计算量方面,Vgg-19的三层全连接神经网络的计算量明显大于传统的卷积网络和resnet。传统卷积网络和resnet的参数数量是相同的。
普通和resnet
在训练拟合方面,论文分别提供了plain-18、plain-34、resnet-18 和resnet-34 的比较。不难发现,随着层数的增加,plain的精度并没有明显提升。改进,resnet不仅随着层数的增加训练精度有所提高,而且在相同深度下比plain有更高的精度。
残差模块
上图展示了residual模块的结构。为了有效,残差块需要具有两层或多层。同时,输入x和输出F(x)的维度也必须相同。
残差块
1、尺寸不足的部分用全0填充
2、输入输出维度一致时使用恒等映射,不一致时使用线性投影。
3. 对所有块使用线性投影。
2.实施规划(ResNet-50-101-152)
不同深度的ResNet结构
结构定义词典
结构字典
ResNet_demo={ 'layer_50':[{'深度': 256,'num_class': 3}, {'深度': 512,'num_class': 4}, {'深度': 1024,'num_class': 6}, {'深度': 2048,'num_class': 3}],'layer_101': [{'深度': 256,'num_class': 3},{'深度': 512,'num_class': 4},{'深度': 1024,'num_class': 23},{'深度': 2048,'num_class': 3}],'layer_152': [{'深度': 256,'num_class': 3},{'深度' : 512, 'num_class': 8}, {'深度': 1024, 'num_class': 36}, {'深度': 2048, 'num_class': 3}] 子类模块规划
在ResNet网络传输过程中,我们来讨论一些即将出现的问题:
1. 下采样过程
2. 通道填充
下采样图
下采样过程用于不同类型瓶颈模块之间的传输过程。比如上图中粉色卷积层和蓝色卷积层之间的数据交互。蓝色卷积层中的/2是下采样过程。
下采样模块代码实现
def Sample(input_tensor, #Tensor Entry ksize=1, #采样块大小stride=2): #采样步长data=input_tensor data=slim.max_pool2d(data,ksize,stride=stride) 返回数据通道填充用于输入数据x与结果数据F(x)生成残差和时引起的通道失配问题
通道填充模块代码实现
def heightFilling(input_tensor, #InputTensor depth): #输出深度data=input_tensor #获取输入张量的深度input_depth=data.get_shape().as_list()[3] #tf.pad 填充的是维度,对于那些不明白的可以去TensoFLow官网了解一下data=tf.pad(data,[[0,0], [0,0], [0,0], [abs(深度- input_深度)//2、abs(深度- input_深度) //2]]) 返回数据好了,两个子类的问题已经解决了。现在让我们规划并实现残差模块。
残差模块
由于构建方向选择层大于等于50层,因此我们使用论文中给出的第二种残差模块(11+33+1*1)。
残差模块代码实现
defbottleneck(input_tensor,output_depth): #取出通道redepth=input_tensor.get_shape().as_list()[3] #当通道不匹配时,进行全零填充和下采样if output_depth !=redepth: #All-零填充input_tensor=heightFilling(input_tensor,output_depth) #下采样input_tensor=抽样(input_tensor)data=input_tensor #下通道处理data=slim.conv2d(inputs=data, num_outputs=output_depth//4, kernel_size=1, stride=1) #提取特征data=slim.conv2d(inputs=data, num_outputs=output_depth//4, kernel_size=3, stride=1)#通道恢复data=slim.conv2d(inputs=data, num_outputs=output_depth, kernel_size=1, stride=1、activation_fn=None, normalizer_fn=None) #生成残差数据=data + input_tensor data=tf.nn.relu(data) 返回数据有了残差模块,我们就可以堆叠网络结构了
然而,为了简化我们的代码块,我选择取出全连接层并将其编写为单独的模块
FC代码实现
这个模块没有什么技术含量,和我们刚开始用的BP神经网络类似。
def cnn_to_fc(input_tensor, #张量入口num_output, #输出接口数量train=False, #是否使用dropout正则化器=None) : #正则函数data=input_tensor #获取输出信息的维度,用于的输入全连接层data_shape=data .get_shape().as_list() Nodes=data_shape[1] * data_shape[2] * data_shape[3] reshape=tf.reshape(data, [data_shape[0], Nodes]) #最后全连接连接层与tf.variable_scope ('layer-fc'): fc_weights=tf.get_variable('weight', [nodes,num_output],initializer=tf.truncated_normal_initializer(stddev=0.1)) ifregularizer !=None: tf.add_to_collection( '损失', 正则化器( fc_weights)) fc_biases=tf.get_variable('bias', [num_output], 初始化器=tf.constant_initializer(0.1)) fc=tf.nn.relu(tf.matmul(重塑, fc_weights) + fc_biases ) if train: fc=tf .nn.dropout(fc, 0.5) return fc 定义传递规则
推理
#Stacked ResNet模块def inference(input_tensor, #数据入口demos, #模型信息(列表) num_output, #出口数量为_train):data=input_tensor #第一层卷积7*7,stride=2,深度为64data=conv2d_same( data,64,7,2,is_train,None,normalizer_fn=False)data=slim.max_pool2d(data,3,2,scope='pool_1')with tf.variable_scope('resnet'): #堆叠通用类瓶颈模块demo_num=0 用于demos: 中的演示demo_num +=1 print('------------------------------------ -- --------') #堆叠子类瓶颈模块for i in range(demo['num_class']): print(demo_num) if demo_num is not 4: if i==demo['num_class'] - 1: 步幅=2 else: 步幅=1 else: 步幅=1 数据=瓶颈(数据,demo['深度'],步幅,is_train) print('------------------ - ------------------------------------')data=tf.layers.batch_normalization(data,training=is_train)data=tf.nn.relu(data ) #平均池化,也可以使用Avg_pool函数data=tf.reduce_mean(data, [1, 2], keep_dims=True)print('output : ', data) #最终全连接层data=slim.conv2d(data , num_output,1,activation_fn=None)data_shape=data.get_shape().as_list()nodes=data_shape[1] * data_shape[2] * data_shape[3]data=tf.reshape(data, [-1, 节点] ) 返回数据推理调用方法
inference(input_tensor=数据录入demos=ResNet_demo['layer_101'], #获取模型字典num_output=出口数量, is_train=False) # BN是否经过训练参考:
https://arxiv.org/pdf/1512.03385.pdf
http://blog.csdn.net/xxy0118/article/details/78324256
http://blog.csdn.net/mao_feng/article/details/52734438
使用介绍
图像分类和目录结构
Snip20181114_1.png
第一步是运行FlowIO.py
图片.png
第二步是运行train.py 来训练模型。这里图片很少,训练次数也很少。真实的情况需要大量的训练。
图片.png
第三步:运行Evaluation.py测试结果集,可以跳过
选择正确的型号:
正确的模型.png
第四步,使用模型useModel.py进行图像识别。
图片.png
结果是对的!
请忽略我的结果,因为我只有8 个训练集,而这需要每个类别至少80 个训练集。
用户评论
这门Python课程真的很棒!它不仅深入浅出地讲解了如何用AI做图像识别,还教我怎么构建并应用自己的识别模型。对于初学者来说绝对友好。
有19位网友表示赞同!
之前一直对AI感兴趣但不知道从何入手,学*完这个课程后,感觉自己在图片处理和模式识别方面有了很大提升。
有5位网友表示赞同!
无论是代码实践还是理论讲解,这个关于Python AI的课程都十分到位。对于想要用AI做图像相关项目的同学来说,真是个好起点。
有15位网友表示赞同!
我通过这门课成功地将自己的照片分类器建立起来了,真的很成就感满载。
有7位网友表示赞同!
虽然有段时间编程基础不是特别扎实,但跟着老师的步骤逐步来,觉得这个课程超级贴心,并帮助我克服了不少技术障碍。
有19位网友表示赞同!
这个Python AI课程对我来说是入门到进阶的完美桥梁。讲解清晰,代码实战性强,真的强烈推荐给想要尝试AI的朋友。
有9位网友表示赞同!
在玩了几次验证码之后才发现其实背后的原理就是图像识别算法,学完这门课才知道原来是Python AI这么干的!
有12位网友表示赞同!
通过这个课程我可以自信地说:我会用Python构建模型解决图片分类问题。(虽然我还没正式工作,但心理满足感十足!)
有7位网友表示赞同!
无论是对机器学*感兴趣,还是想提升自己的技能,这个Python AI课程都给了我足够的动力和信心去实践。
有16位网友表示赞同!
真的很感谢提供这个课程。图像识别的理论讲得既深入又实用。我感觉自己在AI这方面的知识已经比预想中要多出很多。
有18位网友表示赞同!
从零基础开始学*到现在能够独立进行简单的图片分类,这个Python课程对我的帮助真的超出了预期!
有16位网友表示赞同!
我一直梦想着能用AI来解决日常生活中的小问题,现在我觉得自己更接近实现这个目标了。
有11位网友表示赞同!
这次的学*体验真的很赞。我不但掌握了基础知识,还尝试了自己的案例项目。对AI的热情又高涨了不少。
有10位网友表示赞同!
课程的教程很有耐心地一步步引导我通过Python探索图像识别的世界,感觉像是在给刚刚毕业的学生打基础。
有20位网友表示赞同!
这个关于Python AI和图片识别的课程让我觉得自己的编程技能有了实质性的飞跃,开始期待能用所学做点实际的东西。
有8位网友表示赞同!
我以前在编程中总是担心自己的逻辑有问题,学*了这门课后,发现AI的构建过程比我想象中的更有规律性,很有成就感。
有13位网友表示赞同!
这次的学*体验完全超出了我的预期。不光是理论知识,实战操作让我深刻感受到Python AI的力量。
有12位网友表示赞同!
对于对图片处理充满好奇心的人来说,这个课程简直是理想之选!每个小项目都让人兴奋不已。
有17位网友表示赞同!
感谢提供这些详细的指导。从理论出发到动手实践,每一步都很实用,为我能自己独立工作打下了坚实的基础。
有16位网友表示赞同!