iT邦幫忙

0

opencv.resize error

  • 分享至 

  • xImage

詢問一下各位高手

import tensorflow as tf
from sklearn.model_selection import train_test_split
import glob
import numpy as np
import os.path as path
import os
import cv2

IMAGEPATH = 'images'
dirs = os.listdir(IMAGEPATH)
X=[]
Y=[]
print(dirs);
w=32 # 224
h=32 # 224
i=0
for name in dirs:
file_paths = glob.glob(path.join(IMAGEPATH+"/"+name, '.'))
for path3 in file_paths:
img = cv2.imread(path3)
img = cv2.resize(img, (w,h), interpolation=cv2.INTER_AREA)
im_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
X.append(im_rgb)
Y.append(i)
i=i+1

請問這段CODE 後面為什麼會出現
img = cv2.resize(img, (w,h), interpolation=cv2.INTER_AREA)
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-6uw63ony\opencv\modules\imgproc\src\resize.cpp:4051: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

已經有在網路上查詢可能為以下狀況
1.圖片路徑不對(確認過/方向正確)
2.資料夾內圖片都為JPG檔案
3.中文問題(圖片名稱皆用英文)
4.圖片格式不對(這個有些不太懂所以不知如何改變)
5.圖片數量不對(應該不會是這個問題吧)

fillano iT邦超人 1 級 ‧ 2021-01-28 01:22:14 檢舉
把path3印出來看看是不是特定檔案問題
hokou iT邦好手 1 級 ‧ 2021-01-28 08:34:56 檢舉
之前的經驗是沒抓到圖
print確認讀取的路徑
有讀取後先imshow或是查一下陣列大小看看吧
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
hokou
iT邦好手 1 級 ‧ 2021-01-28 11:19:27

剛剛測試了一下,大概有幾個問題

路徑錯誤
join 已經會自己加 \ 了

for name in dirs:
    file_paths = glob.glob(path.join(IMAGEPATH+"/"+name, '.'))

print(file_paths) 會變成

['IMAGEPATH路徑/xxx.jpg\\.']

可能改這樣

glob.glob(path.join(IMAGEPATH,name))

另一個問題有發現上面的顯示問題嗎?

會發現 file_paths 並沒有累加
你下面的迴圈,每次 file_paths 都被更新成新的那一筆

for name in dirs:
    file_paths = glob.glob(path.join(IMAGEPATH+"/"+name, '.'))

所以你的 for 跑完還是只有最新的一筆
後續的沒有繼續再看,可能要依你的做法再調整

看更多先前的回應...收起先前的回應...
godman08 iT邦新手 5 級 ‧ 2021-02-04 16:14:57 檢舉

import tensorflow as tf
from sklearn.model_selection import train_test_split
import glob
import numpy as np
import os.path as path
import os
import cv2

IMAGEPATH = 'images'
dirs = os.listdir(IMAGEPATH)
X=[]
Y=[]
print(dirs);
w=400 # 4000
h=300 # 3000
i=8
for name in dirs:
file_paths = glob.glob(path.join(IMAGEPATH,name))
for path3 in file_paths:
img = cv2.imread(path3)
img = cv2.resize(img, (w,h), interpolation=cv2.INTER_AREA)
im_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
X.append(im_rgb)
Y.append(i)
i=i+1

可以詢問一下
我想把images資料夾內的八種資料夾當作訓練資料
但目前好像是讀取不到影像
請問可能發生的問題是在哪邊呢?
目前看起來是讀取不到且不會累加造成後續轉矩陣轉不了
圖片是4000*3000畫素
再麻煩了 謝謝

hokou iT邦好手 1 級 ‧ 2021-02-04 16:23:21 檢舉

godman08
不確定你的檔案架構
可以先把 file_paths 或是 path3 列印出來看看路徑哪邊怪怪的

for name in dirs:
    file_paths = glob.glob(path.join(IMAGEPATH,name))
    print(file_paths)
    for path3 in file_paths:
        print(path3)
godman08 iT邦新手 5 級 ‧ 2021-02-04 17:50:47 檢舉

用DEBBUG模式
https://ithelp.ithome.com.tw/upload/images/20210204/2011923833dh4eKfY5.jpg
看起來路徑沒甚麼錯誤耶

hokou iT邦好手 1 級 ‧ 2021-02-04 22:09:27 檢舉

godman08
你的 path3 和 file_paths 看起來一樣耶
正常 path3 應該已經要有 JPG 之類的副檔名,不然你 cv2 是讀不到的

for name in dirs:
    file_paths = glob.glob(path.join(IMAGEPATH,name))
    file_name = os.listdir(file_paths)
    print(file_name) # 應該要是JPG清單
    for path3 in file_name:
        print(path.join(file_paths,path3))
        img = cv2.imread(path.join(file_paths,path3))

另一個是你目前的PY檔 跟 images 資料夾是在同一個位置嗎

我自己資料夾會使用相對路徑
如 "./images"

godman08 iT邦新手 5 級 ‧ 2021-02-05 09:14:41 檢舉

不好意思~新手問題很多
想請問一下改成這程式碼後
出現
TypeError: listdir: path should be string, bytes, os.PathLike or None, not list
是說路徑應該是字串嗎??
另外PY檔案跟IMAGES資料夾是在同一個位置唷
也改成這樣了
IMAGEPATH = './images'

hokou iT邦好手 1 級 ‧ 2021-02-05 09:28:14 檢舉

godman08
看來是 glob.glob() 出來是一個 list
所以要再把存的路徑挑出來

file_name = os.listdir(file_paths[0])
godman08 iT邦新手 5 級 ‧ 2021-02-05 10:25:51 檢舉

https://ithelp.ithome.com.tw/upload/images/20210205/20119238ESWMZAtzGj.png

ValueError: With n_samples=0, test_size=0.02 and train_size=None, the resulting train set will be empty. Adjust any of the aforementioned parameters.

好像訓練集是空的

samples = 0

hokou iT邦好手 1 級 ‧ 2021-02-05 10:50:09 檢舉

應該是圖片還是沒讀到,所以整個資料是空的

照你的設定
path3 是利用 for 逐一取得 file_name 這個路徑資料夾裡面的圖片名稱(list)
但是只有名稱,所以在 cv2.imread 讀取時要把前段的路徑加進去
前段的路徑則存在 file_paths 這個 list 內

所以才說要確認整個圖片讀取的路徑是否正確

    for path3 in file_name:
        print(path.join(file_paths[0],path3))
        img = cv2.imread(path.join(file_paths[0],path3))
godman08 iT邦新手 5 級 ‧ 2021-02-05 11:39:16 檢舉

https://ithelp.ithome.com.tw/upload/images/20210205/20119238k9FTEOtoQW.png
詢問一下 我想要把數字轉為one hot 降低電腦負擔
可是出現
IndexError: index 75 is out of bounds for axis 1 with size 8
是指index 75 超出邊界嗎?
麻煩了 感謝

hokou iT邦好手 1 級 ‧ 2021-02-05 11:55:47 檢舉

看來是有順利讀到圖了,所以這算另一個問題了
程式碼不完整要前後猜
先猜測你的圖可能是76張

print(Y)
如果裡面的值超過7,代表分類錯了

因為有8個影像資料夾,所以分類照理會是

[0,1,2,3,4,5,6,7]

因此換一個資料夾 i+1

把 i=i+1 再往前一個 for 迴圈吧

godman08 iT邦新手 5 級 ‧ 2021-02-05 13:49:08 檢舉

圖片種類共8種
各有
1-36張
2-23張
3-8張
4-1張
5-24張
6-9張
7-9張
8-7張
共117張
好像消失了6張
https://ithelp.ithome.com.tw/upload/images/20210205/20119238m1vRjU2P1V.png
另外再訓練模組的時候發現https://ithelp.ithome.com.tw/upload/images/20210205/2011923809Qc7RtuzR.png
好像是用flatten無法轉成1D維度
https://ithelp.ithome.com.tw/upload/images/20210205/20119238XE1otD0S6C.png

hokou iT邦好手 1 級 ‧ 2021-02-05 14:34:58 檢舉

你的顯示是不是 train
若是的話,你的 test_size = 0.05
117 x 0.05 = 5.85 => 6張在 test

另外你已經攤平了啊 不是沒錯誤?
400 x 300 x 32 =3840000

方便提供學習來源嗎? 感覺難度跳好多

godman08 iT邦新手 5 級 ‧ 2021-02-05 14:46:17 檢舉

https://ithelp.ithome.com.tw/upload/images/20210205/20119238gatydgs7M3.png
跑完訓練集後會出現
ValueError: Shapes (3840000, 50) and (32768, 50) are incompatible

學習來源是柯博文老師出的這本書哦

hokou iT邦好手 1 級 ‧ 2021-02-05 17:14:54 檢舉

看上面說明是有附範例檔案的喔
建議再比對差異,或是用其他的方式讓人理解完整程式碼

我自己會先用設定的跑看看,逐一調整

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

參考資料
https://stackoverflow.com/questions/61742556/valueerror-shapes-none-1-and-none-2-are-incompatible
https://www.tensorflow.org/tutorials/images/cnn

我要發表回答

立即登入回答