zoukankan      html  css  js  c++  java
  • CV入门系列笔记——全球人工智能技术创新大赛【热身赛】CV异常检测赛道

    本系列是针对于DataWhale学习小组的笔记,从一个对统计学和机器学习理论基础薄弱的初学者角度出发,在小组学习资料和其他网络资源的基础上,对知识进行总结和整理,今后有了新的理解可能还会不断完善。由于水平实在有限,不免产生谬误,欢迎读者多多批评指正。如需要转载请与博主联系,谢谢

    比赛核心思路


    题目要求与理解

    比赛内容:本赛场聚焦布匹疵点智能检测,要求选手研究开发高效可靠的计算机视觉算法,提升布匹疵点检验的准确度,降低对大量人工的依赖,提升布样疵点质检的效果和效率。要求算法既要检测布匹是否包含疵点,又要给出疵点具体的位置和类别,既考察疵点检出能力、也考察疵点定位和分类能力。

    评估指标:赛题分数计算方式:0.2ACC+0.8mAP
    ACC:是有瑕疵或无瑕疵的分类指标,考察瑕疵检出能力。其中提交结果name字段中出现过的测试图片均认为有瑕疵,未出现的测试图片认为是无瑕疵。
    mAP:参照PASCALVOC的评估标准计算瑕疵的mAP值,具体逻辑见evaluator文件。
    本次大赛评分计算过程中,分别在检测框和真实框的交并比(IOU)在阈值0.1,0.3,0.5下计算mAP,最终mAP取三个值的平均值。

    模型选择与优化

    作为第一次参与CV领域竞赛的小白,我选择了利用DataWhale提供的baseline作为比赛的基准方案。这套baseline主要以yolov5模型为基础,在训练前需要对官方给予的数据进行一些处理,使之满足yolo模型读取的要求。

    在官方提供的数据文件中,defect文件夹下以.jpg格式存放有瑕疵样品的图像数据,normal存放无瑕疵样品的图像数据,Annotations文件夹下放置训练数据的标签。Annotations文件中单个样本标签的格式如下:

    其中defect_name代表了缺陷的类型,是使用unicode格式编码后的缺陷中文名称。bbox是目标框的四个顶点坐标。而在最终需要提交的json文件中,每个测试样本需要提供四个信息,即:name字段——图片名称;category字段——类别标签;bbox——xyxy格式坐标框,小数点后保留2位;score——置信度概率,范围0-1。其中提交文件中的category标签与训练集中缺陷类型之间的对应关系如下:

    在数据转换部分的代码中,我们首先会读取原始训练集中的标签数据,然后存为yolo所需的列表形式保存于.txt文件中。该列表中每一行分别为一个样本的标签信息,包含<缺陷类别><中心点x坐标><中心点y坐标><目标框宽度><目标框高度>,后四项均为相对于整张图片的比例值。具体代码参见baseline中的convertTrainLabel.py文件。

    数据转换完成之后可以对yolov5模型进行训练,训练前需要对模型的参数进行设置,没有单独制定的则将默认值作为输入。一开始在自己的笔记本上训练,由于没有GPU,因此batch-size仅设定为3,然后对train2所对应的两个文件夹中的数据进行了3个epoch的训练,最终提交的镜像得分仅有5.66分。之后利用学校的GPU服务器进行训练时,将img-size设为640,batch-size设定为6,并进行了150个epoch的训练,最终得分15.73分,较之前有了些许提升,但主要是依靠训练回合数增多提升了效果,下一步仍需从数据和模型出发进行优化。期间还尝试过添加--evolve参数进行超参数进化,会通过遗传算子以一定的概率保留最优的超参数组合。但这种方法训练耗时太长,而且训练完成后我并没有找到应有的最优超参数文件yolov5/runs/evolve/hyp_evolved.yaml,因此在后续的训练中暂时没有采用。

    由于之前未接触过CV领域的课题,因此目前还在学习中,网络上有关于yolov5算法的一些资料(如参考资料6-11),可以作为学习参考。

    模型训练与提交流程


    docker环境配置

    根据此次比赛要求,我们需要将代码打包成docker镜像后提交,然后在云端拉取镜像进行模型测试。由于之前没有接触过,所以也等于借这次机会学习一下。

    Docker作为一种开源的应用容器引擎,其功能可以理解为将程序运行所需的环境打包为一个镜像,以便使用者在开发、测试、生产等不同场合中方便地运行程序而无需单独再对环境进行配置。另一方面,docker利用容器的方式将运行资源隔离,从而避免了不同程序间的相互干扰。相比于传统的虚拟机技术,docker中多个容器可以共享当前机器的操作系统内核,而无需消耗更多资源来为每个程序提供一套操作系统。凭借着其自身的优势,以docker为代表的容器技术目前已称为云计算领域的主流应用技术之一。

    关于docker的配置流程,比赛官网已经给出了比较详尽的介绍(可见参考资料2)。因此在这里仅简单总结下操作的步骤以及配置过程中遇到的问题。

    1. 首先在本地或云服务器中安装docker。ubuntu系统可直接执行(sudo apt install docker.io)命令,安装完成后(sudo docker info)进行检查。
    2. 下一步需要在云端申请一个容器镜像仓库,以便可以从比赛提交入口处拉取镜像来运行。这里我们选择阿里云提供的免费容器镜像服务。此处可按照参考资料3中的步骤进行,首先开通镜像托管,此次比赛仓库地域优先选择深圳(参考资料中为上海),然后牢记密码。之后创建命名空间,并选择本地仓库。在仓库管理页面可以看到右侧有对应的公网地址,可以复制下来,以便后续使用。
    3. 在构建镜像之前,可以先在本地完成数据格式转换和模型预训练。根据Datawhale学习小组提供的baseline,我们首先尝试用yolov5模型进行训练,在此之前需要将比赛数据格式转换为yolo要求的数据格式。转换完成后可以利用官方预训练权重进行预训练,训练前要下载权重文件,根据所使用的版本在命令中指定权重和模型文件,比如希望训练速度较快可以用yolov5s.pt/yolov5s.yaml,希望精度高则用yolov5x。这里baseline中存在一些问题,可以结合大佬的笔记进行调整(参考资料5)。训练完成后在weights文件夹中可以获得一个best.pt的权重文件,一会需要一同上传到docker中。在此处我的训练中主要出现了两次错误,第一次如下图所示,显示'C3'模块无法加载。解决方法是从官网下载yolov5的包,然后将其中common.py文件中关于'C3'模块的定义部分拷贝过来即可。

      第二次错误是'yaml'模块中找不到属性'FullLoader',可通过执行下述命令来解决。

      由于低版本pytorch与代码中调用的某些模块不兼容,我也重新安装了1.7.0版pytorch(pip install --user torch==1.7.0),并更新了对应版本的cuda和cudnn等模块。此外在解压官方提供的训练集文件时,由于单个压缩文件体积过大,用unzip命令解压会发生错误,因此可以选择用7z(需要安装相关模块)或jar(解压错误率较低,推荐使用)命令完成解压。
    4. 接下来就需要构建docker镜像了,首先从本地登录容器仓库。这里有两点需要注意,第一输入的用户名是阿里云账户的全名,有汉字也要输入;其次这里可能需要输入两次密码,第一次是获取sudo权限,第二次才是仓库的访问凭证密码(大意了~竟然试了半天才想起来)。
    5. 登录后首先要建立一个文件夹(我的是tianchi_submit_dic)将模型训练和执行所需的模块及权重等文件放进去,这里可以直接将DataWhale提供的文件放入(注意训练数据就不用放了,云端会提供单独的数据)。然后在此文件夹中新建一个Dockerfile作为配置文件,写入以下内容,这些内容可以帮助我们直接拉取天池提供的pytorch基础镜像环境。
    # Base Images
    ## 从天池基础镜像构建
    FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
    ## 把当前文件夹里的文件构建到镜像的根目录下
    ADD . /
    ## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
    WORKDIR /
    ## 镜像启动后统一执行 sh run.sh
    CMD ["sh", "run.sh"]
    
    1. 接下来要构建镜像并配置容器环境。构建可用(sudo docker build -t 公网地址:版本号)命令来完成。然后用(sudo docker images)查看容器id。之后执行(sudo docker run -it 容器id前四位 /bin/bash)进入容器。进入后执行(pip install -r requirement.txt),将所需模块一次性装入容器中。
    2. 保持并退出镜像。使用ctrl+P+Q退出但不关闭容器。然后执行 sudo docker commit 容器id 仓库公网地址:版本号 以将容器保存为镜像。
    3. 推送镜像。执行 sudo docker push 公网地址:版本号。
    4. 推送之后,登录阿里天池比赛网页,在提交结果一栏中按要求填写好镜像路径、用户名和密码,即可上传模型进行评分,如下图所示。

    比赛结果分析

    2月20日提交结果,当前仅为了尝试docker的使用方法而上传了一个只训练了3个epoch的模型,成绩较差,最近有时间希望能予以改进和提升。

    2月25日提交结果:

    参考资料:

    1. http://datawhale.club/t/topic/1418 Datawhale小组学习资料
    2. https://tianchi.aliyun.com/competition/entrance/531864/information 阿里云-全球人工智能技术创新大赛【热身赛】布匹疵点智能识别
    3. https://tianchi.aliyun.com/competition/entrance/231759/tab/174 阿里天池Docker环境配置操作说明
    4. https://zhuanlan.zhihu.com/p/54512286 为什么需要Docker
    5. https://blog.csdn.net/qq_26751117/article/details/113853150 布匹疵点智能识别 笔记
    6. https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/79590289 干货 | 目标检测入门,看这篇就够了(上)
    7. https://blog.csdn.net/nan355655600/article/details/107852353 深入浅出Yolo系列之Yolov5核心基础知识完整讲解
    8. https://www.cnblogs.com/dan-baishucaizi/p/14183614.html#6、-hyperparameter-evolution超参数调优 YOLOv5 项目教程
    9. https://blog.csdn.net/weixin_41990671/article/details/107300314 yolov5训练相关参数解释
    10. https://www.pianshen.com/article/38381579634/ 对于目标检测中mAP@0.5的理解
    11. https://www.jianshu.com/p/34b3312b71db [yolov5全解-一文通关]
  • 相关阅读:
    docker
    ibus
    看懂gradle
    tcp
    这丫头也的还真清楚,但是跑不通呢,换3.0.3的mybatis也不行
    lsb_release -a
    js中的整型都是用double存储的,有时候不精确,如,
    浏览器缓存及优化
    web即时通信技术
    css 变量
  • 原文地址:https://www.cnblogs.com/liugd-2020/p/14418868.html
Copyright © 2011-2022 走看看