实习期间的工程经验
点子
- 在本地建立工程,用debug分析问题。
- 用工程中的"Compare With"去分析你的代码和别人代码的不同。
- 报Warnning有可能是精度低的原因。
- Linux中
vim train.py可以直接改代码。改完了:wq可以保存退出。 - Linux中
watch -n 1 nvidia-smi可以看到每秒gpu占用的情况。 - 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。
-
- YOLOv5检测膜浆阳细胞二分类:我们这里没有二分类的数据集。
-
方法一:(1)将膜浆阳细胞三分类的训练集、测试集的标签都进行替换:将1→0,2→1。(2)进行膜浆阳细胞二分类的模型训练。(3)将训练好的模型进行测试。(4)将训练好的模型进行推理。
-
方法二:直接用已经训练好的膜浆阳细胞三分类。(1) 将膜浆阳细胞三分类测试集的标签进行替换:将1→0,2→1。(2) 在测试的时候要注意: val.py代码中,预测向量与标签进行比较之前,将预测向量类别1→0,2→1,才能保证测试的准确度。(3) 将该三分类模型直接进行推理。
-
- 今天代码出了个纰漏,在测试集推理的时候,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设置小一点,要么就注释掉这一段就可以了。
-
发现了netron.app/ 可以将onnx可视化出来。
-
学习YOLO还是其他模型,要学会去看官网。
思路
- 遇到问题不要慌张,去一步步分析才能成长。
- 要去对比你和其他人的工程之间的差异。
- 你要自主去学习,建立自己解决问题的体系,不要等着别人把饭喂你嘴里。
- 从结果去反推过程中的问题。
- 向领导汇报工作的时候:先讲结果→略微提过程→面向未来的解决方案。
- 和你的上级领导确立工作内容,其他人都只能是建议;只有你的上级领导同意才可以,要多和他去确定,而不是将其他人的建议作为方案。
- 我同事说我对工程的整体思路不了解。这是个致命的问题。我个人觉得饭得一口一口吃,是我慢了点,慢慢来更扎实。
- 和同事交流了一下,他说,我应该更放开一些自己,别那么紧张,有不懂的,多去交流,大胆承认自己没有做到的这没什么。
- 我知道交流之前去看看自己有没有静下心去解决,我个人并没有把自己的领域弄熟,毕竟前一阵子太忙了,我决定放弃当前的比赛,专注在一件事情。慢即快。从事这个行业,快要不得,先一步一步来。
- 同事和同门不一样,因为每个人都有责任在,不能嬉笑做事情,做事情就要认真。
- 和别人讨论问题时,把当前背景,前因后果解释清楚。
问题
- YOLOv5 val.py代码整理(已整理)
- YOLOv5 train.py代码整理(已整理,还需研究细节)
- YOLOv5 loss.py代码整理(已整理,还需研究细节)
- 学习使用debug去观察参数的每个epoch变换(已完成)
- Python 继承(已整理)
- 写一个测试每张图片精度的脚本(已整理)
- 学习分布式训练。(已整理,需要实战一波)
- 学习YOLOv5的NMS。
- 学习YOLOv5上组长写的prediction。
- YOLOv5 模型的搭建,数据的注入,检测过程。
- YOLOv8学习模型上的改进、逻辑绘制蓝图。
- 学习linux编程,可以很熟练地增删改查文件。
- 学习计算机视觉transformer。
- 学习unet,deeplab。
- 对于数据的输入格式到数据的预测格式之间的变化,不是很懂。
- 学习部署
- 学习SAM