用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. 雖然大型服務器好用,但是貧民學生不配擁有,借用個服務器真是太難了,真的太難了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM