1 课程学习
本节课主要对于大白AI课程:
《Pytorch模型推理及多任务通用范式》课程中的第四节课进行学习。
2 作业题目
题目描述
必做题:
(1) 对 "./images/car.jpg" 做语义分割,提取出里面的车辆,模仿上课时,对“可视化推理结果”和“BGRA四通道图”进行保存。
(2) 自己找2张其他图,对图中某个类别进行分割,并保存“BGRA四通道图”。
思考题:
(1) 用time模块和for循环,对”./images/car.jpg”连续推理100次,统计时间开销。有CUDA的同学,改下代码:self.device=torch.device('cuda'),统计时间开销。
(2) 以0.5为阈值,计算”./images/car.jpg”图中车辆的面积(单位:像素)。
答题格式:
必做题:
题(1)提交“可视化推理结果”和“BGRA四通道图”两张图片。
题(2)提交下找的2张图片、各自指定的类别以及“BGRA四通道图”。
思考题:
题(1)CPU推理和CUDA推理,各自的时间开销。
题(2)面积(单位:像素)。
实现及结果
展示car.jpg的推理结果
这里需要修改以下几处代码
第18行,添加car id
def __init__(self):
#进入模型的图片大小:为数据预处理和后处理做准备
self.inputs_size=(520,520)
#CPU or CUDA:为数据预处理和模型加载做准备
self.device=torch.device('cpu')
#载入模型结构和模型权重
self.model=self.get_model()
#标签中的人体index,为数据后处理做准备
self.person_id=15
# 标签中的car index,为数据后处理做准备
self.car_id = 7
第68行,修改为car id
def postprocess(self, outputs, image_h, image_w):
#获取模型输出output
outputs=outputs['out']
#取softmax得到每个类别的置信度
outputs=torch.softmax(outputs,dim=1)
# #取出目标标签(比如:人体)的那一层置信度
# outputs=outputs[:,self.person_id:self.person_id+1,:,:]
#取出目标标签(比如:汽车)的那一层置信度
outputs=outputs[:,self.car_id:self.car_id+1,:,:]
#将结果图resize回原图大小
outputs=F.interpolate(outputs, size=(image_h, image_w), mode='bilinear',align_corners=True)
#数据类型转换:torch.autograd.Variable ——> torch.Tensor ——> numpy.ndarray
mask_person=outputs.data.cpu().numpy().squeeze()
return mask_person
第115行,增加对car推理的代码段
#第三张图
image=cv2.imread('./images/car.jpg')
result=model_segment.predict(image)
#可视化推理结果
cv2.imwrite('./my_demos/car_mask.jpg',(result*255).astype(np.uint8))
# 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('./my_demos/car_mask.png',image_mask)
结果如下
其他类别的推理结果
Bird
Aeroplane
100次推理的时间比较(CPU vs GPU)
代码
image=cv2.imread('./images/car.jpg')
start_time = time.time()
for _ in range(100):
result=model_segment.predict(image)
end_time = time.time()
print('100 times: ', end_time-start_time, 's')
CPU:57.8s(100次)
GPU:3.5s(100次)
GPU:29.7s(1000次)
可以看到,GPU的加速十分惊人,可以提高20倍左右
统计车辆的面积
代码
image=cv2.imread('./images/car.jpg')
result=model_segment.predict(image)
# #可视化推理结果
# cv2.imwrite('./my_demos/car_mask.jpg',(result*255).astype(np.uint8))
# BGRA四通道图
mask=result.copy()
mask[mask>=0.5]=255
mask[mask<0.5]=0
# 直接统计像素值为255的个数
print(len(mask[mask==255]))
# 根据统计直方图来获取
print(np.histogram(mask)[0][-1])
面积:102781 pixels