DOS批處理對人臉庫進行分類

正如linux下面shell腳本一樣,windows下也可以使用DOS批處理腳本文件對文件進行管理。

本文背景

在做人臉識別的時候,開始是在ORL人臉庫上測試識別率,所以測試程序是根據ORL的目錄結構來寫的,(ORL人臉是分類存放的,不同的人臉放在不同的目錄下,同一個人的人臉放在同一個目錄下)。後來又需要在CASE_PEAL-R1人臉庫上進行測試,這是中科院採集的中國人的人臉庫,它的目錄結構跟ORL不同,它把所有人臉都放在一個目錄下,不同人的人臉通過文件名來區分。那麼,要在這個庫上進行測試,就有兩個方案,一是再根據這個目錄結構重寫一個測試代碼,二是把這個目錄結構改成跟ORL一樣的格式。顯然第二種方式更好,如果文件比較少的話,手動創建幾個目錄,再把文件分類存放就可以了,但是CASE_PEAL-R1人臉庫一個子集有幾千張人臉圖像,顯然手動的方式行不通,如果在linux下很容易就想到寫一個shell腳本分分鐘搞定它,但是又不想把文件拷到linux下轉換之後又拷回來,那麼最好的方法就是寫一個DOS批處理的腳本來處理了。

分類前的人臉庫

如下所示,同一個人的人臉圖像名稱主標識一樣,副標識不同,不同的人主標識不一樣。


分類程序代碼

classify.bat

@echo off & setlocal EnableDelayedExpansion ::延遲變量
set /a cnt=0
set /a num=5
set /a class=0
for %%s in (*.bmp) do ( ::獲取當前目錄下*.bmp文件
	set /a result=!cnt!%%%num%
	if !result! equ 0 (::創建目錄
		set /a class+=1
		echo "class=!class!"
		mkdir !class!
	)
	@echo %%s 
	@move %%s !class!
	@set /a cnt+=1
	@echo !cnt!
)
pause
以上代碼,首先給出了同一個人有5張人臉,然後再遍歷當前目錄下的所有文件,注意由於人臉庫是由文件名來區分類別的,所以遍歷的時候每個人的人臉是按先後順序遍歷出的,對於文件名沒有這種規律的該程序並不起作用,每遍歷5次(即遍歷次數對5求餘等於0的時候)就創建一個類別目錄,同時將該類別的文件移動到類別目錄中。將代碼拷貝到一個.txt文本文件中再保存爲classify.bat,把這個文件拷貝到人臉庫所在目錄,雙擊運行即可。

這裏有個DOS知識點就是,@echo off & setlocal EnableDelayedExpansion ::延遲變量,在這句代碼中@表示取消命令回顯,即運行的時候DOS終端窗口不會顯示命令本身,只會顯示結果或錯誤信息, & setlocal EnableDelayedExpansion ::延遲變量這裏是爲了在for循環中每次循環都使用變量最新的值,並且使用!變量名!來引用,如果使用%變量名%,只會引用到最初的值和最後的值。

分類後的人臉庫


逆分類程序代碼

如果像還原成CASE_PEAL-R1本身的目錄結構,那麼就可以使用下面的代碼實現:

unclassify.bat

@echo off & setlocal EnableDelayedExpansion 
set /a cnt=0
set /a num=5
set /a class=0
for /r %%s in (*.bmp) do ( ::移出所有文件
	echo %%s
	move %%s .
)

for /d %%s in (*) do ( ::刪除目錄
	echo %%s
	rd %%s
)

pause
這裏注意for /r %%s in (*.bmp) do會遍歷當前目錄及其子目錄以及子目錄的子目錄等下面的所有*.bmp的圖像文件,for /d %%s in (*) 遍歷得到所有子目錄名稱。

同樣把代碼拷貝到.txt文件中再另存爲unclassify.bat,再把這個文件拷貝到人臉庫文件中雙擊運行,人臉庫就還原爲原來的目錄結構了!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章