画像のResizeをparforで行う。
parforは並列で処理を行なってくれるので、高速で作業が終わります。
手順はこんな感じ
- フォルダの構造を得る
- 保存用フォルダを作成する
- for文でコードを作成
- 最後にresiezeに関わる部分をparforに変更する
フォルダ構造はこんな感じ
・まずはメインフォルダを選択して内部構造を得ていく
main_fd = uigetdir(); [a,b,c]= fileparts(main_fd); sub_fd =dir(main_fd); %remove waste files sub_fd =sub_fd (~ismember({sub_fd.name}, {'.','..','.DS_Store','._.DS_Store','._*'})); %covert to cell sub_fd ={sub_fd.name};
・次に、画像を保存するフォルダを作成。どんどんデータは増えていくが、オリジナルのデータはいじらずに置いておきたい。
for x= 1:length(sub_fd) sub_sub_fd = dir(fullfile(main_fd,sub_fd{x})); %remove waste files sub_sub_fd =sub_sub_fd(~ismember({sub_sub_fd.name}, {'.','..','.DS_Store','._.DS_Store','._*'})); %covert to cell sub_sub_fd ={sub_sub_fd.name}; for y= 1:length(sub_sub_fd) save_fd= fullfile(a,strcat("rs_",b),sub_fd{x},sub_sub_fd{y}); mkdir(save_fd); end end msgbox("save fd created")
・for文とparfor文を組み合わせて連続処理をする。
・parfor分にすると変数を確認できなくなるので、最後の処理を走らせるまではfor分で書くのがオススメ
parfor xx = 1:length(sub_fd) parfor yy = 1:length(sub_sub_fd) tmp_fd = fullfile(main_fd,sub_fd{xx},sub_sub_fd{yy}); tmp_img_lst = dir(tmp_fd); tmp_img_lst =tmp_img_lst(~ismember({tmp_img_lst.name}, {'.','..','.DS_Store','._.DS_Store','._*'})); tmp_img_lst ={tmp_img_lst.name}; for zz=1:length(tmp_img_lst) tmp_img_path = fullfile(tmp_fd,tmp_img_lst{zz}); img = imread(tmp_img_path); % CNN用に224*224にresizeする rs_img = imresize(img,[224,224]); save_fd = fullfile(a,strcat("rs_",b),sub_fd{xx},sub_sub_fd{yy}); save_path = fullfile(save_fd,tmp_img_lst{zz}); imwrite(rs_img,save_path); end end end
これでできあがり。
それぞれをライブエディターで書けばOK