深度学习工程实践 5. libtorch+opencv使用复杂的训练分割模型
1. 概述
有的时候,我们希望在应用中直接使用已经训练好的模型。这在使用Python的环境下,比较方便,但是python要部署到应用端,还是非常麻烦的,没有libtorch - c++来的直接。 本篇介绍了libtorch如何快速使用训练好的model,并且将结果用opencv显示出来。
本篇用到的model
这里,笔者为了进行人像简笔画制作,需要提取人像中的头发。 笔者直接参考了https://github.com/kampta/face-seg这个网络,他是基于mobildnet+u-net的一个分割网络,可以对头发和整个脸部进行较为准确的分割。
2. 目标
- libtorch+opencv使用已经训练好的人脸头发分割模型
3. 工程实践
3.1 找到原始的网络定义,使用torch.jit.trace对模型进行转换
笔者开始没有明白,要进行模型转换,就一定要先找到原始的网络定义类,否则不可能实现模型转换,生成的训练模型也不可能能够部署到libtorch上去。
我们首先,下载这个face-seg的网络定义文件下来:
import torch
import torchvision.models as models
import torch.nn as nn
from nets.MobileNetV2_unet import MobileNetV2_unet
#必须跟训练时定义的网络一样
model = MobileNetV2_unet(None).to(torch.device("cpu"))
model.load_state_dict(torch.load('./model-hair.pt', map_location='cpu'))
model.eval()
print(mo