1. 课程学习

本节课主要对于大白AI课程:https://mp.weixin.qq.com/s/STbdSoI7xLeHrNyLlw9GOg
《Pytorch 模型推理及多任务通用范式》课程中的第二节课进行学习。
本课程的重点有:

  • 将分类任务进行拆解为三部分进行介绍:数据预处理、模型预测、数据后处理。
    • 预测时的数据预处理,要向训练时的预处理方式对齐
    • 模型预测,主要是载入模型以及加载 训练好的模型权重
    • 预测时的数据后处理,要向模型的head结构和loss设计对齐。
  • 以mobilenet-v2为例,介绍了该网络中每层架构

    2. 作业题目

    2.1必做题:

    (1) 把模型改为 resnet18,加载相应的模型权重(Lesson2 的物料包中有),跑一下 0.jpg 和 1.jpg,看一下输出结果。官方 torchvision 训练 mobilenet 和训练 resnet 的方式是一样 的,所以数据预处理和数据后处理部分完全相同。

    结果:
    0.jpg1.jpg
    mobilenet的预测结果为:(‘umbrella’, 0.9998866319656372);(‘peacock’, 0.9999724626541138)
    resnet18的预测结果为:(‘umbrella’, 0.9995712637901306);(‘peacock’, 0.9999839067459106)

(2) 自己找 2 张其他图,用 resnet18 做下推理。

思考题:
1634568559(1).png1634568625(1).jpg
mobilenet的预测结果为:(‘tusker’, 0.5399301648139954);(‘folding chair’, 0.9994507431983948)
resnet18的预测结果为:(‘tusker’, 0.41636401414871216) ;(‘folding chair’, 0.9999761581420898)
从当前几张照片的越结果来看,mobilenet的效果会稍微好一些。

2.2 思考题

(1) 以 ResNet18 为例,用 time 模块和 for 循环,对”./images/0.jpg”连续推理 100 次,统计时间开销。

回答:【没有GPU,所以只做了基于CPU的推理】
1次为:0.1650102138519287
10次为:1.6096162796020508
100次为:14.75416088104248
1000次为:136.48899126052856
同一个模型,对同一张图像的推理速度存在差异。推理实现代码如下:

  1. image = cv2.imread("./images/0.jpg")
  2. t_all = 0
  3. for i in range(10):
  4. t_start = time.time()
  5. result = model_classify.predict(image) # 推理
  6. t_end = time.time()
  7. t_all += t_end - t_start # 将每次的推理时间累加到变量 t_all 中
  8. print(t_all)

(2) 在数据预处理和数据后处理的代码实现中,到处在用 numpy, opencv, torch 对数组做 相应变换,大家至少要把课程中出现的函数们给理解。

numpy

  • np.array(list) # 函数可以将list转为array数组
  • inputs[np.newaxis,:,:,:] # 用法可以在inputs变量的指定位置(这里是最外层)增加一个维度;inputs[:,:,:,np.newaxis] # 是在inputs变量中的最里层,即每个元素上加一个维度。(这里描述可能有些小问题)

opencv

  • cv2.cvtColor(image,cv2.COLOR_BGR2RGB) # 颜色转换
  • cv2.resize(image, dsize) # 图像resize
  • image = cv2.imread(“./images/0.jpg”) # 图像读取,后面还可以通过参数用于指读取图像的模式
  • cv2.imwrite(“./images/0.jpg”, img) # 图像保存

torch

  • inputs=torch.ones([1,3,224,224]).type(torch.float32) # 构建一个分量全为浮点型,值为1的,维度为[1,3,224,224]的tensor
  • pretrained_state_dict=torch.load(‘./weights/mobilenet_v2-b0353104.pth’) # 指定路径下模型权重的载入
  • model.to(torch.device(‘cpu’)) # 指定device为CPU,且将模型放在CPU上。
  • torch.onnx.export(model, inputs, ‘./weights/mobilenet_v2.onnx’, verbose=False) # 生成onnx文件。其参数分别为:需要转化的model,输入的数据?,onnx模型保存位置与名称,不需要输出日志信息。
    inputs=torch.from_numpy(inputs) #NumpyArray ——> Tensor
    • 这里的inputs有什么作用?
  • outputs=torch.softmax(outputs,dim=1)
  • score, label_id = torch.max(outputs, dim=1)

    3.学习心得

  • 虽然代码跑通了,也能触类旁通的换成其他网络、学习一些函数的用法等。但是还是不太清楚如何更好的了解学习不同网络本身的结构特点。除了看论文,老师还有什么其他好的建议吗?

  • 用神经网络做推理,是要解决“从非结构化/半结构化数据中提取有效的结构化信息”的问题

4.其他(潘大强老师第二节课的作业批改和点评)