問題点
ministによる学習を一通りやって、好きな画像でやるぞ! と思った矢先に起きたError(恐らくMac限定)
train_img_dirs = ['T','F']
train_image = []
train_label = []
for i, d in enumerate(train_img_dirs):
# ./data/以下の各ディレクトリ内のファイル名取得
files = os.listdir('./data/' + d)
for f in files:
# 画像読み込み
img = cv2.imread('./data/' + d + '/' + f)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# 1辺がIMG_SIZEの正方形にリサイズ
img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
# 1列にして
img = img.flatten().astype(np.float32)/255.0
train_image.append(img)
# one_hot_vectorを作りラベルとして追加
tmp = np.zeros(NUM_CLASSES)
tmp[i] = 1
train_label.append(tmp)
これをコンパイルすると...
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in ipp_cvtColor
に陥る。 なんでや
原因
https://stackoverflow.com/questions/20822288/python-opencv-cv2-opencv-error-assertion-failed-scn-3-scn-4-in-unkno
によると
print(img.shape)を実行してみて結果がNone typeになっていると画像が正しく読み込めていないらしい。
そこでprint(d)とprint(f)をして、読み込んだディレクトリとファイルを表示してみると
$ T
$ .DS_Store
が出てきた。 ディレクトリは正しく読み込めているが、ファイルに例のアレが入ってる。 .DS_Storeが読み込まれているせいで、うまく実行できていなかった。
.DS_Storeとは
アイコンの位置や表示設定などのフォルダ表示設定に関するメタデータを記録するための隠しファイル。Finder上でもリモートシステム上でもアクセスするすべてのフォルダに.DS_Storeファイルが作成されている。
解決方法
個別のディレクトリの.DS_Storeを削除
find Desktop/対象のディレクトリ -name ".DS_Store" -print -exec rm {} ";"
全部削除
sudo find / -name ".DS_Store" -delete
今後作成しない
defaults write com.apple.desktopservices DSDontWriteNetworkStores True
あと、MacForkCleanerというアプリで簡単に消せる。
最後に
初めてのOpenCVで、書き方とか画像の形式が誤っているのかと思ってかなり悪戦苦闘してしまった。(調べても全然出てこない)
MacOSを使ってて同じ現象に陥った人の参考にして欲しい。.DS_Storeは隠しファイルなので自分はパット見だと気づかなかった。他の人は経験とかで気づくのかな?
参考サイト
macから.DS_Storeを消しさる
http://qiita.com/supersnack/items/157b69589e36f340bb29
.DS_Storeの仕組みと削除&作成しないよう設定する方法
http://uxmilk.jp/48160
Python-OpenCV cv2 OpenCV Error: Assertion failed (scn == 3 || scn == 4) in unknown function, file ......\modules\imgproc\src\color.cpp
https://stackoverflow.com/questions/20822288/python-opencv-cv2-opencv-error-assertion-failed-scn-3-scn-4-in-unkno