一行代码训练一个图像分类器(Luwu教程系列)

大佬们好,很久不见……(真*很久不见=。=)

很长时间没有写过博文了,为表歉意,今天给大佬们整个花活儿~ 那就是我这次要讲的主题咯——Luwu~

那么,Luwu是啥?是本菜鸡写的一个辣鸡开源项目……

一行代码训练一个图像分类器(Luwu教程系列)_第1张图片

这个辣鸡开源项目有啥用呢?

咳咳,Luwu,即 陆吾,旨在提供一个 无代码低代码深度学习工具 (开发初衷只是为了方便自己偷懒……哪怕只是简单的深度学习任务中,往往也存在大量重复而繁琐的工作,这些低价值的任务不应该浪费我们宝贵的时间。自动化,yyds!)

Luwu的诉求大致可以归结为两点:

  • 使无深度学习相关背景的开发人员也能轻松完成简单深度学习任务开发
  • 使深度学习开发人员能够更快、更简单地完成一般深度学习任务

截止到 2021/6/14 日,现已支持的任务类型有(当前Luwu的版本号为0.32):

  • 图像分类
  • 目标检测
  • 文本分类
  • 文本序列标注(命名实体识别)

辣鸡项目的更多功能,还在由辣鸡作者持续迭代中……

Luwu仍处于项目初期,很多地方都不完善,项目不太成熟,所以接口/使用方式在后续的过程中可能会有所调整,大佬们见谅~

但是,还是为辣鸡项目求个 star 吧,有喜欢的大佬们欢迎 star ~ 然后有热心的大佬愿意贡献代码的话也随时欢迎 ~

一行代码训练一个图像分类器(Luwu教程系列)_第2张图片

项目地址:

https://github.com/AaronJny/luwu

更多信息请参考项目的readme文档。

嘛,不给 star 就算啦,反正最初也只是为了方便自己~ 佛系ing

一行代码训练一个图像分类器(Luwu教程系列)_第3张图片

好了,闲话不多说,开始整活儿~

转载请注明来源:https://blog.csdn.net/aaronjny/article/details/117917378

一、安装 Luwu

首先说个不太好的消息,安装和使用 Luwu 对网络环境有一定要求。因为安装和使用的过程中,可能会从 GitHubGoogle 下载文件(比如 TensorFlow Object Detection APIBERT预训练权重、访问kaggle等),所以请保证你的网络可以正常访问Google,或者使用代理,否则可能会因为网络原因导致 Luwu 无法正常使用。

如果没法正常访问Google的话,在命令行中设置代理的方式如下(需要自己准备代理):

假如你的代理地址和端口如下:

类型 地址 端口
http http://127.0.0.1 7890
https http://127.0.0.1 7890
socks5 socks5://127.0.0.1 7891

则打开终端,输入如下命令并回车即可(注意,代理设置完成后只在当前窗口有效,打开新的窗口需要重新设置):

export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891

另外,项目暂未提供windows支持,只在 Linux / Mac 下做了兼容测试,使用 Windows 的大佬们可以考虑使用 DockerLuwu提供了构建好的Docker镜像(CPU版本和GPU版本均有),详情请参考 Luwu的项目说明文档。

Luwu支持使用pip安装,非常简单,打开终端,输入如下指令即可:

pip install luwu -v

安装成功:

一行代码训练一个图像分类器(Luwu教程系列)_第4张图片

注意,Luwu会通过脚本安装相关依赖,这可能会花费一些时间(1分钟或更久),使用-v是为了更好地提示安装进度,避免陷入等待的焦虑=。=

一行代码训练一个图像分类器(Luwu教程系列)_第5张图片

二、使用Luwu训练一个图像分类器

Luwu 支持 Web UI 服务命令行工具 两种使用方式,但目前Web UI 服务的开发已经被搁置了,原因是——我发现命令行工具貌似更好用且更实用。

PS: Web UI 服务现在只支持图像分类功能,命令行工具支持全部功能。

这里我就使用 Luwu命令行工具 进行演示了。

当我们安装好Luwu后,可以在终端调用Luwu命令行工具。打开终端,输入luwu -v,即可查看当前安装的Luwu的版本号:

一行代码训练一个图像分类器(Luwu教程系列)_第6张图片

输入luwu -h,即可查看Luwu命令行工具的基本使用方法。

输出如下:

usage: luwu [-h] [--version] [--luwu_version LUWU_VERSION]
            {web-server,detection,classification,text_classification,text_sequence_labeling}
            ...

Luwu命令行工具。 你完全可以不写任何代码,就能够完成深度学习任务的开发。 LuWu command tool. You can complete the
development of deep learning tasks without writing any code.

optional arguments:
  -h, --help            show this help message and exit
  --version, -v         查看当前luwu版本号
  --luwu_version LUWU_VERSION
                        kaggle上使用的Luwu版本,不指定则默认使用最新的正式版本

cmd:
  命令参数,用以指定 Luwu 将要执行的操作

  {web-server,detection,classification,text_classification,text_sequence_labeling}
    web-server          以web服务的形式启动Luwu,从而通过图形界面完成深度学习任务的开发。
    detection           通过命令行进行目标检测任务训练。
    classification      通过命令行进行图像分类任务训练。
    text_classification
                        通过命令行进行文本分类任务训练。
    text_sequence_labeling
                        通过命令行进行文本序列标注任务训练。

我们现在要做的是图像分类任务,即上面的classification任务,我们输入luwu classification -h可以查看该任务的使用方法。输出如下:

usage: luwu classification [-h] [--origin_dataset_path ORIGIN_DATASET_PATH]
                           [--validation_dataset_path VALIDATION_DATASET_PATH]
                           [--test_dataset_path TEST_DATASET_PATH]
                           [--tfrecord_dataset_path TFRECORD_DATASET_PATH]
                           [--model_save_path MODEL_SAVE_PATH]
                           [--validation_split VALIDATION_SPLIT]
                           [--test_split TEST_SPLIT]
                           [--do_fine_tune DO_FINE_TUNE]
                           [--freeze_epochs_ratio FREEZE_EPOCHS_RATIO]
                           [--batch_size BATCH_SIZE] [--epochs EPOCHS]
                           [--learning_rate LEARNING_RATE]
                           [--optimizer OPTIMIZER] [--project_id PROJECT_ID]
                           [--image_augmentation_random_flip_horizontal IMAGE_AUGMENTATION_RANDOM_FLIP_HORIZONTAL]
                           [--image_augmentation_random_flip_vertival IMAGE_AUGMENTATION_RANDOM_FLIP_VERTIVAL]
                           [--image_augmentation_random_crop IMAGE_AUGMENTATION_RANDOM_CROP]
                           [--image_augmentation_random_brightness IMAGE_AUGMENTATION_RANDOM_BRIGHTNESS]
                           [--image_augmentation_random_hue IMAGE_AUGMENTATION_RANDOM_HUE]
                           [--run_with_kaggle RUN_WITH_KAGGLE]
                           [--kaggle_accelerator KAGGLE_ACCELERATOR]
                           network_name

positional arguments:
  network_name          分类器名称,支持的分类器有:[LuwuDenseNet121ImageClassifier, LuwuDen
                        seNet169ImageClassifier,LuwuDenseNet201ImageClassifier
                        , LuwuVGG16ImageClassifier,LuwuVGG19ImageClassifier,Lu
                        wuMobileNetImageClassifier, LuwuMobileNetV2ImageClassi
                        fier,LuwuInceptionResNetV2ImageClassifier, LuwuIncepti
                        onV3ImageClassifier,LuwuNASNetMobileImageClassifier, L
                        uwuNASNetLargeImageClassifier,LuwuResNet50ImageClassif
                        ier, LuwuResNet50V2ImageClassifier,LuwuResNet101ImageC
                        lassifier, LuwuResNet101V2ImageClassifier,LuwuResNet15
                        2ImageClassifier, LuwuResNet152V2ImageClassifier,LuwuM
                        obileNetV3SmallImageClassifier, LuwuMobileNetV3LargeIm
                        ageClassifier,LuwuXceptionImageClassifier, LuwuEfficie
                        ntNetB0ImageClassifier,LuwuEfficientNetB1ImageClassifi
                        er, LuwuEfficientNetB2ImageClassifier,LuwuEfficientNet
                        B3ImageClassifier, LuwuEfficientNetB4ImageClassifier,L
                        uwuEfficientNetB5ImageClassifier, LuwuEfficientNetB6Im
                        ageClassifier,LuwuEfficientNetB7ImageClassifier]

optional arguments:
  -h, --help            show this help message and exit
  --origin_dataset_path ORIGIN_DATASET_PATH
                        处理前的数据集路径
  --validation_dataset_path VALIDATION_DATASET_PATH
                        验证数据集路径。如不指定,则从origin_dataset_path中进行切分。
  --test_dataset_path TEST_DATASET_PATH
                        测试数据集路径。如不指定,则从origin_dataset_path中进行切分。
  --tfrecord_dataset_path TFRECORD_DATASET_PATH
                        处理后的tfrecord数据集路径
  --model_save_path MODEL_SAVE_PATH
                        模型保存路径
  --validation_split VALIDATION_SPLIT
                        验证集切割比例。默认 0.1
  --test_split TEST_SPLIT
                        测试集切割比例。默认 0.1
  --do_fine_tune DO_FINE_TUNE
                        是进行fine tune,还是重新训练。默认 False
  --freeze_epochs_ratio FREEZE_EPOCHS_RATIO
                        当进行fine_tune时,会先冻结预训练模型进行训练一定epochs,再解冻全部参数训练一定epochs,
                        此参数表示冻结训练epochs占全部epochs的比例(此参数仅当 do_fine_tune = True
                        时有效)。默认 0.1(当总epochs>1时,只要设置了比例,至少会训练一个epoch)
  --batch_size BATCH_SIZE
                        mini batch 大小。默认 32.
  --epochs EPOCHS       训练epoch数。默认 30.
  --learning_rate LEARNING_RATE, -lr LEARNING_RATE
                        学习率。默认 0.001.
  --optimizer OPTIMIZER
                        训练时的优化器类型,可选参数为 [Adam, Adamax, Adagrad, Nadam,
                        Adadelta, SGD, RMSprop]。默使用 Adam.
  --project_id PROJECT_ID
                        项目编号. Defaults to 0.
  --image_augmentation_random_flip_horizontal IMAGE_AUGMENTATION_RANDOM_FLIP_HORIZONTAL
                        数据增强选项,是否做随机左右镜像。默认False.
  --image_augmentation_random_flip_vertival IMAGE_AUGMENTATION_RANDOM_FLIP_VERTIVAL
                        数据增强选项,是否做随机上下镜像。默认False.
  --image_augmentation_random_crop IMAGE_AUGMENTATION_RANDOM_CROP
                        数据增强选项,是否做随机剪裁,剪裁尺寸为原来比例的0.9。默认False.
  --image_augmentation_random_brightness IMAGE_AUGMENTATION_RANDOM_BRIGHTNESS
                        数据增强选项,是否做随机饱和度调节。默认False.
  --image_augmentation_random_hue IMAGE_AUGMENTATION_RANDOM_HUE
                        数据增强选项,是否做随机色调调节。默认False.
  --run_with_kaggle RUN_WITH_KAGGLE
                        是否使用kaggle环境运行。必须先安装并配置kaggle
                        api,才可以使用此选项。默认为False,即本地运行
  --kaggle_accelerator KAGGLE_ACCELERATOR
                        是否使用kaggle GPU进行加速(注意,仅当 run_with_kaggle 为 True
                        时此选项才有效)。默认不使用(即使用CPU)

这么多参数???有没有搞错???

一行代码训练一个图像分类器(Luwu教程系列)_第7张图片

不用担心,这里的大多数参数你并不需要用到,这里只是提供一种可能性。一般情况下,你只需要配置几个参数就可以了。

下面正式开始了——我们现在使用Luwu训练一个猫狗图片分类器。

首先,第一步,我们需要获取猫狗的图片数据集。

1.下载数据集

数据集可以从这里下载:https://www.floydhub.com/fastai/datasets/cats-vs-dogs

下载后解压即可。

因为只是做演示,所以我们就不使用完整数据集了,仅使用数据集中train部分。

2.创建项目文件夹

我们需要创建一个文件夹作为工作目录。

打开终端,输入mkdir cats-vs-dogs,创建工作目录。

输入cd cats-vs-dogs && mkdir data,创建一个data目录,用于存放原始数据集。

在这里插入图片描述

3.复制/移动数据集到项目文件夹下

接下来,打开cats-vs-dogs/data文件夹,将下载的数据集中的train文件夹下的子文件夹复制到cats-vs-dogs/data文件夹下。

一行代码训练一个图像分类器(Luwu教程系列)_第8张图片

4.通过luwu的命令行工具训练图像分类器

打开终端,将当前目录切换到cats-vs-dogs下,然后输入命令:

luwu classification --origin_dataset_path "./data" --tfrecord_dataset_path "./dataset" --model_save_path "." --epochs 4 --validation_split 0.05 --do_fine_tune True  LuwuDenseNet121ImageClassifier

这里解释一下命令中的参数:

  • luwu : luwu命令行工具入口
  • classification : 训练一个图像分类任务
  • –origin_dataset_path : 原始数据集的路径。数据集的组织方式有要求,需要以类别作为文件夹名称、图片放在对应文件夹下。举个例子,这里的origin_dataset_path./data./data下有两个文件夹catsdogs分别代表两个类别,所有猫的图片都放在cats文件夹下,所有狗的图片都放在dogs文件夹下。
  • –tfrecord_dataset_path : 模型训练之前,数据集会被先转换成TFRecord格式的文件,这个目录表示生成的TFRecord文件存放的位置。举个例子,这里的tfrecord_dataset_path./dataset,生成的文件将放在此目录下(如果该目录不存在则会自动创建)。
  • –model_save_path : 表示训练好的模型、和生成的调用代码等文件存放的目录。这里的model_save_path.,表示存放在当前目录下。
  • –epochs : 表示在数据集上进行多少次完整迭代,这里epochs为4,表示遍历完整数据集4次。
  • –validation_split : 训练过程中,数据集将被划分成训练集和验证集,此参数表示划分验证集的比例。这里的validation_split为0.05,表示有约5%的数据用于模型验证。
  • –do_fine_tune : 表示在训练过程中是否先冻结预训练模型进行 fine tune.当此参数为True时,默认先冻结预训练模型的权重训练 0.1*epochs 个epochs(向上取整)(具体比例可以通过 freeze_epochs_ratio 参数调整),再解冻全部参数训练完剩下的 epochs。否则,解冻全部参数训练所有epochs。这里的do_fine_tuneTrueepochs为4,freeze_epochs_ratio为默认值0.1,表示先冻结训练1个epochs,再解冻训练3个epochs。
  • LuwuDenseNet121ImageClassifier : 分类器模型名称。这是luwu支持的模型之一,更多模型可以通过在命令行中执行luwu classification -h查看。(这么多模型如何选择?后面再补说明吧)

注意,路径相关的参数其实传绝对路径会更合适,能够减少人为引入的路径错误问题。不过为了方便演示,我这里使用了相对路径。

更多的可配置参数也可以通过在命令行中执行luwu classification -h查看。

言归正传,输入上面的命令后,luwu将开始训练一个图像分类器,大致输出如下:

Namespace(batch_size=8, cmd='classification', do_fine_tune=True, epochs=4, freeze_epochs_ratio=0.1, image_augmentation_random_brightness=False, image_augmentation_random_crop=False, image_augmentation_random_flip_horizontal=False, image_augmentation_random_flip_vertival=False, image_augmentation_random_hue=False, kaggle_accelerator=False, learning_rate=0.001, luwu_version='', model_save_path='.', network_name='LuwuDenseNet121ImageClassifier', optimizer='Adam', origin_dataset_path='./data', project_id=0, run_with_kaggle=False, test_dataset_path='', test_split=0.1, tfrecord_dataset_path='./dataset', validation_dataset_path='', validation_split=0.05)
2021-06-15 00:42:55.613 | INFO     | luwu.core.models.classifier:run:319 - 正在预处理数据集...
100%|███████████████████████████████████████████████████████████████████████████████████████████████| 19672/19672 [00:06<00:00, 3216.37it/s]
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 1150/1150 [00:00<00:00, 2846.68it/s]
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 2300/2300 [00:00<00:00, 2991.18it/s]
2021-06-15 00:43:06.926540: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2021-06-15 00:43:06.929492: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-06-15 00:43:07.167322: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
2021-06-15 00:43:20.214 | INFO     | luwu.core.models.classifier:run:322 - 正在构建模型...
2021-06-15 00:43:23.919 | INFO     | luwu.core.models.classifier:run:325 - 开始训练...
2021-06-15 00:43:23.919 | INFO     | luwu.core.models.classifier.preset.pre_trained:train:50 - 分两步训练,冻结训练1个epochs,解冻训练3个epochs...
2021-06-15 00:43:23.919 | INFO     | luwu.core.models.classifier.preset.pre_trained:train:54 - 冻结 pre-trained 模型,开始预训练 ...
2459/2459 [==============================] - 1464s 593ms/step - loss: 0.5017 - accuracy: 0.9508 - val_loss: 0.2045 - val_accuracy: 0.9770
2021-06-15 01:07:48.171 | INFO     | luwu.core.models.classifier.preset.pre_trained:train:67 - 解冻 pre-trained 模型,继续训练 ...
Epoch 2/4
2459/2459 [==============================] - 1460s 594ms/step - loss: 0.1425 - accuracy: 0.9806 - val_loss: 0.1068 - val_accuracy: 0.9765
Epoch 3/4
2459/2459 [==============================] - 1439s 585ms/step - loss: 0.0842 - accuracy: 0.9816 - val_loss: 0.0752 - val_accuracy: 0.9791
Epoch 4/4
2459/2459 [==============================] - 1455s 592ms/step - loss: 0.0630 - accuracy: 0.9819 - val_loss: 0.0628 - val_accuracy: 0.9796
2021-06-15 02:20:24.311 | INFO     | luwu.core.models.classifier.preset.pre_trained:train:80 - 在测试集上进行验证...
288/288 [==============================] - 153s 533ms/step - loss: 0.0628 - accuracy: 0.9796
2021-06-15 02:22:57.761 | INFO     | luwu.core.models.classifier.preset.pre_trained:train:84 - [0.06279316544532776, 0.9795652031898499]
2021-06-15 02:22:57.761 | INFO     | luwu.core.models.classifier:run:328 - 导出代码...
2021-06-15 02:22:57.767 | INFO     | luwu.core.models.classifier:run:330 - Done.

演示的这台机器没有GPU环境,所以训练会比较慢,但不影响演示。

这个分类问题也比较简单,可以发现训练第一个epochs就已经有不错的结果了,第1个epoch训练完成后,验证集acc为0.977,训练完4个epoch,最终在测试集上的acc为0.9796。

训练完成后,打开cats-vs-dogs文件夹:

一行代码训练一个图像分类器(Luwu教程系列)_第9张图片

luwu-classification-project就是我们保存模型的目录,打开它,里面有训练好的模型和供参考的调用脚本:

一行代码训练一个图像分类器(Luwu教程系列)_第10张图片
一行代码训练一个图像分类器(Luwu教程系列)_第11张图片

改一下脚本里面的图片路径,就可以调用模型对指定的图片进行分类啦~来用下面这张图片试一下:

一行代码训练一个图像分类器(Luwu教程系列)_第12张图片

(base)  aaron@AaronJnydeMacBook-Pro > ~/cats-vs-dogs/luwu-classification-project > python luwu-code.py
2021-06-15 05:27:55.020102: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2021-06-15 05:27:55.020308: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-06-15 05:27:57.890260: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
当前图片类别为:dogs

成功识别出,结果为狗。

三、结语

辣鸡作者,辣鸡项目,bug一堆,多多包涵~

使用中碰到什么问题,或者有什么好的建议,也可以在GitHub上发起issue。

如果喜欢这个项目,请给个star ~

如果喜欢这篇文章的话,都看到这里了,点个关注、点个在看、点个赞呗~

谢谢大佬~


关于我

某以Python作为主要语言的技术爱好者,ACM-ICPC破铜烂铁选手。

某喜欢分享、又菜的一批的、喜欢搞爬虫和算法的弱鸡。

某不知名、正在努力成长中的技术博主。

CSDN: https://blog.csdn.net/aaronjny

GitHub: https://github.com/AaronJny

微信公众号: 技术小白成长日记

加油,共勉!

你可能感兴趣的:(机器学习,深度学习,tensorflow,神经网络,图像分类,一键脚本)