圖片尺寸批量resize的matlab並行程式碼
阿新 • • 發佈:2018-11-05
在caffe ImageNet例子中有對圖片進行resize的部分,文中使用的是linux shell指令碼命令:
for name in /path/to/imagenet/val/*.JPEG; do
convert -resize 256x256\! $name $name
done
- 1
- 2
- 3
但該命令在執行後游標就一直處於等待狀態,直到所有的圖片全部執行結束。這種情況在圖片數量比較大時就很惱人(對於ILSVRC2012資料集中的100多萬張圖片來說,這種狀態可能會持續好幾天),你不知道程式的執行狀況,不知道處理了多少圖片,不知道程式大概什麼時候能結束。
因此,本文采用matlab語言中的並行機制來實現圖片尺寸的批量resize。
程式碼如下:
clear;clc;close all;
tic; % 用於計算程式執行時間,和toc搭配使用
CoreNum=6; % cpu核的數量
% 下面程式碼塊為並行處理檢測與開啟程式,需要在執行結束後予以關閉
if matlabpool('size')<=0
matlabpool('open','local',CoreNum);
else
disp('Already initialized');
end
imagePath = 'rastaPlpSpec/train/'; % 圖片存放路徑
imageFiles = dir(imagePath);
numFiles = length (imageFiles);
parfor i=3:numFiles % 從3開始,因為前兩個是當前路徑‘.’和上一級路徑‘..’
j = i-2;
disp(j);
imageFile = strcat(imagePath,imageFiles(i).name);
A = imread(imageFile);
B = imresize(A,[256 256]); % resize為256x256
imwrite(B,imageFile); % 覆蓋原始圖片,若需要另存為,則修改此處的imageFile為新的儲存路徑
end
matlabpool close % 關閉並行
toc; % 顯示執行時間
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
在該程式碼中,因為我的cpu有6個核,所以設定CoreNum=6。
如果我有兩個物理cpu,每個有6個核,那麼我這裡是否可以設定CoreNum=12呢,這樣效率會不會成倍提升?由於對matlab的並行處理了解不多,這裡就留個疑問,等我知道後再補充,有知道的歡迎交流。
—————————————————————————————————————————————
在linux中關於cpu的相關資訊都在檔案/proc/cpuinfo中,使用者可以直接檢視該檔案或使用下面的命令顯示需要的資訊:
1. 顯示物理cpu個數
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l
- 1
- 顯示每個物理cpu的核數
cat /proc/cpuinfo | grep 'cpu cores' | uniq
- 1
- 顯示邏輯cpu的個數
cat /proc/cpuinfo | grep 'processor' | wc -l
- 1
其中:
總核數 = 物理CPU個數 X 每顆物理CPU的核數
總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超執行緒數