智慧医疗-YOLOX血细胞检测

智慧医疗-YOLOX血细胞检测

目标检测一直是计算机视觉中比较热门的研究领域。本文将使用最新的目标检测算法YOLOX来对医疗相关数据集(血细胞数据)进行检测,这个数据集具有潜在的真实应用场景。

智慧医疗-YOLOX血细胞检测_第1张图片

  • 问题陈述

    解决血细胞检测问题是通过显微图像读数来检测每张图像中的所有红细胞(RBC)、白细胞(WBC)以及血小板 (Platelets)共三类。最终预测效果应如下所示:

智慧医疗-YOLOX血细胞检测_第2张图片
YOLOX算法预测结果图

选择该数据集的原因是我们血液中RBC、WBC和血小板的密度提供了大量关于免疫系统和血红蛋白的信息,这些信息可以帮助我们初步地识别一个人是否健康,如果在其血液中发现了任何差异,我们就可以迅速采取行动来进行下一步的诊断。

通过显微镜手动查看样品是一个繁琐的过程,这也是深度学习模式能够发挥重要作用的地方,一些算法可以从显微图像中分类和检测血细胞,并且达到很高的精确度。

本文采用的血细胞检测数据集下载地址

https://public.roboflow.com/object-detection/bccd

  • YOLOX介绍

智慧医疗-YOLOX血细胞检测_第3张图片

论文链接:

https://arxiv.org/abs/2107.08430
[[2107.08430] YOLOX: Exceeding YOLO Series in 2021 (arxiv.org)]

代码链接:

https://github.com/Megvii-BaseDetection/YOLOX
[GitHub - Megvii-BaseDetection/YOLOX: YOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/]

YOLOX是旷视科技新近推出的高性能实时目标检测网络,性能超越了YOLOv3/YOLOv4 /YOLOv5。

YOLOX使用 PyTorch开发,采用了YOLOX-DarkNet53骨干网络、解耦头、Anchor-free机制、Multi Positives、先进的标签分配策略和强数据增广等前沿技术。

YOLOX-DarkNet53 YOLOv3 是以 Darknet53 为主干,后面再加上 SPP。 YOLOX对训练策略进行了一些修改,增加了 EMA weights updating,余弦学习率, IoU 损失,以及 IoU-aware 分支,在训练分类和 objectness 的分支中,使用 了 BCE loss。在数据增强方面,只使用了水平翻转,颜色抖动和多尺度。

Decoupled head 在目标检测中,分类和回归的任务是有相互冲突的,这是个普遍认可的问题。因此,一般会将分类和回归分开 2 个分支,但是在 YOLO 系列中, 仍然是没有分开的。这里,将耦合的检测头分开,变为 2 个相互独立的检测分支。具体如下图

智慧医疗-YOLOX血细胞检测_第4张图片

Strong data augmentation 在数据增强中,使用了 Mosaic 和 Mixup 的增强策略,使用了这些增强策略之后,发现预训练模型已经没有必要了,因此后面所有的训练都是从头训练的。

Anchor-free 将 YOLO 转换为 anchor free 其实很简单,将每个空间位置的输出由 3 减少到 1,直接输出 4 个值,即左上角点的两个偏差值,以及宽和高。对于每个目标,其中心点位置所在的区域即为正样本,并预先定义一个尺度范围, 将每个目标分配到不同的 FPN 层上。

Multi positives 上面提到的 anchor free 的正样本选择策略,对于每个目标只选 择了 1 个正样本,这样会忽略掉其他的高质量的预测,使用这些高质量的预测对 于梯度是有好处的,而且样本的不均衡性也会减少一些。这里,简单的使用 了中心点 3x3 的区域,都作为正样本。

SimOTA 对于标签的分配,总结了 4 个关键点:

1)损失/质量相关性

2)中心优先

3)每个 GT 的正样本 anchor 点的动态数量

4)全局视角

使用 OTA 作为候选的标签匹配策略。然后对 OTA 进行了修改,提出了 SimOTA。首先,计算每个 prediction-gt 对的匹配度,用损失和质量来表示,这里,在 SimOTA 中,使用损失来表示

其中,λ是平衡系数,然后,对于一个 gt,用 gi 来表示,选择在一个固定的 中心区域内,topk 个具有最小的 cost 的预测来作为正样本,最后,这些正样本 所在的 grid 也被分配为正样本,其他的 grid 是负样本,注意,对于不同的 gt,k 是不一样的。

End-to-end YOLO 增加了 2 个额外的卷积层,进行一对一的标签分配,这使得检测器可以端到端的运行,这个略微降低了性能和速度。 具体的各种修改的效果如下:

智慧医疗-YOLOX血细胞检测_第5张图片

  • YOLOX实现

1.克隆 YOLOX 并安装

安装 Git 软件

Git - Downloads (git-scm.com)

克隆项目到本地

网址:

https://github.com/Megvii-BaseDetection/YOLOXgithub.com

git clone https://github.com/Megvii-BaseDetection/YOLOX.git 

或者直接下载 YOLOX 的代码并解压。 在 YOLOX 目录下执行:

 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

2.安装 apex

git clone https://github.com/NVIDIA/apex cd apex python setup.py install 

注意:cuda 的版本应和 cudatoolkit 一致

3.安装 pycocotools

pip install cython git clone https://github.com/philferriere/cocoapi.git 
cd cocoapi/PythonAPI
python setup.py install --use

4.下载预训练权重文件

下载 yolox_s.pth.tar,yolox_m.pth.tar,yolox_l.pth.tar,yolox_x.pth.tar, yolox_darknet53.47.3.pth.tar, yolox_nano.pth.tar, yolox_tiny.pth.tar 权重文件,并放置在 YOLOX/weights 文件夹下

5.安装测试

测试图片:

python tools/demo.py image -n yolox-s -c weights/yolox_s.pth.tar --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result

6.训练血细胞数据

修改文件 exps/example/yolox_voc/yolox_vocs.py

self.num_classes = 3

7.修改文件 voc_classes.py

VOC_CLASSES = ( "rbc", "wbc", "platelets" )

8.在 YOLOX 路径下执行

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s_bm.py -d 1 -b 16 --fp16 -o -c weights/yolox_s.pth.tar 

注意:如果出现显存溢出,可减小 batch-size 默认训练的 epoches 为 300,本文使用的epoches=10.

智慧医疗-YOLOX血细胞检测_第6张图片

9.测试训练出的网络模型

python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_s_bm.py -c YOLOX_outputs/yolox_voc_s_bm/best_ckpt.pth.tar --path testfiles --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu

智慧医疗-YOLOX血细胞检测_第7张图片

10.性能统计

python tools/eval.py -f exps/example/yolox_voc/yolox_voc_s_bm.py -c YOLOX_outputs/yolox_voc_s_bm/best_ckpt.pth.tar -b 16 -d 1 --conf 0.001 --fp16 -- fuse

你可能感兴趣的:(智慧医疗-YOLOX血细胞检测)