美文网首页PyTorchPyTorch
使用PyTorch及ResNet构建简单手势分类器

使用PyTorch及ResNet构建简单手势分类器

作者: Meng_Blog | 来源:发表于2018-04-30 10:27 被阅读575次

    项目地址

    我的github地址

    目的

    对手势数字数据集进行分类。数据采用./data/images/中的数据。其中,训练集4324张,测试集484张,手势数字类别:0-5,图像大小均为64*64。

    Update

    • 180521:增加多GPU支持
      • 设置classifier_train.pyclassifier_test.py文件中的params.gpus变量设定使用的GPU序号(与nvidia-smi命令显示的GPU需要对应)。例如:params.gpus = [2,3]
      • CPU模式:设定params.gpus = []
      • 由于目前测试部分计算量小,因此当前代码执行测试步骤(classifier_test.py)时,仅使用指定的第一个GPU(params.gpus[0]

    步骤

    使用Pytorch为工具,以ResNet34或者ResNet101为基础,实现手势识别。

    • 数据准备:
    • 训练步骤:
      • 首先使用nohup python -m visdom.server &打开Visdom服务器
      • 然后运行classifier_train.py即可。
      • 训练好的模型将以.pth文件的形式保存在./models/文件夹下。
      • 注意:需根据GPU情况调整代码中的batch_size参数,确保显存不溢出。
        • ResNet34,1GPU,batch_size=120,显存占用<7G
        • ResNet101,1GPU,batch_size=60,显存占用<10G
    • 测试步骤:
      • 修改classifier_test.py文件相关参数,其中ckpt表示模型加载位置,testdata_dir表示待测试图片文件夹。注意ckpt需要与model选择相对应。
      • 然后运行classifier_test.py即可。在控制台输出每张图片的预测结果。

    方法

    • 使用的库:PIL、torch、torchvision、numpy、visdom

    • ResNet:

      对ResNet34及ResNet101两种网络进行实验。为了节省较深网络中的参数,ResNet34及ResNet101分别具有两种不同的基本“shortcut connection”结构。ResNet34使用BasicBlock,ResNet101使用 Bottleneck作为“shortcut connection”。

    BasicBlock_Bottleneck ResNet34_ResNet101

    训练代码流程

    1. Hyper-params: 设置数据加载路径、模型保存路径、初始学习率等参数。
    2. Training parameters: 用于定义模型训练中的相关参数,例如最大迭代次数、优化器、损失函数、是否使用GPU等、模型保存频率等
    3. load data: 定义了用于读取数据的Hand类,在其中实现了数据、标签读取及预处理过程。预处理过程在__getitem__中。
    4. models: 从定义的ResNet类,实例化ResNet34及ResNet101网络模型。
    5. optimizer、criterion、lr_scheduler: 定义优化器为SGD优化器,损失函数为CrossEntropyLoss,学习率调整策略采用ReduceLROnPlateau。
    6. trainer: 定义了用于模型训练和验证的类Trainer,trainer为Trainer的实例化。在Trainer的构造函数中根据步骤二中的参数设定,对训练过程中的参数进行设置,包括训练数据、测试数据、模型、是否使用GPU等。
      Trainer中定义了训练和测试函数,分别为train()_val_one_epoch()train()函数中,根据设定的最大循环次数进行训练,每次循环调用_train_one_epoch()函数进行单步训练。训练过程中的loss保存在loss_meter中,confusion_matrix中保存具体预测结果。_val_one_epoch()函数对测试集在当前训练模型上的表现进行测试,具体预测结果保存在val_cm中,预测精度保存在val_accuracy中。
      最后,通过Visdom工具对结果进行输出,包括loss和accuracy以及训练日志。可以在浏览器地址 http://localhost:8097 中查看结果。

    测试代码流程

    1. Test parameters: 用于定义模型测试中的相关参数
    2. models: 从定义的ResNet类,实例化ResNet34及ResNet101网络模型。
    3. tester: 对测试类Tester实例化,Tester中主要进行模型加载函数与预测函数。
      _load_ckpt()函数加载模型;
      test()函数进行预测,其中定义了对单张图片进行预处理的过程,并输出预测结果。

    Result

    • Loss


      loss
    • accuracy


      accuracy
    • 预测结果:

    Processing image: img_0046.png
    Prediction number: 0
    Processing image: img_0000.png
    Prediction number: 1
    Processing image: img_0072.png
    Prediction number: 2
    Processing image: img_0080.png
    Prediction number: 4
    Processing image: img_0100.png
    Prediction number: 5
    Processing image: img_0014.png
    Prediction number: 3
    

    Reference

    相关文章

      网友评论

      • 87ede6f29553:楼主,数据集是不是不全啊 只有images下只有训练集
        Meng_Blog:你好。images文件夹下有两个子文件夹,分别是train文件夹和test文件夹。train.txt和test.txt文件中的信息分别与这两个文件夹内的图片对应。网络训练过程中仅适用train文件夹中的图片,test文件夹中的图片仅用于验证(例如Trainer.py文件中的_val_one_epoch函数)。
        所以test文件夹中的数据不影响训练结果,仅起到验证作用。你可以直接用这些图片当做测试集。或者从test文件夹中随便选一些图片放在testimg文件夹中进行单张图片的测试。
      • Meng_Blog:【更新180507】:
        1. 增加了单张图片预测代码;
        2. 修改了Trainer中保存模型路径部分的代码
        【TODO】:
        1. 增加多GPU使用的代码
        Meng_Blog:【更新180521】:
        已增加多GPU支持
        363b60eefb84:持续关注!!!真的很棒,如果能把具体参数调试和过程写的细一点就更好了
      • 68ceaf5b32b4:我每次运行都出错RuntimeError: cuda runtime error (2) : out of memory at /pytorch/aten/src/THC/generic/THCStorage.cu:58 好气呀
        363b60eefb84:你可以发一下你的邮箱吗?我把具体的报错信息截图发给你邮箱。/home/uestc-c1501e/PycharmProjects/pytorch_hand_classifier-master/utils/Trainer.py:148: UserWarning: volatile was removed and now has no effect. Use `with torch.no_grad():` instead.
        inputs = Variable(data, volatile=True)
        /home/uestc-c1501e/PycharmProjects/pytorch_hand_classifier-master/utils/Trainer.py:149: UserWarning: volatile was removed and now has no effect. Use `with torch.no_grad():` instead.
        target = Variable(label.type(t.LongTensor), volatile=True)
        THCudaCheck FAIL file=/pytorch/aten/src/THC/generic/THCStorage.cu line=58 error=2 : out of memory
        Meng_Blog:你好,可能是因为你的GPU显存不够。现在这个版本的代码不修改的话,用1个GPU,大概占用9.7G显存。你可以试试调低classifier_train.py文件中的‘batch_size’,降低到45或者40应该差不多。
      • IT人故事会:赞,找了好久才找到!
        Meng_Blog:谢谢,过几天会更新单张图片测试部分的代码

      本文标题:使用PyTorch及ResNet构建简单手势分类器

      本文链接:https://www.haomeiwen.com/subject/vejzlftx.html