質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4761閲覧

for文を回してファイルに画像を保存したい

matt17

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/06 14:24

編集2018/09/07 03:22

for文を回して、それぞれクラスタリングされたファイルに画像を保存したい

コーディネートを分類するアルゴリズムを作っています。
コーディネートをクラスタリングするところまではうまくできました。特徴をもとに5つのグループに分けています。
そこで次は、それぞれのコーディネート画像をクラスタリングされたグループのファイルに保存したいです。

python

1import os 2import shutil 3import numpy as np 4from PIL import Image 5from skimage import data 6from sklearn.cluster import KMeans 7import glob 8# 1. 3次元配列の画像データを2次元配列のデータに変換 9search_dir = './img/img_convert' 10feature = np.array([ 11data.imread(path) 12for path in glob.glob('./img/img_convert/*.jpg') 13]) 14feature = feature.reshape(len(feature), -1).astype(np.float64) 15# 2. 学習(5種類のグループにクラスタリングする) 16model = KMeans(n_clusters=5).fit(feature) 17# 3. 学習結果のラベル 18labels = model.labels_ 19# 4. 学習結果(クラスタリング結果の表示 + ラベルごとにフォルダ分け) 20for label, path in zip(labels, os.listdir('./img/img_convert')): 21 if label==0: 22 shutil.move(path,'./img/img_group/0') 23 elif label==1: 24 shutil.move(path,'./img/img_group/1') 25 elif label==2: 26 shutil.move(path,'./img/img_group/2') 27 elif label==3: 28 shutil.move(path,'./img/img_group/3') 29 elif label==4: 30 shutil.move(path,'./img/img_group/4') 31 print(label, path)

これで実行すると、
FileNotFoundError: [Errno 2] No such file or directory: '20180906060309102_276.jpg'
というエラーが出ます。
どなたかやり方をご教授ください。

補足情報(FW/ツールのバージョンなど)

python3.6.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/06 14:36

python switchで調べてみては
guest

回答1

0

ベストアンサー

FileNotFoundError: [Errno 2] No such file or directory: '20180906060309102_276.jpg'

ファイルが存在しないからかと。
コンパイル通してませんが。

Python

1import os.path 2for label, path in zip(labels, os.listdir('./img/img_convert')): 3 shutil.move(os.path.join(search_dir,path), './img/img_group/' + str(label))

os.listdirの並び順は保証されていないので、ソートしてくださいな。


Error: Destination path './img/img_group/3/.ipynb_checkpoints' already existsError: Destination path './img/img_group/3/.ipynb_checkpoints' already exists

抽出条件が違うからです。

処理抽出条件
glob.glob指定したディレクトリ内のjpgファイルのみ
os.listdir指定したディレクトリ内のファイル全て

glob.globの結果をリストに退避しておけばよいかと。
並び順を保証するソートにも対応したバージョンです。

Python

1# -*- coding: utf-8 -*- 2import os 3import shutil 4import numpy as np 5from PIL import Image 6from skimage import data 7from sklearn.cluster import KMeans 8import glob 9from pathlib import Path 10# 1. 3次元配列の画像データを2次元配列のデータに変換 11search_dir = './img/img_convert' 12# ソート 13search_data = sorted(glob.glob(search_dir + '/*.jpg')) 14feature = np.array([data.imread(path) for path in search_data]) 15feature = feature.reshape(len(feature), -1).astype(np.float64) 16# 2. 学習(5種類のグループにクラスタリングする) 17model = KMeans(n_clusters=5).fit(feature) 18# 3. 学習結果のラベル 19labels = model.labels_ 20 21# 22move_dir = Path('./img/img_group/') 23# ディレクトリ作成 24move_dir.mkdir(parents=True, exist_ok=True) 25for label, path in zip(labels, search_data): 26 src_file = Path(search_dir, path) 27 shutil.move(str(src_file), str(move_dir / str(label)))

glob.globPathlib#globで代替できるので、shutilglobを使わずにPathlibモジュールに統一することをお勧めいたします。

投稿2018/09/07 03:41

編集2018/09/07 04:20
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matt17

2018/09/07 04:01

ご回答ありがとうございます。 ファイルごとに保存することができました! しかし、 Error: Destination path './img/img_group/3/.ipynb_checkpoints' already existsError: Destination path './img/img_group/3/.ipynb_checkpoints' already exists というエラーが出てしまいます。 分けられているので機能的には問題ないのですが、これはどういうことなのでしょうか。
matt17

2018/09/07 04:10

ご回答ありがとうございます。 うまく行きました!本当にありがとうございました!
matt17

2018/09/07 04:10

ご回答ありがとうございます。 うまく行きました!本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問