6. 实习

256 阅读6分钟

实习期间的工程经验

点子

  1. 在本地建立工程,用debug分析问题。
  2. 用工程中的"Compare With"去分析你的代码和别人代码的不同。
  3. 报Warnning有可能是精度低的原因。
  4. Linux中 vim train.py 可以直接改代码。改完了:wq可以保存退出。
  5. Linux中 watch -n 1 nvidia-smi 可以看到每秒gpu占用的情况。
  6. YOLO v5检测核阳细胞三分类、膜浆阳细胞三分类的流程:
    • 数据处理。我们得到的数据集为SVS格式的数据(大约是5万×5万的像素),医学经验的老师会用Qpath软件打开、划分Region框(即有目标的边界框,1000×1000的像素)并对每个Region框标注label;然后将Region框导出为PNG格式数据和对应的label导出为txt格式的数据(类别,x_center,y_center,h,w)。将其提交给算法工程师后,为了方便训练,都resize为1280×1280像素,然后对这些数据划分训练集和测试集进行训练和推理。

    • 模型部分。我主要负责检测模型的优化,由于我们的细胞是小目标,针对这种小目标检测,我在YOLO v5的模型基础上,将网络中间层的stride由2→1,结果输出feature map扩大了一倍,最终检测头的feature map扩大了一倍,随着感受野的变小,小细胞的识别率就会得到提升。

    • 误判的情况。对于推理/detect的时候会有误判的情况,将训练时(在训练过程的validate.run中)和推理时的置信度阈值(conf_thres)调高一点,我们调整为0.45。可以使误判大大消失。

    • 优化器。AdamW会涨点的,不过收敛速度比SGD慢一些。要注意优化器为Adam\AdamW时,要把学习率调整为0.001

    • 调试参数。分析hyp.yaml的每个参数的作用。调整了degree=0.3;flipud=0.5会有一些涨点。去掉mixup、copypaste会降点。后续应该会继续调试的。

    • imgsz。千万要注意训练和测试时的imgsz大小对结果也很影响的,要和图片实际大小匹配。

    • max_det。最大检测数量: 先去统计数据集的label目标个数最多为多少,然后根据目标数进行设置。我之前针对于细胞检测不管是YOLOv5还是YOLOv8精度mAP50一直在50%-60%,分析label之后发现,一张图像的细胞个数最多有4000-5000个,对于官方设置的max-det为300,这肯定是不够的。修改为5000之后,精度就上来了。我真的哭死o(╥﹏╥)o。

  7. YOLOv5检测膜浆阳细胞二分类:我们这里没有二分类的数据集。
    • 方法一:(1)将膜浆阳细胞三分类的训练集、测试集的标签都进行替换:将1→0,2→1。(2)进行膜浆阳细胞二分类的模型训练。(3)将训练好的模型进行测试。(4)将训练好的模型进行推理。

    • 方法二:直接用已经训练好的膜浆阳细胞三分类。(1) 将膜浆阳细胞三分类测试集的标签进行替换:将1→0,2→1。(2) 在测试的时候要注意: val.py代码中,预测向量与标签进行比较之前,将预测向量类别1→0,2→1,才能保证测试的准确度。(3) 将该三分类模型直接进行推理。

  8. 今天代码出了个纰漏,在测试集推理的时候,batchsize=1精度是正常的,当batchsize=32时精度很低。最后找到的原因是NMS的代码中:
def non_max_supression():
    for 1张image的预测向量 in 1个batch images的预测向量:
        ...
        if (time.time()-t)>time_limit:
            LOGGER.warning(f'WAENING NMS time limit {time_limit:.3f}s exceeded')
            break

在batchsize=32时,由于程序中有其他人也在跑,因此NMS很慢,导致超时,因此直接还没NMS结束一个batch中全部图片,就break了。 这种情况下,要么就batchsize设置小一点,要么就注释掉这一段就可以了。

  1. 发现了netron.app/ 可以将onnx可视化出来。

  2. 学习YOLO还是其他模型,要学会去看官网。

思路

  1. 遇到问题不要慌张,去一步步分析才能成长。
  2. 要去对比你和其他人的工程之间的差异。
  3. 你要自主去学习,建立自己解决问题的体系,不要等着别人把饭喂你嘴里。
  4. 从结果去反推过程中的问题。
  5. 向领导汇报工作的时候:先讲结果→略微提过程→面向未来的解决方案。
  6. 和你的上级领导确立工作内容,其他人都只能是建议;只有你的上级领导同意才可以,要多和他去确定,而不是将其他人的建议作为方案。
  7. 我同事说我对工程的整体思路不了解。这是个致命的问题。我个人觉得饭得一口一口吃,是我慢了点,慢慢来更扎实。
  8. 和同事交流了一下,他说,我应该更放开一些自己,别那么紧张,有不懂的,多去交流,大胆承认自己没有做到的这没什么。
  9. 我知道交流之前去看看自己有没有静下心去解决,我个人并没有把自己的领域弄熟,毕竟前一阵子太忙了,我决定放弃当前的比赛,专注在一件事情。慢即快。从事这个行业,快要不得,先一步一步来。
  10. 同事和同门不一样,因为每个人都有责任在,不能嬉笑做事情,做事情就要认真。
  11. 和别人讨论问题时,把当前背景,前因后果解释清楚。

问题

  1. YOLOv5 val.py代码整理(已整理)
  2. YOLOv5 train.py代码整理(已整理,还需研究细节)
  3. YOLOv5 loss.py代码整理(已整理,还需研究细节)
  4. 学习使用debug去观察参数的每个epoch变换(已完成)
  5. Python 继承(已整理)
  6. 写一个测试每张图片精度的脚本(已整理)
  7. 学习分布式训练。(已整理,需要实战一波)
  8. 学习YOLOv5的NMS。
  9. 学习YOLOv5上组长写的prediction。
  10. YOLOv5 模型的搭建,数据的注入,检测过程。
  11. YOLOv8学习模型上的改进、逻辑绘制蓝图。
  12. 学习linux编程,可以很熟练地增删改查文件。
  13. 学习计算机视觉transformer。
  14. 学习unet,deeplab。
  15. 对于数据的输入格式到数据的预测格式之间的变化,不是很懂。
  16. 学习部署
  17. 学习SAM