• 动物数据集+动物分类识别训练代码(Pytorch)


    Pytorch实现动物识别(含动物数据集和训练代码)


    目录

    动物数据集+动物分类识别训练代码(Pytorch)

    1. 前言

    2. Animals-Dataset动物数据集说明

    (1)Animals90动物数据集

    (2)Animals10动物数据集

    (3)自定义数据集

    3. 动物分类识别模型训练

    (1)项目安装

    (2)准备Train和Test数据

    (3)配置文件: config.yaml

    (4)开始训练

    (5)可视化训练过程

    (6)一些优化建议

    (7) 一些运行错误处理方法:

    cannot import name 'load_state_dict_from_url' 

    4. 动物分类识别模型测试效果

    5.项目源码下载


    1. 前言

    基于人工智能的动物AI识别,能够帮助我们快速认知动物品种,对动物科普等研究方面具有重大的意义。本项目将采用深度学习的方法,搭建一个动物分类识别的训练和测试系统。 基于该项目,你可以快速训练一个动物分类识别模型。

    目前,基于ResNet18的动物分类识别,支持90种动物分类识别;在Animals90动物数据集上,训练集的Accuracy 99%左右,测试集的Accuracy在91%左右;在Animals10动物数据集上,训练集的Accuracy 99%左右,测试集的Accuracy在96%左右。骨干网络模型可支持googlenet, resnet[18,34,50], inception_v3,mobilenet_v2等常用的模型。

    如果想进一步提高准确率,可以尝试:

    1. 增加样本数据: 可以采集更多的样本数据,提高模型泛化能力
    2. 减少种类:Animals90动物数据集共有90种类,可以剔除部分不常见的动物
    3. 数据清洗数据:动物数据集,部分数据是通过网上爬取的,存在部分错误的图片,尽管鄙人已经清洗一部分了,但还是建议你,训练前,再次清洗数据集,不然会影响模型的识别的准确率。
    4. 使用不同backbone模型,比如resnet50或者更深的模型
    5. 增加数据增强: 已经支持: 随机裁剪,随机翻转,随机旋转,颜色变换等数据增强方式,可以尝试诸如mixup,CutMix等更复杂的数据增强方式
    6. 样本均衡: 建议进行样本均衡处理
    7. 调超参: 比如学习率调整策略,优化器(SGD,Adam等)
    8. 损失函数: 目前训练代码已经支持:交叉熵,LabelSmoothing,可以尝试FocalLoss等损失函数

    【源码下载】动物数据集+动物分类识别训练代码(Pytorch)

    【尊重原创,转载请注明出处】https://panjinquan.blog.csdn.net/article/details/126640766


    2. Animals-Dataset动物数据集说明

    (1)Animals90动物数据集

    Animals90动物数据集,包含 90 个不同类别动物,约有 5400 张动物图像,每种类含有60张图片。所有照片都已经按照其所属类别存放于各自的文件夹下。动物种类包括常见的类别,如羚羊,獾,蝙蝠,熊,蜜蜂,甲虫,野牛,公猪,蝴蝶,猫 毛虫,黑猩猩等。

    为了方便训练,鄙人已将数据划分为训练集和测试集,其中训练集每类50张图片,共4500张图片;测试集每类10张图片,共900张图片

    下面是Animals90动物数据集90类别名称:

    1. antelope
    2. badger
    3. bat
    4. bear
    5. bee
    6. beetle
    7. bison
    8. boar
    9. butterfly
    10. cat
    11. caterpillar
    12. chimpanzee
    13. cockroach
    14. cow
    15. coyote
    16. crab
    17. crow
    18. deer
    19. dog
    20. dolphin
    21. donkey
    22. dragonfly
    23. duck
    24. eagle
    25. elephant
    26. flamingo
    27. fly
    28. fox
    29. goat
    30. goldfish
    31. goose
    32. gorilla
    33. grasshopper
    34. hamster
    35. hare
    36. hedgehog
    37. hippopotamus
    38. hornbill
    39. horse
    40. hummingbird
    41. hyena
    42. jellyfish
    43. kangaroo
    44. koala
    45. ladybugs
    46. leopard
    47. lion
    48. lizard
    49. lobster
    50. mosquito
    51. moth
    52. mouse
    53. octopus
    54. okapi
    55. orangutan
    56. otter
    57. owl
    58. ox
    59. oyster
    60. panda
    61. parrot
    62. pelecaniformes
    63. penguin
    64. pig
    65. pigeon
    66. porcupine
    67. possum
    68. raccoon
    69. rat
    70. reindeer
    71. rhinoceros
    72. sandpiper
    73. seahorse
    74. seal
    75. shark
    76. sheep
    77. snake
    78. sparrow
    79. squid
    80. squirrel
    81. starfish
    82. swan
    83. tiger
    84. turkey
    85. turtle
    86. whale
    87. wolf
    88. wombat
    89. woodpecker
    90. zebra

    (2)Animals10动物数据集

    Animals10动物数据集,仅包含 10个不同类别动物,分别为:蝴蝶,猫,鸡,牛,狗,象,马,羊,蜘蛛和松鼠,总共约有26000+张动物图像。其中训练集共25000+张图片,平均每类含有2500张图片;测试集每类100张图片,共1000张图片。所有照片都已经按照其所属类别存放于各自的文件夹下。

      下面是Animals10动物数据集10类别名称:

    1. butterfly
    2. cat
    3. chicken
    4. cow
    5. dog
    6. elephant
    7. horse
    8. sheep
    9. spider
    10. squirrel

    (3)自定义数据集

    如果需要新增类别数据,或者需要自定数据集进行训练,可以如下进行处理:

    • Train和Test数据集,要求相同类别的图片,放在同一个文件夹下;且子目录文件夹命名为类别名称,如

    • 类别文件:一行一个列表: 
       class_name.txt
       (最后一行,请多回车一行)
    1. A
    2. B
    3. C
    4. D
    • 修改配置文件的数据路径:config.yaml
    1. train_data: # 可添加多个数据集
    2. - 'data/dataset/train1'
    3. - 'data/dataset/train2'
    4. test_data: 'data/dataset/test'
    5. class_name: 'data/dataset/class_name.txt'
    6. ...
    7. ...

    3. 动物分类识别模型训练

    考虑到Animals90动物数据集种类比较齐全,因此本项目以Animals90动物数据集为训练样本,当然你也可以合并Animals90和Animals10这两个数据集进行训练。

    (1)项目安装

    整套工程基本框架结构如下:

    1. .
    2. ├── classifier                 # 训练模型相关工具
    3. ├── configs                    # 训练配置文件
    4. ├── data                      # 训练数据
    5. ├── libs           
    6. ├── demo.py              # 模型推理demo
    7. ├── README.md            # 项目工程说明文档
    8. ├── requirements.txt    # 项目相关依赖包
    9. └── train.py             # 训练文件

      项目依赖python包请参考requirements.txt,使用pip安装即可:

    1. numpy==1.16.3
    2. matplotlib==3.1.0
    3. Pillow==6.0.0
    4. easydict==1.9
    5. opencv-contrib-python==4.5.2.52
    6. opencv-python==4.5.1.48
    7. pandas==1.1.5
    8. PyYAML==5.3.1
    9. scikit-image==0.17.2
    10. scikit-learn==0.24.0
    11. scipy==1.5.4
    12. seaborn==0.11.2
    13. tensorboard==2.5.0
    14. tensorboardX==2.1
    15. torch==1.7.1+cu110
    16. torchvision==0.8.2+cu110
    17. tqdm==4.55.1
    18. xmltodict==0.12.0
    19. basetrainer
    20. pybaseutils==0.6.5

      项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):

    (2)准备Train和Test数据

    下载动物分类数据集,Train和Test数据集,要求相同类别的图片,放在同一个文件夹下;且子目录文件夹命名为类别名称。

    数据增强方式主要采用: 随机裁剪,随机翻转,随机旋转,颜色变换等处理方式

    1. import numbers
    2. import random
    3. import PIL.Image as Image
    4. import numpy as np
    5. from torchvision import transforms
    6. def image_transform(input_size, rgb_mean=[0.5, 0.5, 0.5], rgb_std=[0.5, 0.5, 0.5], trans_type="train"):
    7. """
    8. 不推荐使用:RandomResizedCrop(input_size), # bug:目标容易被crop掉
    9. :param input_size: [w,h]
    10. :param rgb_mean:
    11. :param rgb_std:
    12. :param trans_type:
    13. :return::
    14. """
    15. if trans_type == "train":
    16. transform = transforms.Compose([
    17. transforms.Resize([int(128 * input_size[1] / 112), int(128 * input_size[0] / 112)]),
    18. transforms.RandomHorizontalFlip(), # 随机左右翻转
    19. # transforms.RandomVerticalFlip(), # 随机上下翻转
    20. transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.1),
    21. transforms.RandomRotation(degrees=5),
    22. transforms.RandomCrop([input_size[1], input_size[0]]),
    23. transforms.ToTensor(),
    24. transforms.Normalize(mean=rgb_mean, std=rgb_std),
    25. ])
    26. elif trans_type == "val" or trans_type == "test":
    27. transform = transforms.Compose([
    28. transforms.Resize([input_size[1], input_size[0]]),
    29. # transforms.CenterCrop([input_size[1], input_size[0]]),
    30. # transforms.Resize(input_size),
    31. transforms.ToTensor(),
    32. transforms.Normalize(mean=rgb_mean, std=rgb_std),
    33. ])
    34. else:
    35. raise Exception("transform_type ERROR:{}".format(trans_type))
    36. return transform

    修改配置文件数据路径:config.yaml

    • 注意数据路径分隔符使用【/】,不是【\】
    • 项目不要出现含有中文字符的目录文件或路径,否则会出现很多异常!
    1. # 训练数据集,可支持多个数据集
    2. train_data:
    3. - '/path/to/animal/animals90/train'
    4. # 测试数据集
    5. test_data: '/path/to/animal/animals90/test'
    6. # 类别文件
    7. class_name: '/path/to/animal/animals90/class_name.txt'

    (3)配置文件: config.yaml

    • 目前支持的backbone有:googlenet,resnet[18,34,50],inception_v3,mobilenet_v2等, 其他backbone可以自定义添加
    • 训练参数可以通过(configs/config.yaml)配置文件进行设置

     配置文件config.yaml说明如下:

    1. # 训练数据集,可支持多个数据集
    2. train_data:
    3. - '/path/to/animal/animals90/train'
    4. # 测试数据集
    5. test_data: '/path/to/animal/animals90/test'
    6. # 类别文件
    7. class_name: '/path/to/animal/animals90/class_name.txt'
    8. train_transform: "train" # 训练使用的数据增强方法
    9. test_transform: "val" # 测试使用的数据增强方法
    10. work_dir: "work_space/" # 保存输出模型的目录
    11. net_type: "resnet18" # 骨干网络,支持:resnet18/50,mobilenet_v2,googlenet,inception_v3
    12. width_mult: 1.0
    13. input_size: [ 224,224 ] # 模型输入大小
    14. rgb_mean: [ 0.5, 0.5, 0.5 ] # for normalize inputs to [-1, 1],Sequence of means for each channel.
    15. rgb_std: [ 0.5, 0.5, 0.5 ] # for normalize,Sequence of standard deviations for each channel.
    16. batch_size: 32
    17. lr: 0.01 # 初始学习率
    18. optim_type: "SGD" # 选择优化器,SGD,Adam
    19. loss_type: "CrossEntropyLoss" # 选择损失函数:支持CrossEntropyLoss,LabelSmoothing
    20. momentum: 0.9 # SGD momentum
    21. num_epochs: 100 # 训练循环次数
    22. num_warn_up: 3 # warn-up次数
    23. num_workers: 8 # 加载数据工作进程数
    24. weight_decay: 0.0005 # weight_decay,默认5e-4
    25. scheduler: "multi-step" # 学习率调整策略
    26. milestones: [ 20,50,80 ] # 下调学习率方式
    27. gpu_id: [ 0 ] # GPU ID
    28. log_freq: 50 # LOG打印频率
    29. progress: True # 是否显示进度条
    30. pretrained: False # 是否使用pretrained模型
    31. finetune: False # 是否进行finetune

    参数类型参考值说明
    train_datastr, list-训练数据文件,可支持多个文件
    test_datastr, list-测试数据文件,可支持多个文件
    class_namestr-类别文件
    work_dirstrwork_space训练输出工作空间
    net_typestrresnet18
    backbone类型,{resnet18/50,mobilenet_v2,googlenet,inception_v3}
    input_sizelist[128,128]模型输入大小[W,H]
    batch_sizeint32batch size
    lrfloat0.1初始学习率大小
    optim_typestrSGD优化器,{SGD,Adam}
    loss_typestrCELoss损失函数
    schedulerstrmulti-step学习率调整策略,{multi-step,cosine}
    milestoneslist[30,80,100]降低学习率的节点,仅仅scheduler=multi-step有效
    momentumfloat0.9SGD动量因子
    num_epochsint120循环训练的次数
    num_warn_upint3warn_up的次数
    num_workersint12DataLoader开启线程数
    weight_decayfloat5e-4权重衰减系数
    gpu_idlist[ 0 ]指定训练的GPU卡号,可指定多个
    log_freqin20显示LOG信息的频率
    finetunestrmodel.pthfinetune的模型
    progressboolTrue是否显示进度条
    distributedboolFalse是否使用分布式训练

    (4)开始训练

    整套训练代码非常简单操作,用户只需要将相同类别的数据放在同一个目录下,并填写好对应的数据路径,即可开始训练了。

    终端输入:

    python train.py -c configs/config.yaml 
    

    (5)可视化训练过程

    训练过程可视化工具是使用Tensorboard,使用方法,在终端输入:
    
    1. # 基本方法
    2. tensorboard --logdir=path/to/log/
    3. # 例如
    4. tensorboard --logdir=work_space/mobilenet_v2_1.0_CrossEntropyLoss/log

    可视化效果 

    ​​​​
    ​​​​
    ​​​​

    (6)一些优化建议

    训练完成后,目前,基于ResNet18的动物分类识别在Animals90动物数据集上,训练集的Accuracy 99%左右,测试集的Accuracy在91%左右;在Animals10动物数据集上,训练集的Accuracy 99%左右,测试集的Accuracy在96%左右。如果想进一步提高准确率,可以尝试:

    1. 增加样本数据: 可以采集更多的样本数据,提高模型泛化能力
    2. 减少种类:Animals90动物数据集共有90种类,可以剔除部分不常见的动物
    3. 数据清洗数据:动物数据集,部分数据是通过网上爬取的,存在部分错误的图片,尽管鄙人已经清洗一部分了,但还是建议你,训练前,再次清洗数据集,不然会影响模型的识别的准确率。
    4. 使用不同backbone模型,比如resnet50或者更深的模型
    5. 增加数据增强: 已经支持: 随机裁剪,随机翻转,随机旋转,颜色变换等数据增强方式,可以尝试诸如mixup,CutMix等更复杂的数据增强方式
    6. 样本均衡: 建议进行样本均衡处理
    7. 调超参: 比如学习率调整策略,优化器(SGD,Adam等)
    8. 损失函数: 目前训练代码已经支持:交叉熵,LabelSmoothing,可以尝试FocalLoss等损失函数

    (7) 一些运行错误处理方法:

    • 项目不要出现含有中文字符的目录文件或路径,否则会出现很多异常!!!!!!!!

    • cannot import name 'load_state_dict_from_url' 

    由于一些版本升级,会导致部分接口函数不能使用,请确保版本对应

    torch==1.7.1

    torchvision==0.8.2

    或者将对应python文件将

    from torchvision.models.resnet import model_urls, load_state_dict_from_url
    

    修改为:

    1. from torch.hub import load_state_dict_from_url
    2. model_urls = {
    3. 'mobilenet_v2': 'https://download.pytorch.org/models/mobilenet_v2-b0353104.pth',
    4. 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',
    5. 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',
    6. 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',
    7. 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',
    8. 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',
    9. 'resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth',
    10. 'resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth',
    11. 'wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth',
    12. 'wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth',
    13. }


    4. 动物分类识别模型测试效果

     demo.py文件用于推理和测试模型的效果,填写好配置文件,模型文件以及测试图片即可运行测试了

    1. def get_parser():
    2. # 配置文件
    3. config_file = "data/pretrained/resnet18_1.0_LabelSmoothing_20220830191723/config.yaml"
    4. # 模型文件
    5. model_file = "data/pretrained/resnet18_1.0_LabelSmoothing_20220830191723/model/best_model_096_91.1111.pth"
    6. # 待测试图片目录
    7. image_dir = "data/test_images/animals"
    8. parser = argparse.ArgumentParser(description="Inference Argument")
    9. parser.add_argument("-c", "--config_file", help="configs file", default=config_file, type=str)
    10. parser.add_argument("-m", "--model_file", help="model_file", default=model_file, type=str)
    11. parser.add_argument("--device", help="cuda device id", default="cuda:0", type=str)
    12. parser.add_argument("--image_dir", help="image file or directory", default=image_dir, type=str)
    13. return parser
    1. #!/usr/bin/env bash
    2. # Usage:
    3. # python demo.py -c "path/to/config.yaml" -m "path/to/model.pth" --image_dir "path/to/image_dir"
    4. # 配置文件
    5. config_file="data/pretrained/resnet18_1.0_LabelSmoothing_20220830191723/config.yaml"
    6. # 模型文件
    7. model_file="data/pretrained/resnet18_1.0_LabelSmoothing_20220830191723/model/best_model_096_91.1111.pth"
    8. # 待测试图片目录
    9. image_dir="data/test_images/animals"
    10. python demo.py -c $config_file -m $model_file --image_dir $image_dir

    Windows系统,请将$config_file, $model_file ,$image_dir等变量代替为对应的变量值即可,如

    1. # 配置文件
    2. python demo.py -c "data/pretrained/resnet18_1.0_LabelSmoothing_20220830191723/config.yaml" -m "data/pretrained/resnet18_1.0_LabelSmoothing_20220830191723/model/best_model_096_91.1111.pth" --image_dir "data/test_images/animals"

    运行测试结果: 

    pred_index:['cat'],pred_score:[0.9299037]

    ​pred_index:['cow'],pred_score:[0.8641183]

    pred_index:['duck'],pred_score:[0.20411915]

    pred_index:['duck'],pred_score:[0.8169622]


    5.项目源码下载

    整套项目源码内容包含:

    • Animals90动物数据集,包含 90 个不同类别动物,总共约有5400 张动物图像,每种类含有60张图片,其中训练集每类50张图片,共4500张图片;测试集每类10张图片,共900张图片
    • Animals10动物数据集,包含 10 个不同类别动物,总共约有26000+张动物图像,其中训练集共25000+张图片,平均每类含有2500张图片;测试集每类100张图片,共1000张图片
    • 支持自定义数据集训练
    • 整套动物分类训练代码和测试代码(Pytorch版本), 支持的backbone骨干网络模型有:googlenet,resnet[18,34,50],inception_v3,mobilenet_v2等, 其他backbone可以自定义添加

     【源码下载】动物数据集+动物分类识别训练代码(Pytorch)

  • 相关阅读:
    前端开发常用网站
    区间dp
    pdf文件如何添加水印?
    【多服务场景化解决方案】智能家居(UrbanHome)
    自己动手写ls命令——Java版
    如何快速合并PDF文件?几个方法教你合并PDF
    记一次字符串末尾空白丢失的排查 → MySQL 是会玩的!
    电商项目之Java8函数式接口落地实践
    管理信息系统总复习、第五章(企业应用系统和业务流程集成)
    RunwayGen2上线全新控制功能「运动笔刷」
  • 原文地址:https://blog.csdn.net/guyuealian/article/details/126640766