C++实现Vgg19分类器(一)准备数据

本文介绍了一种名为AdaIN-style的实时风格迁移技术,通过使用预训练的VGG19模型,实现了任意风格图像向目标图像的高效转移。文章探讨了风格迁移网络的实现细节,并计划用C++实现VGG19分类器以降低入门难度。

前面二个风格迁移的程序,虽然速度够快,但只能实现作者训练好的风格,要换成自己的风格图就无能为力了。

看了一些博文,觉得《AdaIN-style》这个不错,能够实现任意风格转移,而且称实时。

https://github.com/xunhuang1995/AdaIN-style

提供了训练好的模块模型:

 https://s3.amazonaws.com/xunhuang-public/adain/decoder.t7
 https://s3.amazonaws.com/xunhuang-public/adain/decoder-content-similar.t7
 https://s3.amazonaws.com/xunhuang-public/adain/vgg_normalised.t7

准备用自己的代码实现一下。

先看一下该实现的效果图:

网络框图:

我们只要实现哪个虚线框中的风格转移网络就可以了。

该 'VGG编码器' 的一部分是使用了 'VGG19分类器' 中的部分,为了降低起步难度,这里先用 C++ 来实现这个VGG19的分类器

准备材料(下载)

VGG19模型:

http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_19_layers.caffemodel

分类标签:

synset_words.txt (可以搜索到)并用 'Google 翻译' 成中文

形象图:

 

 

 

### VGG19 分类器简介 VGG19种基于卷积神经网络 (CNN) 的深度学习模型,最初由牛津大学视觉几何组 (Visual Geometry Group, VGG) 提出并发表在论文《Very Deep Convolutional Networks for Large-Scale Visual Recognition》中[^1]。该模型以其简单而有效的架构设计著称,在多个计算机视觉任务中表现出优异性能。 VGG19 特别适合用于图像分类任务,其核心特点在于通过堆叠多层小型卷积核(通常为 \(3 \times 3\)),逐步提取输入图像的空间特征和语义信息。相比其他复杂结构的模型,VGG19 更易于理解和实现。 --- ### PyTorch 中 VGG19 模型的使用方法 以下是利用 PyTorch 实现 VGG19 并将其作为分类器的具体参数配置与代码示例: #### 安装依赖库 确保已安装 `torch` 和 `torchvision` 库: ```bash pip install torch torchvision ``` #### 构建 VGG19 模型实例 可以通过调用 `torchvision.models.vgg19(pretrained=True)` 来快速获取预训练好的 VGG19 模型。如果需要自定义修改,则可以继承 `nn.Module` 类来自定义模型结构。 ```python import torch from torchvision import models # 初始化预训练的 VGG19 模型 model = models.vgg19(pretrained=True) # 如果不希望微调整个网络,冻结所有参数 for param in model.parameters(): param.requires_grad = False # 修改最后层全连接层以适配新的分类任务 num_features = model.classifier[-1].in_features output_classes = 10 # 假设目标数据集有 10 类 model.classifier[-1] = torch.nn.Linear(num_features, output_classes) ``` 上述代码片段展示了如何加载预训练模型,并调整最后的全连接层以适应特定的任务需求[^2]。 #### 数据预处理 为了使输入数据能够被 VGG19 正确接收,需对其进行标准化处理。以下是个典型的图像预处理管道: ```python from torchvision import transforms transform = transforms.Compose([ transforms.Resize((224, 224)), # 调整图片大小至 224x224 transforms.ToTensor(), # 将 PIL 图像转换成张量 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 归化 ]) ``` 这些均值 (`mean`) 和标准差 (`std`) 参数来源于 ImageNet 数据集统计结果,适用于大多数迁移学习场景。 #### 预测函数定义 完成模型初始化后,可编写如下预测逻辑: ```python def predict(image_path, model, transform, device): image = Image.open(image_path).convert('RGB') input_tensor = transform(image).unsqueeze(0).to(device) # 添加批次维度并将数据移至 GPU/CPU with torch.no_grad(): # 关闭梯度计算以节省内存 outputs = model(input_tensor) probabilities = torch.softmax(outputs, dim=1)[0] topk_probabilities, indices = torch.topk(probabilities, k=5) # 获取前五高概率类别及其索引 return [(i.item(), p.item()) for i, p in zip(indices, topk_probabilities)] # 设置运行环境 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) model.eval() # 测试单张图片 result = predict("test_image.jpg", model, transform, device) print(result) ``` 此部分实现了从读取测试图片到返回预测结果的整体流程。 --- ### 注意事项 - **硬件资源**:由于 VGG19 层次较深且参数较多,建议在具备 CUDA 支持的 GPU 上执行推理操作。 - **超参数调节**:实际应用过程中可能还需要进步优化批量大小、学习率等超参数设置。 - **数据增强**:对于小规模数据集而言,适当引入随机裁剪、翻转等方式有助于提升泛化能力。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值