Python小组作业:基于yolov5的口罩佩戴识别

  • 2021 年 12 月 19 日
  • 筆記

Python老师给了三个小组项目:1.自身专业问题 2.人工智能 3.游戏或者小工具
提前告知了,写游戏不好拿高分,小工具又不能展示自己的水平。大一刚来也没碰到什么专业问题,于是经过讨论,决定了做人工智能项目。
又因才疏学浅,只好践行拿来主义,把现成的yolov5拿来用,做一个口罩佩戴识别。
1.环境配置:本项目使用miniconda + pytorch + yolov5,IDE使用的是Pycharm。
miniconda官网://conda.io/en/latest/miniconda.html
pytorch官网://pytorch.org/get-started/locally/
Pycharm官网://www.jetbrains.com/pycharm/download/#section=windows
miniconda配置pytorch教程://blog.csdn.net/weixin_41297324/article/details/109478948
Pycharm安装教程://www.runoob.com/w3cnote/pycharm-windows-install.html
Anaconda可以虚拟化管理python环境,自带许多科学计算的python库。这是个非常方便的选择,也为后面封装exe挖了个坑。
不使用conda配置pytorch教程://blog.csdn.net/qq_23013309/article/details/103965619
Yolov5项目地址://github.com/ultralytics/yolov5
python版本是3.8,cuda版本我选择的是11.3,yolov5使用的是v6.0版本。
2.收集数据、打标签
训练人工智能是很吃数据的,推荐的数据规模是每一类1000+图片,因为是小组项目,所以采用的是小数据集。
目标数据部分来自://www.bilibili.com/video/BV1i7411376y
背景数据来自我手机相册、朋友圈。
打标签工具Labelimg://github.com/tzutalin/labelImg
将所有数据进行打标签,过程应当是十分痛苦的。
3.调整代码训练数据
yolov5-v6.0下载解压后,找到train.py,对其中代码进行修改。
parser.add_argument(‘–weights’, type=str, default=ROOT / ‘yolov5s.pt’, help=’initial weights path’)
选择预训练的模型,如果数据集足够大,不选择预训练模型也可以取得很好的成果。
parser.add_argument(‘–epochs’, type=int, default=100)
训练次数,这里默认是300,因为性能有限所以选择了100.
parser.add_argument(‘–batch-size’, type=int, default=3, help=’total batch size for all GPUs’)
default需要根据显卡和内存性能修改,电脑是GTX3060+16G内存,我这里设置的比较保守。如果设置过大,会导致显存溢出。
其他的配置可以保持默认,直接把数据和标签扔进coco128的train2017文件夹中进行训练即可。
找到coco128.yaml,对其中的代码进行修改:

 # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
    path: ../datasets/coco128  # dataset root dir
    train: images/train2017  # train images (relative to 'path') 128 images
    val: images/train2017  # val images (relative to 'path') 128 images
    test:  # test images (optional)

    # Classes
    nc: 2  # number of classes
    names: ['masked','no_mask']  # class names
nc改成2,names改为masked no_mask。

4.运行train.py,训练模型。


5.修改并调用detect.py
在yolov5的文件夹下新建一个mask_kid.py,内容如下:

    from detect import run
    run_dict = {
        'weights': 'best.pt',
        'source': 0,
        'imgsz': [640, 640],
        'conf_thres': 0.85,
        'iou_thres': 0.75,
        'max_det': 10,
        'device': '0',
        'view_img': False,
        'save_txt': False,
        'save_conf': False,
        'save_crop': False,
        'nosave': True,
        'classes': None,
        'agnostic_nms': False,
        'augment': False,
        'visualize': False,
        'update': False,
        'project': 'runs/detect',
        'name': 'exp',
        'exist_ok': False,
        'line_thickness': 3,
        'hide_labels': False,
        'hide_conf': False,
        'half': False,
        'dnn': False
    }
    run(**run_dict)

从训练结果文件夹中找到best.pt复制到yolov5文件夹下。
图形界面还没写,主要是加载参数并且调用detect.py。基本没有太大技术含量。
运行此代码尝试一下,似乎效果还可以?
5.优化
虽然能够正确识别无遮挡的人脸和口罩遮挡的人脸,但是此模型在面对其他类型的遮挡攻击时表现较差。
目前的优化思路有两个:
一、二次识别
二、增加攻击数据
二次识别需要更多的数据,需要更多的代码。才疏学浅,只好选择增加攻击数据重新训练。
6.封装项目
由于之前使用的是虚拟环境,在使用Pyinstaller打包时遇到问题无数。
打包后的程序在自己电脑上运行正常,去其他电脑上运行频繁报错。
最后经高人指点乃是conda导致部分库打包不完全,需要在实际环境中打包或是指定路径,在此一并感谢。
时间紧迫,后续工作就不开展了。

附模型分享:
链接://pan.baidu.com/s/1tmT_9oE6tWw7s2Wa_KYpTA
提取码:z3k1