• 用101000张图片实现图像识别(算法的实现和流程)-python-tensorflow框架


    一个月前,我将kaggle里面的food-101(101000张食物图片),数据包下载下来,想着实现图像识别,做了很长时间,然后自己电脑也带不动,不过好在是最后找各种方法实现出了识别,但是准确率真的非常低,我自己都分辨不出来到底是哪种食物,电脑怎么分的出来呢?

    在上一篇博客中,我提到了数据的下载处理,然后不断地测试,然后优化代码,反正过程极其复杂,很容易出错。

    再说下代码流程吧:

    1. 关于数据集的处理,我上篇博客写道:将其灰度处理,实际上是应该二值化,将彩色图片转化为(0,1)的范围里面,首先是读取每一个文件的数据(这里的每张图片都有一个标签),然后将其随机分为80%的训练集,20%的测试集:
      for filename in dir:
          img = np.multiply(img, 1.0/255.0)
      size = int(config.size * len(images))
      这里采用循环的方式,每一张都进行二值化,然后存入列表,再根据我设置的大小进行选择。
    2. 神经网络训练,我将图片二值化后,下一步需要将我得图片数据传入我得训练中,循环训练,分批传入,我采用卷积操作实现其识别:
      def jj():
          conv = tf.nn.relu(tf.nn.conv2d(input, filter, [1, 1, 1, 1], padding="SAME")+b)
          pool = tf.nn.max_pool2d(conv, [1, 2, 2, 1], [1, 2, 2, 1], padding="SAME")

      我这里采用的是相同大小卷积,所以我在全连接层的地方就需要注意我的神经元个数,最后通过激励函数得出结果。

          prediction = tf.nn.softmax(fc2,name="y_pred")
          loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=fc2,labels=labels_batch))
          optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=1e-4).minimize(loss)
          correct_prediction = tf.equal(tf.argmax(prediction,1), tf.argmax(labels_batch,1))
          accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    3. 数据训练的方法:当我们建立神经网络后,需要让机器自动去训练,所以我们需要将模型保存在电脑中,同时需要电脑能够停止训练(当损失函数的值处于某一最小值的时候)。
      if loss < 0.01:
                              print("迭代收敛,结束训练")
                              break

      这里我们上传数据为50一个批次,具体多少按照自己处理。

    4. 服务器中跑代码时,需要注意的是肯定需要大型cpu/gpu计算机,不然容易崩溃,然后也没有什么需要注意的地方了。

    其实每个神经网络的训练处理方式都不一样,但是大致流程都差不多:数据处理-网格搭建-数据训练-网格优化。根据自己数据的不同和侧重点不同,需要建立不同的卷积算法。

    总结下遇到的问题:

    1. 图片处理:在处理图片的时候我发现有的图片格式,大小,色彩都不相同,所以我在这里将其分类和处理,主要是分开除黑白图和彩色图
      def image(url):
          im=Image.open(url)
          pix=im.convert('RGB')
          width=im.size[0]
          height=im.size[1]
          type="黑白Image"
          is_color=[]
          for x in range(width):
              for y in range(height):
                  r,g,b=pix.getpixel((x,y))
                  r=int(r)
                  g=int(g)
                  b=int(b)
                  if (r==g) and (g==b):
                      pass
                  else:
                     type='彩色 Image'
          return type

      数据处理其实是这里面最好做的。

    2. 在神经网络搭建中,需要避免过拟合和欠拟合的问题,图片数据不能太少,同时神经元不能太多,需要考虑到多个问题,以及卷积操作的方式,这里都需要自己摸索
    3. 虽然大型服务器好用,但是贫民学生不配拥有,借用个服务器真是太难了,真的太难了!
  • 相关阅读:
    如何解决Windows 10系统下设备的声音问题
    mutex与semaphore的区别
    大端与小端,大尾与小尾,高尾端与低尾端,主机字节序与网络字节序
    详解C语言的htons和htonl函数、大尾端、小尾端
    sockaddr与sockaddr_in结构体简介
    使用socket()函数创建套接字
    struct socket 结构详解
    C语言函数sscanf()的用法
    使用 Socket 通信实现 FTP 客户端程序(来自IBM)
    C语言文件的读写
  • 原文地址:https://www.cnblogs.com/lh9527/p/9527-6.html
Copyright © 2020-2023  润新知