深度學習中整理圖像數據常用的批處理方法

一、前言

對於圖片識別的深度學習任務,常常需要把大量圖片當做訓練數據,這時候對於數據的批量處理就十分重要。

本文藉助如下方法實現了訓練圖像和測試圖像的記錄,方便生成lmdb等格式的文件以供訓練。

1.利用bat,導出圖片文件目錄信息到directory.set文件;

2.利用c++代碼把目錄文件directory.set分割成訓練集train.set和測試集test.set。

完成這2步後,你便可以根據set文件中的圖片目錄來讀入並處理圖片,相當方便。


二、導出directory.set

新建txt文件,寫入以下2句,重命名爲directory.bat:

del directory.set
dir .\*.jpg /s/b > directory.set

第一句表示刪除上一次生成的directory.set,方便循環多次使用此bat文件;

第二句表示把所有相對路徑爲.\*.jpg的圖片的絕對路徑按行導出到directory.set;

其中/s表示顯示指定目錄和所有子目錄中文件,

/b表示只顯示文件名與擴展名

舉個例子:

1)testImgs中放入圖片


2)directory.bat中寫入如下命令:

del directory.set
dir .\testImgs\*.jpg /s/b > directory.set

3)當前目錄下生成的directory.set中就會存有按行顯示的圖片路徑。




三、利用c++把set文件分割成train.set和test.set

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char** argv) {
	if (argc != 4) {
		std::cerr << "This program obtains orginal set file and randomly seperate it into train_val or test set file line by line. \n"
			<< "Usage: " << argv[0]
			<< " \"Path of original set file\" "
			<< " \"Path of train_val set file\""
			<< " \"Path of test set file\"" << std::endl;
		system("pause");
		return 1;
	}

	fstream _originalSetFile;
	fstream _trainSetFile;
	fstream _testSetFile;
	string InputDir = "";

	_originalSetFile.open(argv[1], ios::in);
	if (!_originalSetFile){
		std::cout << "---------- 指定的set文件不存在 ---------- " << std::endl;
		return 1;
	}
	else{
		_trainSetFile.open(argv[2], ios::out);
		if (!_trainSetFile) {
			std::cout << "---------- train_val.set文件創建失敗! ---------- " << std::endl;
			return 1;
		}
		_testSetFile.open(argv[3], ios::out);
		if (!_testSetFile) {
			std::cout << "---------- test.set文件創建失敗! ---------- " << std::endl;
			return 1;
		}
		if (_trainSetFile && _testSetFile) { 
			while (getline(_originalSetFile, InputDir)){
				int tmp = rand() % 10;
				if (tmp < 7){
					_trainSetFile << InputDir << endl;
				}
				else {
					_testSetFile << InputDir << endl;
				}
			}//	end of while
			std::cout << "---------- train_val.set文件寫入成功! ---------- " << std::endl;
			std::cout << "---------- test.set文件寫入成功! ---------- " << std::endl;
			_originalSetFile.close();
			_trainSetFile.close();
			_testSetFile.close();
		}
		else { return 1; }
	}// end of if (!_originalSetFile)

	system("pause");
	return 0;
}

這段代碼簡單易懂,其實就用了fstream。。。

參數也寫的清楚,除了exe文件外就是3個set文件的路徑。

注意沒有考慮目錄創建問題,如原來沒有目錄可能需要自己創建。


相信這篇短文能夠給你整理訓練圖片帶來極大的方便!


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