一、前言
对于图片识别的深度学习任务,常常需要把大量图片当做训练数据,这时候对于数据的批量处理就十分重要。
本文借助如下方法实现了训练图像和测试图像的记录,方便生成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文件的路径。
注意没有考虑目录创建问题,如原来没有目录可能需要自己创建。
相信这篇短文能够给你整理训练图片带来极大的方便!