江大白共学计划–Pytorch模型推理及多任务通用范式(第4次课)
课程内容: 模型推理的通用范式(中):以语义分割任务为例,强化对推理范式的理解
1. 代码Lesson4.py
代码同上节课,将分类网络的权重文件换为了deeplabv3的预训练权重。
2. 课堂作业
必做题
(1) 对 “./images/car.jpg” 做语义分割,提取出里面的车辆,模仿上课时,对“可视化推
理结果”和“BGRA 四通道图”进行保存。
可视化推理结果
BGRA 四通道图
(2) 自己找 2 张其他图,对图中某个类别进行分割,并保存“BGRA 四通道图”。
从网上找到了两张图(狗和马),放到了推理模型中,生成了BGRA 四通道图
思考题
:
(1) 用 time 模块和 for 循环,对”./images/car.jpg”连续推理 100 次,统计时间开销。
有 CUDA 的同学,改下代码:self.device=torch.device(‘cuda’),统计时间开销。
if __name__=='__main__':
# 实例化整个推理类,主要开销在__init__中的载入模型部分
model_segment = ModelPipline()
# 读取第一张图
image = cv2.imread('Lesson4/images/car.jpg')
# 模型推理的结果
# 第一次推理的时间
t_first = 0
t_start = time.time()
result = model_segment.predict(image)
t_end = time.time()
t_first += t_end-t_start
print("第一次推理的时间:{}".format(t_first))
# 循环推理100次的时间
t_all = 0
for i in range(100):
t_start = time.time()
result = model_segment.predict(image)
t_end = time.time()
t_all += t_end-t_start
print("循环推理一百次的时间:{}".format(t_all))
# 可视化推理结果
cv2.imwrite('Lesson4/demos/car02_mask.jpg', (result*255).astype(np.uint8))
# 下面几行代码作用: 根据阈值(0.5), 将分割结果保存为BGRA四通道图片
mask = result.copy()
mask[mask>=0.5] = 255
mask[mask<0.5] = 0
image_mask = np.concatenate([image, mask[:,:,np.newaxis]], axis=2)
cv2.imwrite('Lesson4/demos/car02_mask.png', image_mask)
print("Counter类统计numpy数组中每个元素的个数:{}".format(Counter(mask.flatten())))
print("numpy中的sum函数统计:{}".format(np.sum(mask==255)))
cpu推理的结果:
第一次推理的时间:0.5348126888275146
循环推理一百次的时间:48.46514558792114
cuda推理的结果:
第一次推理的时间:0.28791284561157227
循环推理一百次的时间:3.8512210845947266
(2) 以 0.5 为阈值,计算”./images/car.jpg”图中车辆的面积(单位:像素)。
使用Counter类统计numpy数组中每个图中车辆的面积(单位:像素):
Counter({0.0: 348055, 255.0: 101945})
使用numpy中的sum函数统计图中车辆像素个数:
101945