图像分类与自动编码器技术详解
立即解锁
发布时间: 2025-09-01 01:57:46 阅读量: 3 订阅数: 12 AIGC 

### 图像分类与自动编码器技术详解
#### 1. 视频分类实践
在视频分类任务中,我们可以利用现有的图像分类架构来处理视频。通过将视频帧视为批量维度,ResNet 的功能得以保持不变。具体来说,使用一个新的头部将帧平均为单个值,然后使用交叉熵损失进行分类。
##### 1.1 自定义数据集训练识别器
为了在自定义的二进制分类视频数据集上训练识别器,我们需要完成以下步骤:
1. **下载数据集**:从 https://research.google/pubs/the-kinetics-human-action-video-dataset/ 下载一个小的子集。
```python
!rm kinetics400_tiny.zip*
!rm -rf kinetics400_tiny
!wget https://download.openmmlab.com/mmaction/kinetics400_tiny.zip
!unzip kinetics400_tiny.zip > /dev/null
```
上述代码将下载 40 个视频,其中 30 个用于训练集,10 个用于验证集。任务是二进制视频分类,有两个类别:“Climbing Rope” (0) 和 “Blowing Glass” (1)。
2. **检查注释格式**:使用以下命令查看注释文件。
```python
!cat kinetics400_tiny/kinetics_tiny_train_video.txt
```
每一行表示文件路径和对应的标签。
3. **修改训练配置文件**:
- **初始化配置文件**:
```python
from mmengine.config import Config
cfg = Config.fromfile('./configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py')
```
- **修改配置值**:
```python
from mmengine.runner import set_random_seed
# Modify dataset type and path
cfg.data_root = 'kinetics400_tiny/train/'
cfg.data_root_val = 'kinetics400_tiny/val/'
cfg.ann_file_train = 'kinetics400_tiny/kinetics_tiny_train_video.txt'
cfg.ann_file_val = 'kinetics400_tiny/kinetics_tiny_val_video.txt'
cfg.test_dataloader.dataset.ann_file = 'kinetics400_tiny/kinetics_tiny_val_video.txt'
cfg.test_dataloader.dataset.data_prefix.video = 'kinetics400_tiny/val/'
cfg.train_dataloader.dataset.ann_file = 'kinetics400_tiny/kinetics_tiny_train_video.txt'
cfg.train_dataloader.dataset.data_prefix.video = 'kinetics400_tiny/train/'
cfg.val_dataloader.dataset.ann_file = 'kinetics400_tiny/kinetics_tiny_val_video.txt'
cfg.val_dataloader.dataset.data_prefix.video = 'kinetics400_tiny/val/'
# Modify num classes of the model in cls_head
cfg.model.cls_head.num_classes = 2
# We can use the pre-trained TSN model
cfg.load_from = './checkpoints/tsn_r50_1x1x3_100e_kinetics400_rgb_20200614-e508be42.pth'
# Set up working dir to save files and logs.
cfg.work_dir = './output_dir'
cfg.train_dataloader.batch_size = cfg.train_dataloader.batch_size // 16
cfg.val_dataloader.batch_size = cfg.val_dataloader.batch_size // 16
cfg.optim_wrapper.optimizer.lr = cfg.optim_wrapper.optimizer.lr / 8 / 16
cfg.train_cfg.max_epochs = 10
cfg.train_dataloader.num_workers = 2
cfg.val_dataloader.num_workers = 2
cfg.test_dataloader.num_workers = 2
```
4. **创建运行器类并训练识别器**:
```python
import os.path as osp
import mmengine
from mmengine.runner import Runner
# Create work_dir
mmengine.mkdir_or_exist(osp.abspath(cfg.work_dir))
# build the runner from config
runner = Runner.from_cfg(cfg)
# start training
runner.train()
```
上述代码的训练准确率达到 100%。
5. **测试识别器**:
```python
runner.test()
```
测试结果为 Top1 准确率 90%,Top5 准确率 100%。
#### 2. 自动编码器
在之前的章节中,我们学习了基于输入图像及其对应标签训练模型进行图像分类。现在,考虑一个场景,我们需要在没有对应标签的情况下,根据图像的相似性对其进行聚类,自动编码器在这种情况下就非常有用。
##### 2.1 自动编码器的工作原理
自动编码器将图像作为输入,将其存储在较低维度中,并尝试将相同的图像作为输出进行再现。与典型的神经网络架构不同的是,自动编码器将图像中的信息编码到较低维度,然后再现图像。图像经过编码器处理后,相似的图像会有相似的编码。解码器则负责从编码向量中重建原始图像。
一个典型的自动编码器架构包含一个中间的瓶颈层,输入与瓶颈层之间的操作代表编码器,瓶颈层与输出之间的操作代表解码器。通过瓶颈层,我们可以将图像表示为更低的维度,并且可以利用瓶颈层来解决识别相似图像和生成新图像的问题。具体来说:
- 具有相似瓶颈层值(编码表示)的图像可能彼此相似。
- 通过改变瓶颈层的节点值,我们可以改变输出图像。
##### 2.2 实现简单自动编码器
为了理解如何构建自动编码器,我们在 MNIST 数据集上实现一个简单的自动编码器,步骤如下:
1. **导入相关包并定义设备**:
```python
!pip install -q torch_snippets
from torch_snippets import *
from torchvision.datasets import MNIST
from torchvision import transforms
device = 'cuda' if torch.cuda.is_available() else 'cpu'
```
2. **指定图像转换**:
```python
img_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize([0.5], [0.5]),
transforms.Lambda(lambda x: x.to(device))
])
```
3. **创建训练和验证数据集**:
```python
trn_ds = MNIST('/content/', transform=img_transform, train=True, download=True)
val_ds = MNIST('/content/', transform=img_transform, train=False, download=True)
```
4. **定义数据加载器**:
```python
batch_size = 256
trn_dl = DataLoader(trn_ds, batch_size=batch_size, shuffle=True)
val_dl = DataLoader(val_ds, batch_size=batch_size, shuffle=False)
```
5. **定义网络架构**:
```python
class AutoEncoder(nn.Module):
def __init__(self, latent_dim):
super().__init__()
self.latend_dim = latent_dim
self.encoder = nn.Sequential(
nn.Linear(28 * 28, 128),
nn.ReLU(True),
nn.Linear(128, 64),
nn.ReLU(True),
nn.Linear(64, latent_dim)
)
self.decoder = nn.Sequential(
nn.Linear(latent_dim, 64),
nn.ReLU(True),
nn.Linear(64, 128),
nn.ReLU(True),
nn.Linear(128, 28 * 28),
nn.Tanh()
)
def forward(self, x):
x = x.view(len(x), -1)
x = self.encoder(x)
x = self.decoder(x)
x = x.view(l
```
0
0
复制全文
相关推荐










