1 课程学习


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)

结果如下

pytorch开启多线程训练 pytorch多线程推理_for循环

其他类别的推理结果

Bird

pytorch开启多线程训练 pytorch多线程推理_for循环_02


Aeroplane

pytorch开启多线程训练 pytorch多线程推理_pytorch开启多线程训练_03

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倍左右

pytorch开启多线程训练 pytorch多线程推理_数据预处理_04

统计车辆的面积

代码

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