1. 程式人生 > >圖片尺寸批量resize的matlab並行程式碼

圖片尺寸批量resize的matlab並行程式碼

在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
  1. 顯示每個物理cpu的核數
cat /proc/cpuinfo | grep 'cpu cores' | uniq
  • 1
  1. 顯示邏輯cpu的個數
cat /proc/cpuinfo | grep 'processor' | wc -l
  • 1

其中: 
總核數 = 物理CPU個數 X 每顆物理CPU的核數 
總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超執行緒數