本教程分多个章节:
- 第一章:开发环境搭建:VS+libtorch和Qt+libtorch
- 第二章:张量的常规操作
- 第三章:简单的CNN, MLP, LSTM模型搭建
- 第四章:数据加载模块使用
- 第五章:分类模型搭建,训练和预测
- 第六章:分割模型搭建,训练和预测
- 第七章:目标检测模型搭建,训练和预测
- 第八章:总结和展望
本章将详细介绍如何使用libtorch自带的数据加载模块,使用该模块是实现模型训练的重要条件。除非这个数据加载模块功能不够,不然继承libtorch的数据加载类还是很有必要的,简单高效。
使用前置条件
libtorch提供了丰富的基类供用户自定义派生类,torch::data::Dataset就是其中一个常用基类。使用该类需要明白基类和派生类,以及所谓的继承和多态。有c++编程经验者应该都不会陌生,为方便不同阶段读者就简单解释一下吧。类就是父亲,可以生出不同的儿子,生儿子叫派生或者继承(看使用语境),生不同的儿子就实现了多态。父亲就是基类,儿子就是派生类。现实中,父亲会把自身的一部分财产留下来养老,儿子们都不能碰,这就是private了,部分财产儿子能用,但是儿子的对象不能用,这叫protected,还有些财产谁都能用就是public。和现实中的父子类似,代码中,派生类可以使用父类的部分属性或者函数,全看父类怎样定义。
然后理解一下虚函数,就是父亲指定了部分财产是public的,但是是用来买房的,不同的儿子可以买不同的房子,可以全款可以贷款,这就是财产在父亲那就是virtual的。子类要继承这个virtual财产可以自己重新规划使用方式。
事实上,如果有过pytorch的编程经验者很快会发现,libtorch的Dataset类的使用和python下使用非常相像。pytorch自定义dataload,需要定义好Dataset的派生类,包括初始化函数__init__,获取函数__getitem__以及数据集大小函数__len__。类似的,libtorch中同样需要处理好初始化函数,get()函数和size()函数。
图片文件遍历
下面以分类任务为例,介绍libtorch的Dataset类的使用。使用pytorch官网提供的昆虫分类数据集,下载到本地解压。将该数据集根目录作为索引,实现Dataloader对图片的加载。
首先定义一个加载图片的函数,使用网上出现较多的c++遍历文件夹的代码,将代码稍作修改如下:
//遍历该目录下的.jpg图片
void load_data_from_folder(std::string image_dir, std::string type, std::vector<std::string> &list_images, std::vector<int> &list_labels, int label);
void load_data_from_folder(std::string path, std::string type, std::vector<std::string> &list_images, std::vector<int> &list_labels, int label)