【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)

CELL TRACKING CHALLENGE官网:http://celltrackingchallenge.net/

显微HeLa细胞数据集:

  • Training dataset: http://data.celltrackingchallenge.net/training-datasets/DIC-C2DH-HeLa.zip (37 MB)
  • Challenge dataset: http://data.celltrackingchallenge.net/challenge-datasets/DIC-C2DH-HeLa.zip (41 MB)

运行环境:Linux+pycharm+python3.8+TensorFlow-gpu+keras

程序:Yolov5+Kalman Filter

已上传到github:https://github.com/VivianW-Happy/-Yolov5-Kalman-Filter-multi-cell-tracking

参考讲解:

1. 深入浅出Yolo系列之Yolov5核心基础知识完整讲解

2. 详解卡尔曼滤波原理

3. 迁移学习概述(Transfer Learning)

参考程序:

1. ultralytics/yolov5

2. mattzheng/keras-yolov3-KF-objectTracking

3. srianant/kalman_filter_multi_object_tracking

参考文献:

[1] Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[C]. Computer Vision & Pattern Recognition. IEEE, 2016.

[2] Alexey Bochkovskiy, Chien-Yao Wang, and Hong-Yuan Mark Liao. YOLOv4: Optimal speed and accuracy ofobject detection. arXiv preprint arXiv:2004.      10934, 2020.2.7

[3] Greg Welch, Gary Bishop, "An Introduction to the Kalman Filter", University of North Carolina at Chapel Hill Department of Computer Science, 2001

[4] M.S.Grewal, A.P. Andrews, "Kalman Filtering - Theory and Practice Using MATLAB", Wiley, 2001

向上述各位作者大佬敬礼!向你们salute!

目录

一、问题描述

二、设计思路

三、算法实现

3.1 准备训练数据集

3.2 训练Yolov5

3.3 测试Yolov5

3.4 Kalman Filter实现多目标追踪

四、结果分析

4.1 Yolov5目标检测:

4.2 Kalman Filter多目标追踪

五、总结



一、问题描述

CELL TRACKING CHALLENGE:正确地描述细胞在与周围环境相互作用时如何改变形状和如何移动,是理解细胞迁移的力学生物学及其在正常组织发育和许多疾病中的多重含义的关键,而在延时视频序列中分割和跟踪运动细胞是一项具有挑战性的任务。

针对该挑战,我们着眼于细胞追踪任务,使用延时显微HeLa细胞视频,如图1所示,实现对视频序列中多个细胞的追踪。

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第1张图片  图1 

                                                                                                           

二、设计思路

多个HeLa细胞的追踪任务,主要分为两个步骤:目标检测和多目标追踪。

实现的流程图如图2:

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第2张图片 图2

 

其中,目标检测选择的算法为Yolov5,检测出每一帧视频图像中每个细胞的boundingbox;多目标追踪的算法为Kalman Filter;为了可视化追踪结果,使用同一种颜色标注同一个细胞在每一帧视频图像中的位置,以表示其运动轨迹。

Yolov5:YOLO是一种基于深度神经网络的目标识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。它将目标检测框架化为边界框和相关类概率的回归问题,使用单个神经网络,在一次评估中直接从完整图像中预测边界框和类概率,流程如图3所示。

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第3张图片 图3

Yolov5是Yolo的第五代改进版本,速度非常快,有非常轻量级的模型大小,同时在准确度方面又与 YOLOv4 基准相当,它的网络结构图如图4所示。

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第4张图片 图4

 

为了将Yolov5应用到细胞检测领域中,我们使用迁移学习思想。迁移学习是面对数据集不大的一种较好的学习策略。深度神经网络的浅层神经元学习到的特征大部分都是一些基础的图像特征,比如条纹、点线等特征,这些特征是大部分视觉任务共有的。所以如果自己的训练集不大,可以使用他人在大型数据集中预训练好的模型,冻结底层网络的参数不参与训练更新,只更新高层的网络参数,也可以得到较高的学习结果,如图5所示。而YOLO能够学到更加通用的特征,且泛化能力比较强,模型鲁棒性较高,也便于将模型迁移到其它领域。

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第5张图片 图5

Kalman Filter卡尔曼滤波常用于目标跟踪领域,其基本思想是:以最小均方误差为最佳估计准则,采用信号与噪声的状态空间模型,利用前一时刻的估计值和当前时刻的观测值来更新对状态变量的估计,求出当前时刻的估计值,算法根据建立的系统方程和观测方程对需要处理的信号做出满足最小均方误差的估计。

卡尔曼滤波是一种递归的估计,工作原理如图6所示,包括两个主要过程:预估(prediction)与校正(correction)。

  • 预估过程:主要是利用时间更新方程建立对当前状态的先验估计,及时向前推算当前状态变量和误差协方差估计的值,以便为下一个时间状态构造先验估计值。
  • 校正过程:负责反馈,利用测量更新方程在预估过程的先验估计值及当前测量变量的基础上建立起对当前状态的改进的后验估计。
【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第6张图片 图6

 

三、算法实现

3.1 准备训练数据集

  • 创建标签数据集

将官方提供的DIC-C2DH-HeLa中细胞跟踪的groundtruth图像信息写入txt文件中,格式为,其中,每个细胞对象一行,框坐标采用归一化的xywh格式(从0到1),类别class用序号表示,一般从0开始。示例如图7所示,图7(a)为groundtruth图像,图7(b)为对应的txt文件。

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第7张图片 图7

使用MATLAB完成txt标签数据的转换:

%转换cell tracking的groundtruth:二值图——>x.txt(class x_center y_center width heigh)

framesPath = 'F:\细胞跟踪\DIC-C2DH-HeLa (train)\02_ST\SEG\';%图像序列所在路径,同时要保证图像大小相同  

imageDirPath =  framesPath;  %存储图像的文件夹路径
fileExt = '*.tif';  %待读取图像的后缀名
%获取所有路径
files = dir(fullfile(imageDirPath,fileExt)); 
num = size(files,1);

%读入图片  
startFrame = 0; %从哪一帧开始  
endFrame =size(files,1)-1; %哪一帧结束  

for idx=startFrame:endFrame
    
    fileName=sprintf('man_seg%.3d',idx);
    fileName_out_txt=sprintf('%.6d',idx);
    img=imread([framesPath,fileName,'.tif']);  
%     figure;imshow(img);title('origin');
    [m,n]=size(img);
    img_size=size(img);
    for i=1:m
        for j=1:n
            if img(i,j)>0
                imgnew(i,j)=255;
            else
                imgnew(i,j)=0;
            end
        end
    end
%     figure;imshow(imgnew);title('groundtruth_01');
%% 获取图像中的连通域,及其中心点

    %用ostu方法获取二值化阈值,进行二值化并进行显示(将512x512 double转成512x512 logical)
    level=graythresh(imgnew);
    openbw=im2bw(imgnew,level);

    %获取区域的'basic'属性, 'Area', 'Centroid', and 'BoundingBox' 
    stats = regionprops(openbw, 'BoundingBox' ,'Area','Centroid' ,'PixelList','PixelIdxList'); %统计白色的连通区域
    centroids = cat(1, stats.Centroid);  % 所有连通域的重心点的坐标
    boundingboxes=cat(1, stats.BoundingBox);
   
    fid = fopen([framesPath,fileName_out_txt,'.txt'], 'wt'); 
    for i=1:size(stats)
         centroid=[centroids(i,1), centroids(i,2)];               %每个连通区域的重心位置
         normalized=normalization(img_size, centroid);
        
         fprintf(fid,'0 %f %f %f %f\n',normalized); 
    end
    fclose(fid);  
end  

function normalized=normalization_boundingbox(img_size, boundingbox)
    %得到长和宽的缩放比
    dw = 1./(img_size(1));
    dh = 1./(img_size(2));
    
    %分别计算中心点坐标,框的宽和高
    %boundingbox=[The_upper_left_corner_x,The_upper_left_corner_y,x_width,y_width]
    x = boundingbox(1) + boundingbox(3)/2.0 ;
    y = boundingbox(2) + boundingbox(4)/2.0 ;
    w = boundingbox(3);
    h = boundingbox(4);
        
    %按照图片长和宽进行归一化
    x = x * dw;
    w = w * dw;
    y = y * dh;
    h = h * dh;
    normalized=[x,y,w,h];
end


function normalized=normalization(img_size, centroid)
    %得到长和宽的缩放比
    dw = 1./(img_size(1));
    dh = 1./(img_size(2));
    
    %分别计算中心点坐标,框的宽和高
    x = centroid(1);
    y = centroid(2);
    w = 150;
    h = 150;
        
    %按照图片长和宽进行归一化
    x = x * dw;
    w = w * dw;
    y = y * dh;
    h = h * dh;
    normalized=[x,y,w,h];
end
  • 创建HeLa.yaml:

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第8张图片

 整个HeLa训练验证数据集的目录为:

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第9张图片

3.2 训练Yolov5

训练指令:python train.py --data HeLa.yaml

YOLOV5训练代码train.py注释与解析

3.3 测试Yolov5

测试指令:python detect.py --source data/test --weights runs/train/exp3/weights/best.pt

  • 将Yolov5检测出的boundingbox数据写到txt文件中,并将boundingbox绘制在图像上保存到本地。

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第10张图片

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第11张图片

3.4 Kalman Filter实现多目标追踪

程序文件:

  • mydetect_add_track.py
  • objecttracker/KalmanFilterTrackerCell.py

运行指令:python mydetect_add_track.py --source  data/test --weights  runs/train/exp3/weights/best.pt

初始化追踪器Tracker的类对象tracker:

  • 对Yolov5检测结果进行阈值过滤,将置信度>0.7的boundingbox及其中心点数据输入到tracker_detection函数中,进行追踪,并将每帧图像的追踪结果保存到本地:

  • tracker_detection函数使用Kalman Filter进行追踪,每次更新各个细胞的追踪轨迹:

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第12张图片

3.5 结果可视化

在每帧图像上画出每个细胞运动轨迹中最后一个轨迹位置的boundingbox:

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第13张图片

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第14张图片

四、结果分析

4.1 Yolov5目标检测:

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第15张图片 图8

首先,使用准备好的HeLa训练数据集训练Yolov5,经过300次迭代后得到相应的权重weights/best.pt;在该权重下,Yolov5对显微HeLa细胞进行目标检测的部分结果如图8所示。

图8(a)中,所有细胞都是正常形态,它们都能被较为准确地检测出来,几乎每个boundingbox都框住了其对应的细胞,且没有误检或漏检。

图8(b)中,图像右侧的细胞正处于分裂过程,它们的目标检测结果中有许多误检,一些boundingbox框住了空白区域或细胞的一小部分。

因此,对于视野中未处于分裂过程中的细胞,Yolov5的目标检测效果非常好;而对于处于分裂过程中的细胞,Yolov5会出现一些误检。

4.2 Kalman Filter多目标追踪

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第16张图片

 

【计算机视觉】基于Yolov5+Kalman Filter的多细胞追踪(CELL TRACKING CHALLENGE)_第17张图片 图9

使用Kalman Filter对显微HeLa细胞目标检测的输出进行多目标追踪的部分结果如图9所示,其中,(a)(b)(c)(d)为连续4帧图像,每幅图像中,使用矩形框标注每个细胞的检测结果boundingbox,使用红色实心圆点标注boundingbox的中心点,使用同一个颜色的矩形框标注不同帧中的同一个细胞,以表示该细胞的运动轨迹。

从图9中4张连续帧图像的可视化多目标追踪结果中可以看出,每个细胞在不同帧中都能够用相同颜色的矩形框标注出来,表明对于视野中未处于分裂过程中的细胞,它们在运动过程中都能够被正确追踪。

而碰上处于分裂过程的帧时,分裂细胞的追踪路径中断。

五、总结

结合Yolov5目标检测算法和Kalman Filter多目标追踪算法实现了对视频序列中多个HeLa细胞的追踪。

使用HeLa训练数据集训练后的Yolov5能够检测出边缘模糊、形状不一、形变剧烈的HeLa细胞,检测准确率较高,鲁棒性较好;但是对于处于分裂过程中的小细胞群,Yolov5会出现较多的误检。

使用Kalman Filter能够正确追踪视野中未处于分裂过程中的细胞。

 


 PS:这是多细胞检测和追踪的简单实现,仍然还有很多不足待改进,尤其是Kalman Filter追踪,追踪效果不尽如人意。

希望做相关研究的小伙伴们能够不吝赐教~

你可能感兴趣的:(python,卡尔曼滤波算法,计算机视觉,目标跟踪,神经网络)