基于华为云Atlas 200DK的口罩识别系统

举报
yd_274686482 发表于 2023/11/08 22:34:08 2023/11/08
【摘要】 基于ModelArts和Atlas 200DK的云端协同实现,通过YOLO v3预置算法进行大数据训练,运用强大的智能标注功能完成口罩人脸的检测

2020年以来,由于新冠、甲流等传染疾病在高校间频发,佩戴口罩成为阻断校内病毒传播的一条重要途经。但人工关卡费时费力,而且难以避免近距离接触。本组根据这一需要,计划基于华为Atlas 200DK并结合目标检测算法设计完成一种应用于图书馆的人脸口罩佩戴检测系统,用以准确、快速、安全地识别出学生口罩佩戴的情况。

现状分析地图.png

数据集来源:https://gitee.com/vincent_wd/FaceMaskDetection?_from=gitee_search,是重新标注过的WIDER FaceMAFA数据集

华为云200DK环境搭建参考链接:https://bbs.huaweicloud.com/blogs/296960

模型步骤如下:

  1.  首先根据参考文档进行SD卡制作(https://www.hiascend.com/document/detail/zh/Atlas200DKDeveloperKit/1013/environment/atlased_04_0009.html),等待开发者板四个灯常亮。安装Ubuntu用于后续的命令配置,用USB将开发板连接到虚拟机,配置虚拟网卡IP后通过ssh指令登录开发板,安装所需要的docker开发包、os依赖包、python及其相关依赖、CNCC运行软件包(可参考https://gitee.com/ascend/tools/blob/master/makesd/Version_Mapping_CN.md
  2. 数据预处理阶段,ModelArts不仅可以创建和管理数据集,还可以用本身的功能去分析数据集的数据。将下载的数据集上传到OBS桶,在ModelArts将数据集进行标注,分为戴口罩的图像和未戴口罩的图像,再对数据进行处理,如清洗数据、处理缺失值、特征工程等,根据测试脚本对图片再进行处理使得与模型需要的输入一致。
    1. 数据读取:在实际场景中,口罩检测通常是面向视频数据流的,因此需要对输入数据进行处理。本文考虑两种形式的输入,即rtsp视频流和mp4视频文件。通过使用opencvVideoCapture,可以直接读取这两类视频并返回每一帧图片。代码框架如下:
          cap = cv2.VideoCapture(url)
          while True:
            ok, frame = cap.read()
            if not ok:
               break
            result = process(frame)
            cv2.imshow(result)
            cv2.waitKey(1)
      
    2. 数据处理:由于opencv读取的视频帧为CV_8UC3BGR格式,需要将其转化为RGB格式的CV_32FC3,其中数据需要归一化,以适应yolov3的输入。考虑到昇腾的CANNCompute Architecture for Neural Networks)已经提供了图片预处理功能AIPPArtificial Intelligence Pre-Processing),可以在AI Core上完成图片的各种预处理,所以这一步直接调用AIPP实现。
      编辑AIPP的配置文件如下:

      aipp_op {
          aipp_mode: static
          input_format : RGB888_U8
          src_image_size_w : 512
          src_image_size_h : 384
          mean_chn_0 : 0
          mean_chn_1 : 0
          mean_chn_2 : 0
          var_reci_chn_0 : 255
          var_reci_chn_1 : 255
          var_reci_chn_2 : 255
      }
  3. 数据集处理后,按照一定比例划分训练集和测试集,送入训练作业阶段,调配训练参数和训练规格,将训练得到的.pb模型通过ATC模型转换工具转换到Ascend 310推理使用的.om模型。
  4. 接下来是模型推理,YOLO V3在模型的速度和精度上取得了良好的平衡(https://pjreddie.com/media/files/papers/YOLOv3.pdf)。因此本课题基于Yolov3_resnet18算法读取输入, 将开发环境的 yolo3_resnet18_inference目录上传到运行环境中,执行运行脚本进行模型推理。
    1. 使用hiai库,初始化推理模型,代码如下:
      model = ModelManager.ModelManager()
      inferenceModel = hiai.AIModelDescription('Yolo3_Resnet18', 模型路径)
      graph = model.CreateGraph(inferenceModel, graph_id, model_engine_id)
      
    2. 将输入转化为tensor,代码如下:
      input = hiai.NNTensor(frame)
      inputs = hiai.NNTensorList(input)

    3. 模拟推理,代码如下:
      resultList = model.Inference(graph, inputs)

             d. 将结果转换回边界框、类别等信息,并绘制在原图上。该步骤主要包含3步,分别是:

      1. 边界框解码:首先计算出每个预测结果所对应的anchor信息,调用decode_bbox进行解码
      2. 结果过滤:由于预测结果存在重叠和低置信度,因此按照类别置信度进行过滤,并进行非最值抑制,调用apply_nms
      3. 结果绘制:将边界框用rectangle绘制于原图上,将类别名称和置信度用cv2.putText显示在原图上

     5. 将模型推理结果通过mp4视频展示,通过外接摄像头录制测试视频,具体代码如下:

      writer = cv2.VideoWriter_fourcc(*'mp4v')
      while True:
           ……
           writer.write(frame)

视频结果如下:

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。