转自AI Studio,原文链接:Antigen Detector(新冠试剂盒检测) - 飞桨AI Studio

1、检测效果展示

2、Antigener_Detector思路说明

Antigener Detector通过两种方法串行,来完成检测。从而提高阳性样本的召回率。

首先是使用在数据集(新冠抗原检测试剂数据集)上训练的ppyoloe-s模型进行目标检测。紧接着使用传统视觉算法对检测得到的主体进行后处理。最后由两者结果共同进行判断。

之所以这样做,有以下两方面原因:

1、数据集阳性样本量不够多。(欢迎各位开发者朋友们对上述数据集的进一步完善做出贡献。)
2、当检测试剂棒上的红杠颜色很浅时,很容易误识别成阴性。这在实际应用中是绝对不允许的。

因此,本着“宁可错检阴性样本,也绝不放过任何一个阳性样本”的原则,使用了上述思路进行检测。

3、代码结构

│  detector.py             #目标检测器
│  detpreprocess.py        #目标检测前图像预处理部分
│  main.py				   #主函数。
│  postprocess.py
│  predictor.py
│  preprocess.py
│  Readme.md        
├─params
    │      infer_cfg.yml   #如若重新训练检测器,不要替换掉该文件,可将新训练的与之对照修改
    │      model.pdiparams
    │      model.pdiparams.info
    │      model.pdmodel
    │      
├─test_images
    │      detect_output.png
    │      FDLOw1RXoAY6Aat.jpg
    │      FEeigpzX0AEmqW-.png
    │      FIHmHpwWQAcKWK3.jpg
    │      positive.jpeg
├─utils
    │  config.py
    │  logger.py
    │  init.py  

4、检测模型的训练

4.1、检测模型简介

PP-YOLOE的优点:
 	1、性能更强。如上图所示,PP-YOLOE 的 s/m/l/x 全系列四个尺寸在精度及速度方面均超越其他同体量算法。其中 PP-YOLOE-l 在 COCO test-dev 上精度可达 51.4%,在 V100 上使用 TRT FP16 进行推理,速度可达 149FPS,相较于YOLOX-l精度提升 1.3 AP,速度提升 24.96%;相较于YOLOv5-x精度提升 0.7AP,TRT-FP16 加速 26.8%;相较于PP-YOLOv2精度提升 1.9 AP,速度提升 13.35%。
   2、配置方案丰富灵活。P-YOLOE不仅提供 4 种固定尺寸,且支持开发者灵活地定制化配置更多尺寸;顺畅支持包括模型量化、剪枝和蒸馏在内丰富的模型优化策略,满足实际产业场景中速度和精度的极致追求;全面高质量支持包括 TensorRT 和 OpenVINO 在内的加速库,还提供一键转出 ONNX 格式,可顺畅对接 ONNX 生态。
   3、部署支持。PP-YOLOE 在结构设计上避免使用 DCN、Matrix NMS 等不易部署的算子,使其可以方便地部署到不同的硬件当中。当前已经完备支持 NVIDIA V100、T4 这样的云端 GPU 架构以及如 Jetson 系列等边缘端 GPU 设备。

由于PP-YOLOE具有以上特点,更切合实际应用场景,因此选择该模型作为目标检测模型。

4.2、配置训练环境

In [ ]

!git clone https://gitee.com/paddlepaddle/PaddleDetection.git

In [ ]

%cd /home/aistudio/PaddleDetection/
!pip install -r requirements.txt && python setup.py install

4.3、解压数据集

In [ ]

%cd /home/aistudio/data/
!unzip -oq /home/aistudio/data/data145153/DatasetId_356209_1652018624.zip
/home/aistudio/data

In [2]

%cd /home/aistudio/data/DatasetId_356209_1652018624/

import os

f = open("train.txt", 'w')
for dir_ in os.listdir("/home/aistudio/data/DatasetId_356209_1652018624/Images"):
    dir_m = dir_.split(".")
    f.write("Images/{}\tAnnotations/{}\n".format(dir_, dir_m[0]+'.xml'))

m = open("label_list.txt", 'w')
m.write("{}\n".format('positive'))
m.write("{}\n".format('negative'))
m.write("{}\n".format('Invalid'))
/home/aistudio/data/DatasetId_356209_1652018624
8

4.4、配置训练文件

In [ ]

%cd /home/aistudio/PaddleDetection/configs/datasets/
!touch antigener_dataset.yml
%cd /home/aistudio/PaddleDetection/configs/ppyoloe/
!touch antigener_detection.yml
/home/aistudio/PaddleDetection/configs/datasets
/home/aistudio/PaddleDetection/configs/ppyoloe

In [ ]

"""
antigener_dataset.yml添加如下内容:
"""
_BASE_: [
  '../datasets/antigener_dataset.yml',
  '../runtime.yml',
  './_base_/optimizer_300e.yml',
  './_base_/ppyoloe_crn.yml',
  './_base_/ppyoloe_reader.yml',
]

log_iter: 100
snapshot_epoch: 10
weights: output/ppyoloe_crn_s_300e_coco/model_final

pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/CSPResNetb_s_pretrained.pdparams
depth_mult: 0.33
width_mult: 0.50

TrainReader:
  batch_size: 32

LearningRate:
  base_lr: 0.01

In [ ]

"""
antigener_detection.yml添加如下内容:
"""
metric: VOC
map_type: 11point
num_classes: 3

TrainDataset:
  !VOCDataSet
    dataset_dir: /home/aistudio/data/DatasetId_356209_1652018624
    anno_path: train.txt
    label_list: label_list.txt
    data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']

EvalDataset:
  !VOCDataSet
    dataset_dir: /home/aistudio/data/DatasetId_356209_1652018624
    anno_path: test.txt
    label_list: label_list.txt
    data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']

TestDataset:
  !ImageFolder
    anno_path: /home/aistudio/data/DatasetId_356209_1652018624/label_list.txt

4.5、模型训练

In [5]

%cd /home/aistudio/PaddleDetection/
!python tools/train.py -c configs/ppyoloe/antigener_detection.yml

In [ ]

!python tools/export_model.py -c configs/ppyoloe/antigener_detection.yml --output_dir=./inference_model \
 -o weights=output/antigener_detection/model_final.pdparams

5、使用方法

使用时一定要注意修改main.py文件里的相关路径。

from main import antigener_classification

img = cv2.imread('test_images/positive.jpeg')
results = antigener_classification(img)
print(results)
"""
输出results的格式如下:
{'Positive':[a, b, c, ...., n], 'Negative':[a, b, c, ...., n]}
a, b, c, ...., n的格式如下:
[x1, y1, x2, y2, confidence]
左上角坐标,右下角坐标以及置信度。
"""

6、Update Codes更新日志

2022.5.11算法更新: 本次更新替换了原算法中的第二阶段。而是通过建立阴性、阳性样本的特征向量数据库。当目标检测完成之后,如果目标检测得到的目标置信度小于设置的negative_threshed和positive_threshed两个阈值,则使用训练好的分类模型对感兴趣区域进行特征提取,之后在已经构建的特征向量数据库中进行搜索,找到相似度最高的特征向量,即认为该样本标签与数据库中样本标签一直,从而提升算法的容错率。

建立数据库的方法:

python .\build_gallary.py -c .\params\build_index.yaml

使用方法:

from antigener_detector import antigener_classification_update_1、Searcher

img = cv2.imread('xxx')
searcher, id_map = Searcher()
results = antigener_classification_update_1(img, searcher, id_map)
print(results)
"""
输出results的格式如下:
{'Positive':[a, b, c, ...., n], 'Negative':[a, b, c, ...., n]}
a, b, c, ...., n的格式如下:
[x1, y1, x2, y2, confidence]
左上角
"""

7、继续改进思路

由于这是一种两个方法串行检测的方案。因此,提升任何一个的检测性能,都会对该方案的性能提升有一定帮助。而改进思路也很显然:

1、改进目标检测本身。(从模型角度以及数据集角度)
2、进一步完善传统视觉算法方案。

By Hansansui 2022.05.09

AI Studio主页:韩三岁个人主页

希望自己所做能尽绵薄之力,愿疫情早日结束!

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐