深度学习中整理图像数据常用的批处理方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BobAuditore/article/details/56682128

一、前言

对于图片识别的深度学习任务,常常需要把大量图片当做训练数据,这时候对于数据的批量处理就十分重要。

本文借助如下方法实现了训练图像和测试图像的记录,方便生成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文件的路径。

注意没有考虑目录创建问题,如原来没有目录可能需要自己创建。


相信这篇短文能够给你整理训练图片带来极大的方便!


猜你喜欢

转载自blog.csdn.net/BobAuditore/article/details/56682128