Lipreading using Temporal Convolutional Networks 项目复现

一、数据集和模型下载地址
全部模型和数据集可在我的NAS 中自行索取,地址: 唇语模型

二、文献翻译

介绍
本项目的内容为改进的唇读训练策略,实现唇读的高精度高效模型,使用时间卷积网络实现唇读。在这个项目中,我们提供了 实现端到端的视觉语音识别(唇读)的代码,预训练的模型,网络配置。我们基于LRW 数据集训练了我们的模型。这个卷积网络是基于3D 卷积,ResNet-18 plus MS-TCN 实现的

通过使用本项目,你可以在LRW 数据集上达到 89.6 的准确率,同时本项目还提供了一个用于提取特征的脚本

预处理

如我们论文所叙述的,LRW 数据集中每个视频都是按照下面的步骤进行处理的
(1) 进行面部检测,识别人脸的位置
(2)从每一帧中抠出人脸,并且旋转使得人脸的方向正常
(3)从每帧中的人脸图像中裁剪出 96 X 96 像素的 嘴部ROIS , 使得嘴部区域始终大致位于裁剪的图像的中心
(4)把裁剪后的图像转换成灰度图片
你可以运行 preprocessing 文件夹中的提供的 预处理脚本来提取嘴部的ROIS


如何准备环境

1.把当前项目复制到一个文件夹下面,我们推荐您把这个文件夹的位置设置成环境变量 TCN_LIPREADING_ROOT

git clone --recursive https://github.com/mpc001/Lipreading_using_Temporal_Convolutional_Networks.git

2.安装需要的依赖

pip install -r requirements.txt

如何准备数据集

1.首先你需要从Model Zoo 这个网站下载预训练的模型,并且把模型放到$TCN_LIPREADING_ROOT/models/ 这个文件夹下面
2.对于只需要使用声音的实验,请通过使用 preprocessing 文件夹下的 extract_audio_from_video.py 这个脚本预先处理好声音波形,并且把他们保存到 $TCN_LIPREADING_ROOT/datasets/audio_data/.
3.对于表1 中提到的VSR 基准, 请从Google 网盘或者百度云盘下载我们预先计算的标注数据,并且把他们解压到 $TCN_LIPREADING_ROOT/landmarks/ 这个文件夹,请使用 preprocessing 文件夹下的 crop_mouth_from_video.py 这个脚本来预处理嘴部的ROIs 图片,并且把他们存放到 $TCN_LIPREADING_ROOT/datasets/visual_data/.
4.对于表2 中提到的VSR 基准,请从Google 网盘或者百度云盘下载我们预先计算的标注数据,并且把他们解压到 $TCN_LIPREADING_ROOT/landmarks/ 这个文件夹,请使用 legacy_preprocessing 文件夹下的 crop_mouth_from_video.py 这个脚本来预处理嘴部的ROIs 图片,并且把他们存放到 $TCN_LIPREADING_ROOT/datasets/visual_data/.


如何训练模型
1.训练仅基于视觉的模型


CUDA_VISIBLE_DEVICES=0 python main.py --modality video \
                                      --config-path  \
                                      --annonation-direc  \
                                      --data-dir 

2.训练仅基于声音的模型


CUDA_VISIBLE_DEVICES=0 python main.py --modality video \
                                      --config-path  \
                                      --annonation-direc  \
                                      --data-dir 

我们把初始的包含时间戳(.txt)的LRW数据集的文件夹叫做 .
3.从上一个检查点恢复
你可以将检查点的路径(.pth 或 .pth.tar) 通过参数 -- model-path 传入,并且将 --init-epoch 的值置为1 来继续训练


如何测试模型
如果你需要使用具有单词边界指示符的模型,你必须指定
1.评估仅视觉模型(唇读)


CUDA_VISIBLE_DEVICES=0 python main.py --modality video \
                                      --config-path  \
                                      --model-path  \
                                      --data-dir  \
                                      --test

2.评估仅声音模型


CUDA_VISIBLE_DEVICES=0 python main.py --modality audio \
                                      --config-path  \
                                      --model-path  \
                                      --data-dir 
                                      --test


如何提取特征值
我们假设你已经正确裁剪了嘴部的切片,并且把他们存到了.嘴部特征将被保存为.npz 的格式
从 ResNet-18 网络中提取嘴部特征:


CUDA_VISIBLE_DEVICES=0 python main.py --modality video \
                                      --extract-feats \
                                      --config-path  \
                                      --model-path  \
                                      --mouth-patch-path  \
                                      --mouth-embedding-out-path 

三、项目复现
1. 下载模型,标注的数据,数据集
这里我们需要复现的是通过视觉模型进行识别的特征提取。我们选用精度最高的模型 lrw_resnet18_dctcn_video_boundary.pth
首先需要下载的是 lrw_resnet18_dctcn_video_boundary.pth,将它下载到 项目的 models 文件夹下
根据项目说明,该模型使用的是LRW-1标注的数据,因此把 LRW_landmarks.zip 下载解压到 landmarks 文件夹下面
LRW-1000 数据集下载,存到 datasets 文件夹下(新建文件夹 LRW_1000),注意一共5个压缩文件包,需要分别解压
2.准备数据集
按照项目说明,我们打开 preprocesing 文件夹下 crop_mouth_from_video.py , 查看这个文件的内容

执行下面的代码,开始对数据集进行预处理(注意更改参数路径)


python3 crop_mouth_from_video.py --video-driec=/data/Lipreading/datasets/LRW_1000/ --landmark-direc=/data/Lipreading/landmarks/LRW_landmarks/ --save-direc=/data/Lipreading/datasets/visual_data/

如下图所示,正在对数据集进行预处理

数据集预处理期间,将占用约2G 左右的显存

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注