用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. 虽然大型服务器好用,但是贫民学生不配拥有,借用个服务器真是太难了,真的太难了!