社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

​【深度学习】厨师工作服/工作帽识别冠军方案|PRCV2022

机器学习初学者 • 2 年前 • 700 次点击  
作者丨杨新    编辑丨极市平台

导读

 

PRCV2022厨师工作服/工作帽识别的冠军方案解读,作者展示了其模型思路全过程。

任务介绍:随着食品安全问题的日益严峻,后厨的卫生也成为了当下人们关心的问题。后厨人员的卫生穿戴习惯直接影响到食品的卫生品质,因此规范后厨穿着逐渐成为后厨人员卫生管理重要一环。算法应用场景:厨房监控摄像头取像,识别厨房人员的穿着情况,识别到厨房人员没有识别对象,进行告警。

数据集:

训练集:17725个 测试集:7776个 目标类别数目:31类

本赛题采用的评审指标如下:

注意: 

1.PRCV赛题中对厨师工作服/工作帽识别模型榜,有一个最低分数要求,成绩分需达到0.9 

2.本赛题最终得分采取准确率、算法性能绝对值综合得分的形式,其中IoU使用0.4

解决方案:

算法选择:

上图为yolov6文章中的几个yolo算法的性能指标比对,yolov6主要基于repvgg结构进行改进,以及采用anchorfree方式,笔者最开始使用的是yolov5m模型进行训练,速度可以达到100fps,但是调整训练和测试参数都无法达到赛题中要求的0.9的基准值,还是模型精度不够好,对比看yolov5-m和yolov6-m的性能指标,几乎同样的推演延时情况下,yolov6-m的mAP值比yolov5-L的精度还要高,因此笔者最终采用的是yolov6-m进行训练。

模型训练:

yolov6在代码结构上数据集上以及训练方法上有很多都和yolov5很类似。

数据集的生成:

由于笔者最开始使用的是yolov5进行训练测试的,yolov6的数据生成都是和之前yolov5一样的,参考了https://cvmart.net/document其中《基于YOLOV5的新手任务实践》中的步骤,训练集和测试集的比例采用的是9:1的比例。

数据配置文件如下:

train: /project/train/src_repo/dataset/images/train
val: /project/train/src_repo/dataset/images/val

nc: 31  # number of classes
names: ["person""short_sleeve_red""short_sleeve_black""short_sleeve_white""short_sleeve_grey""short_sleeve_green",
"short_sleeve_blue""short_sleeve_dark_blue""long_sleeve_red""long_sleeve_black""long_sleeve_white""long_sleeve_grey"
"non_uniform""other_uniform""chef_hat_red" "chef_hat_black""chef_hat_white""peaked_cap_red""peaked_cap_black""peaked_cap_white""peaked_cap_blue",
"peaked_cap_beige""disposable_cap_white""disposable_cap_blue""head""other_hat""apron_red""apron_black""apron_white""apron_grey""other_apron"]  # class names

模型配置文件如下:

 YOLOv6m model
model = dict(
    type='YOLOv6m',
    pretrained='yolov6m.pt',
    depth_multiple=0.60,  
    width_multiple=0.75,
    backbone=dict(
        type='CSPBepBackbone',
        num_repeats=[1, 6, 12, 18, 6],
        out_channels=[64, 128, 256, 512, 1024],
        csp_e=float(2)/3,
        ),
    neck=dict(
        type='CSPRepPANNeck',
        num_repeats=[12, 12, 12, 12],
        out_channels=[256, 128, 128, 256, 256, 512],
        csp_e=float(2)/3,
        ),
    head=dict(
        type='EffiDeHead',
        in_channels=[128, 256, 512],
        num_layers=3,
        begin_indices=24,
        anchors=1,
        out_indices=[17, 20, 23],
        strides=[8, 16, 32],
        iou_type='giou',
        use_dfl=True,
        reg_max=16, #if use_dfl is False, please set reg_max to 0
        distill_weight={
            'class': 1.0,
            'dfl': 1.0,
        },
    )
)

solver=dict(
    optim='SGD',
    lr_scheduler='Cosine',
    lr0=0.01,
    lrf=0.01,
    momentum=0.937,
    weight_decay=0.0005,
    warmup_epochs=3.0,
    warmup_momentum=0.8,
    warmup_bias_lr=0.1       
)
 
data_aug = dict(
    hsv_h=0.015,  
    hsv_s=0.7, 
    hsv_v=0.4,
    degrees=0.0,
    translate=0.1,
    scale=0.9,
    shear=0.0,
    flipud=0.0,
    fliplr=0.5,
    mosaic=1.0,
    mixup=0.1,
)

训练代码修改:

由于yolov6训练的模型太大,平台上最多只能存1G的模型,在代码engine.py中将self.tblogger = None 以及tblogger相关的屏蔽掉防止其占用太多的空间。

笔者采用yolov6训练的时候到截止提交时间没剩几天,将最大epochs改为了200,这里有可能使用默认的400效果更好。训练命令如下:

python /project/train/src_repo/YOLOv6/tools/train.py   
--data /project/train/src_repo/yolov5/data/object.yaml 
--img 640 
--conf  configs/yolov6m.py 
--epochs 200 
--output-dir /project/train/models/train \
--batch 16

推理测试:

推理代码主要基于的是极市封装程序的代码https://github.com/ExtremeMart/ev_sdk_demo4.0_pedestrian_intrusion_yolov5

为了方便进行测试,这里在cpp代码中增加python代码用于方便导出onnx模型

std::system("cd /project/train/src_repo/YOLOv6 && python /project/train/src_repo/YOLOv6/deploy/ONNX/export_onnx.py --weights /project/train/models/train/exp/weights/best_ckpt.pt --simplify --inplace --img-size 640 640"),笔者使用这种方法在测试代码中直接导出onnx,后面的部分ev_sdk中包含使用onnx转换为tensorrt的代码。前面的测评标准中有写到使用IOU 0.4,因此在后处理做非极大抑制的时候将阈值改成了0.4,这个地方多次测试对比会对结果有影响。

推理效果:

测试结果:

总结:

1.基于yolov6-m进行训练,在同样推理速度的情况下比yolov5-m的精度要好,这里模型的选择很重要。

2.注意测评标准中有提到IOU是用的是0.4,因此我们在推演的时候也使用的是0.4的IOU进行测试,这里对精度也有影响。

3.基于tensorrt fp16进行推演,同时为了要满足推演速度,需要调整合适的尺寸满足这个条件。

https://github.com/ultralytics/yolov5

https://github.com/meituan/YOLOv6

https://github.com/ExtremeMart/ev_sdk_demo4.0_pedestrian_intrusion_yolov5




    
往期精彩回顾




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/149231
 
700 次点击