ML訓練數據格式報錯

環境

tensorflow 1.14.0
python 3.7
object detection API (假定看官熟知API的使用過程)

報錯內容

2020-06-18 16:20:05.679704: W tensorflow/core/framework/op_kernel.cc:1502] OP_REQUIRES failed at queue_op.cc:109 : Invalid argument: Shape mismatch in tuple component 18. Expected [1,?,?,3], got [1,379,640,4]

接下來是排錯過程,如果嫌囉嗦可直接查看最後面的總結代碼部分。
根據報錯信息的字面意思,圖片集中存在4通道的圖片。則考慮用以下代碼將圖片轉換爲3通道。

import os
from PIL import Image

images_path = r'E:\image_collect\test'
for img in os.listdir(images_path):
    a = Image.open(os.path.join(images_path, img))
    if a.mode == 'RGBA':  # 4通道轉爲3通道
        r, g, b, a = a.split()
        imma = Image.merge('RGB', (r, g, b))
        imma.save(os.path.join(images_path, img))
    elif a.mode != 'RGB':
        print(img)
        imm = a.conver('RGB')  # 1通道改爲3通道
        imm.save(os.path.join(images_path, img))
    # 如果通道顯示爲L,表示爲全透,需手動用window自帶的畫圖打開圖片,另存爲jpeg格式。

表面上看沒啥大問題,就直接生成tfrecord格式文件,並再次開始訓練。然而,仍出現上述報錯。開啓debug模式後發現,Image.open讀取的圖片信息中,部分圖片的format居然還是’PNG’,‘BMP’,它的tile裏還有一個zip的參數。有人說可以用png的圖片格式,但方便起見,全改成jpeg的好了。
考慮把上述代碼中的某一行改爲:

imma.save(os.path.join(images_path, img), "JPEG")

總結代碼

import os

import cv2
from PIL import Image

images_path = r'E:\image_collect\test'
for img in os.listdir(images_path):
    imma = Image.open(os.path.join(images_path, img))
    if imma.mode == 'RGBA':  # 4通道轉爲3通道
        r, g, b, a = imma.split()
        imma = Image.merge('RGB', (r, g, b))
    elif imma.mode != 'RGB':
        imma = imma.conver('RGB')  # 1通道改爲3通道
    # 如果通道顯示爲L,表示爲全透,需手動用window自帶的畫圖打開圖片,另存爲jpeg格式。
    imma.save(os.path.join(images_path, img), "JPEG")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章