2017-07-25 09:30:50 zhengyangwill 阅读数 1305
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30273 人正在学习 去看看 唐宇迪

深度学习在目标跟踪中的算法及应用

博文概述如下:

博文目的:总结整理“深度学习在目标跟踪中的应用”的相关资料,这里说的目标包括点目标和视觉目标

互通有无:希望通过该博文可以与在该方面研究的同学一起共享资料,互通有无,可以通过回复讨论。

博文更新:博文会不断更新

博文结构:1、深度学习基础教程;2、重点关注当前热点深度学习算法,例如CNN和RNN;3、热点算法在目标跟踪中的应用研究。

1、深度学习基础教程

    看过一些深度学习的基础教程,下面的教程算是最适合初学者的教程了。即有循序渐进的原理教程,又有python的代码实现。循序渐进,简单易懂,进行推荐。

零基础入门深度学习(1) - 感知器

零基础入门深度学习(2) - 线性单元和梯度下降
零基础入门深度学习(3) - 神经网络和反向传播算法
零基础入门深度学习(4) - 卷积神经网络
零基础入门深度学习(5) - 循环神经网络
零基础入门深度学习(6) - 长短时记忆网络(LSTM)
零基础入门深度学习(7) - 递归神经网络


2、深度学习算法

2.1 CSDN博文链接


3、深度学习在目标跟踪中的算法

3.1 CSDN博文链接


2020-01-11 01:08:22 weixin_44936889 阅读数 1377
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30273 人正在学习 去看看 唐宇迪

论文地址:
《Effective Gaussian Mixture Learning for Video Background Subtraction》
检测效果:

在这里插入图片描述
前面我们讲了【目标追踪】python帧差法原理及其实现【目标追踪】三帧差法原理及实现【目标追踪】python背景模型减除法原理及其实现,但它们有个共同的问题就是往往会出现空洞、鬼影等现象,而且不能很好地适应环境变化;因此这里我们介绍一个基于高斯混合学习的视频背景减法

(一)数学概念:

1.1 单高斯模型:

在这里插入图片描述
高斯模型是一种常用的变量分布模型,一维高斯分布公式如图:
在这里插入图片描述
为了便于描述和应用,常将正态变量作数据转换。将一般正态分布转化成标准正态分布:
在这里插入图片描述
X=(x1,x2,…xn) 的多维高斯分布如图:
在这里插入图片描述

比如二维高斯分布长这个样子,可以近似描述一组二维数据的分布:
在这里插入图片描述

1.2 样本分布的参数估计:

对于一组数据(可以认为是我们视频中输入的图像):

在这里插入图片描述
如果我们尝试使用单高斯模型(二维)去拟合这组数据,比如极大似然估计或者矩估计,得到的结果可能是这样的:
在这里插入图片描述
其中椭圆越往中心,离散点出现的概率就应该越高。

但是实际上我们观察到,这组数据并不是很符合这样的分布概率,因为似乎这组数据有多个概率中心:

在这里插入图片描述

因此这时我们认为,单高斯模型并不很好地拟合这组数据。

1.3 高斯混合模型:

在这里插入图片描述
对于复杂的图像,一般是多峰的。通过将直方图的多峰特性看作是多个高斯分布的叠加,可以解决图像的分割问题。
在这里插入图片描述

因此我们可以定义高斯混合模型,来拟合这样的分布:
在这里插入图片描述
其中:

  1. K 是表示混合模型的数目;
  2. p(k) 是表示第k个模型的权重;
  3. p(x|k) 是表示第k个模型的概率密度函数;
  4. Σp(k) = 1;

即高斯混合模型实质上就是不同的单高斯多维分布函数的加权组合

在这里插入图片描述

(二)算法基础:

2.1 最大似然估计:

假设我们手里现在有一个样本,这个样本服从某种分布,我们可以观察通过抽样得到的样本进行分析,从而估计出一个较准确的相关参数;这种通过观测来评估模型参数的方法称为最大似然估计

2.1.1 最大似然估计的基本过程:

其基本过程如下:

  1. 构造对似然函数L(θ),其中θ是分布函数的参数(未知),p是该样本观察值的概率:

在这里插入图片描述

  1. 对最大似然函数取对数:

在这里插入图片描述

  1. 求导数并令之为0(多个未知参数时求偏导):
    在这里插入图片描述

解方程得到的θ即为未知参数的最大似然估计。

2.1.2 最大似然估计的局限:

在这里插入图片描述
上面介绍了最大似然估计,可这种方法适用于不存在隐藏变量的概率模型,即所有样本的观测量都需要是已知的。

在这里插入图片描述

如果属于多个类别的样本混在了一起(如图),不同类别样本的参数不同,现在的任务是从总体中抽样,再通过抽样数据估计每个类别的分布参数;

这时就无法通过最大似然估计来估计每个分布模型的参数了(因为抽样得到的每个样本所属的分布未知),也就没有办法使用最大似然估计来预测我们的高斯混合模型了。

2.2 最大期望算法(EM算法):

这样我们就陷入了两难的境地:只有知道了哪些抽样样本是属于同一个分布的,我们才能根据最大似然函数估计这个分布的参数;同样,只有知道了不同类别样本的分布参数,才有可能判断现某个样本到底属于哪个类别的可能性更大。

这时就可以使用最大期望算法来解决;
在这里插入图片描述

2.2.1 EM算法的基本概念:

EM算法的标准计算框架由E步(Expectation-step)和M步(Maximization step)交替组成,算法的收敛性可以确保迭代至少逼近局部极大值;

直白地说,既然我们不知道样本分布和分布参数,不如:

(一)在抽样之前先给每种样本分类(即隐藏变量)依照经验赋予一个初始分布,依照分布求取隐藏变量的期望;

(二)再根据这个期望(相当于分类)计算每种分布的最大似然值,根据这个值重新计算隐藏分布的期望;

在这里插入图片描述

如此两步循环往复,等到隐藏变量的期望和最大似然值达到一个稳定的值时,就可以说我们得到了样本的分布;

那么这两步操作就分别叫做E步(Expectation-step)和M步(Maximization step),先初始化分布参数,再循环至收敛:

  1. E步:根据当前的参数值,计算样本隐藏变量的期望;
  2. M步:根据当前样本的隐藏变量,求解参数的最大似然估计;

2.2.2 EM算法的实现——初始化:

我们首先根据经验,确定使用K个(通常为5~7)个高斯模型来组成我们的高斯混合模型;对每个高斯模型,使用一组数据(μ0,k, Σ0,k0,k)来初始化分布函数。

其中:μ代表高斯分布的权重,Σ表示高斯分布标准差,π表示第k个高斯分布在K个高斯分布组成的混合模型中的权重。

2.2.3 EM算法的实现——E-Step:

对于样本Y,yt表示第t个观察的抽样样本):
在这里插入图片描述
对于每个样本,我们用γt,k(1或0)表示这个样本是否属于第k个分类(注意我们只有采样数据yt,γ未知):
在这里插入图片描述
为了求这组样本的概率,需要分两步:

  1. 第t个样本由第k个分类产生的概率是多少?
  2. 如果第t个样本由第k个分类产生,那么第k类产生第t个样本的概率为多少?

这样我们就得到了EM算法中的最大似然函数:
在这里插入图片描述
求对数得:
在这里插入图片描述这样我们只需要求得一组参数的期望(μ^\hat{μ},Σ^\hat{Σ},π^\hat{π}),使得最大似然函数的对数对这些参数的偏导为0;但是由于隐藏参数γ的存在,我们无法最大化lnp,因此就需要先对γ做一个估计:

  1. 如果是第一次运行E-Step,则使用初始化的高斯混合分布函数确定yt属于的概率最大的分类,从而预估隐藏参数γ;
  2. 如果是第 t 次运行E-Step,则使用经过t-1次迭代、参数为(μt-1,k, Σt-1,kt-1,k)高斯混合分布函数确定隐藏参数γ。

但是由于即使划分了样本并得到了γ的估计值,γ依旧不是(或者说不一定是)样本的真实分类,因此我们不最大化lnp(y,γ∣μ,Σ,π)(也无法最大化它),而是最大化Q函数:
在这里插入图片描述

其中E就是γ的估计:
在这里插入图片描述

构造Q函数的意义就在于:

有了对于γ的估计之后,Q函数只和样本有关(最大似然函数还与γ有关),而不再含有隐变量,从而使得最大化Q函数成为可能。

2.2.4 EM算法的实现——M-Step:

对Q函数进行最大化,就可以得到下一次迭代的模型参数
在这里插入图片描述

即让Q函数对参数求偏导,并令其等于零得到参数的估计值:
在这里插入图片描述

(三)高斯混合学习实现视频背景建模

3.1 论文出处:

《Effective Gaussian Mixture Learning for Video Background Subtraction》

3.2 基本思想:

高斯混合学习实现视频背景建模的基本思想就是,对视频每个点(随时间更新)使用K高斯模型建立模型,其分布认为符合高斯混合分布:

  1. 对于背景点,其像素值p分布在高斯模型的均值附近( | p - μ |<=2.5 σ) ;
  2. 对于运动目标点,其像素值p偏离均值(| p - μ |>2.5 σ);
  3. 同时,运动的物体也可能成为新的背景(比如一辆车🚗停下前认为是运动目标,停下后认为是新的背景),因此我们需要在背景分布的均值中加入运动物体的部分权重α×p,α称为学习率;
  4. 对于像素值连续分布在均值附近的高斯模型,我们认为能够较好符合期望分布,更新其均值和标准差,标准差变小,并且其权重在混合高斯模型中增加;
  5. 对于像素值分布不均匀的高斯模型,使其权重减小,并且我们认为可能需要更新分布;
  6. 如果某一点均不符合K个模型的分布,我们认为此时混合模型已经不能很好地描述背景,因此需要删除权重最小的分布,根据此时的像素点均值增加新的分布;
    在这里插入图片描述

3.3 程序框图:

论文中也给出了程序框图:
在这里插入图片描述

其中normalize的作用是使混合模型的权重和归一;

3.4 python复现代码:

3.4.1 建模程序

注意python的for循环效率很低,远远不能满足实时监控的需求,因此这里使用numpy进行操作(但依然会有许多冗余操作不可避免):

import numpy as np


class GaussianDistribution(object):

    def __init__(self, model_nums, w, gray, sigma):

        height, width = gray.shape[:2]
        tmp = np.empty((height, width), dtype=np.float)

        self.w = []  # 高斯模型权重
        for _ in range(model_nums):
            tmp.fill(w)
            self.w.append(tmp)

        self.sigma = []  # 高斯模型标准差
        for _ in range(model_nums):
            tmp.fill(sigma)
            self.sigma.append(tmp + np.random.random(tmp.shape) * sigma/10)

        self.u = []  # 高斯模型均值
        for _ in range(model_nums):
            self.u.append(gray + np.random.random(tmp.shape) * 8)

        # mask
        self.q = []
        for _ in range(model_nums):
            self.q.append(np.zeros(gray.shape, dtype=np.float))


class Mog(object):

    def __init__(self, model_num=5, alpha=2e-3, init_sigma=50, init_w=0.05, T=2.5):

        self.model_num = model_num

        self.alpha = alpha

        self.init_sigma = init_sigma

        self.min_sigma = init_sigma / 3

        self.init_w = init_w

        self.T = T

        self.init = True

        self.Foreground = None

    def apply(self, gray):

        if self.init:

            self.init_Gaussian(gray)

            self.init = False

        for m in range(self.model_num):

            mask = np.abs(
                gray - self.models.u[m]) < self.T * self.models.sigma[m]

            self.models.q[m] = mask.astype(np.float)

            mask = np.where(mask)

            # 更新参数
            self.update_parameter(mask, gray, m)

        # 舍取模型
        self.update_model(gray)

        background = np.zeros(gray.shape)
        background[self.Foreground] = 255

        return background

    def update_model(self, gray):

        pixel_scores = np.sum(
            np.stack(self.models.q, axis=-1), axis=-1
        )

        non_pos_index = np.where(pixel_scores == 0)

        self.Foreground = non_pos_index

        if non_pos_index[0].shape[0] == 0:
            return None

        stack_w = np.stack(self.models.w, axis=-1)[non_pos_index]

        min_arg = np.argmin(stack_w, axis=-1)

        for i in range(min_arg.shape[0]):

            y = non_pos_index[0][i]
            x = non_pos_index[1][i]
            m = min_arg[i]

            self.models.w[m][y, x] = self.init_w

            # self.models.u[m][y, x] = 0.2 * \
            #     gray[y, x] + 0.8 * self.models.u[m][y, x]
            self.models.u[m][y, x] = self.init_w * gray[y, x] + \
                (1 - self.init_w) * self.models.u[m][y, x]

            self.models.sigma[m][y, x] = self.init_sigma

        return None

    def update_parameter(self, mask, gray, m):

        self.models.w[m] = (1 - self.alpha) * \
            self.models.w[m] + self.alpha * self.models.q[m]

        # 模型u和sigma更新
        u = (1 - self.alpha) * \
            self.models.u[m][mask] + self.alpha * gray[mask]

        self.models.u[m][mask] = u

        sigma = self.models.sigma[m][mask]
        sigma = (1 - self.alpha) * np.square(sigma) + \
            self.alpha * np.square(gray[mask] - self.models.u[m][mask])
        sigma = np.sqrt(sigma)

        index = np.where(sigma < self.min_sigma)
        sigma[index] = self.min_sigma

        self.models.sigma[m][mask] = sigma

    def init_Gaussian(self, gray):

        self.models = GaussianDistribution(
            self.model_num, self.init_w, gray, self.init_sigma)

if __name__ == "__main__":            mog = Mog()

3.4.2 调用程序

import cv2
import numpy as np
from nms import py_cpu_nms
from time import sleep
from writing import Mog


class Detector(object):

    def __init__(self, name='my_video', frame_num=10, k_size=7, color=(0, 255, 0)):

        self.name = name

        self.color = color

    def catch_video(self, video_index=0, min_area=360):

        cap = cv2.VideoCapture(video_index)  # 创建摄像头识别类

        if not cap.isOpened():
            # 如果没有检测到摄像头,报错
            raise Exception('Check if the camera is on.')

        self.frame_num = 0

        self.mog = Mog()

        while cap.isOpened():

            mask, frame = self.gaussian_bk(cap)

            _, cnts, _ = cv2.findContours(
                mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

            bounds = [cv2.boundingRect(
                c) for c in cnts if cv2.contourArea(c) > min_area]

            for b in bounds:

                x, y, w, h = b

                thickness = (w*h)//min_area

                thickness = thickness if thickness <= 3 else 3
                thickness = thickness if thickness >= 1 else 1

                cv2.rectangle(frame, (x, y), (x+w, y+h), self.color, thickness)

            # 在window上显示背景
            # cv2.imshow(self.name+'_bk', background)
            cv2.imshow(self.name, frame)  # 在window上显示图片
            cv2.imshow(self.name+'_frame', mask)  # 边界

            cv2.waitKey(10)

            if cv2.getWindowProperty(self.name, cv2.WND_PROP_AUTOSIZE) < 1:
                # 点x退出
                break

            if cv2.getWindowProperty(self.name+'_frame', cv2.WND_PROP_AUTOSIZE) < 1:
                # 点x退出
                break

        # 释放摄像头
        cap.release()
        cv2.destroyAllWindows()

    def gaussian_bk(self, cap, k_size=3):

        catch, frame = cap.read()  # 读取每一帧图片

        if not catch:

            if self.is_camera:

                raise Exception('Unexpected Error.')

            else:

                print('The end of the video.')

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        mask = self.mog.apply(gray).astype('uint8')

        # mask = cv2.medianBlur(mask, k_size)

        return mask, frame


if __name__ == "__main__":

    detector = Detector(name='test')

    detector.catch_video('./test.avi', min_area=360)

3.5 OpenCV接口:

如果仅要求实用而不深入研究的话,也可以直接调用opencv的接口:

import cv2
import numpy as np
from nms import py_cpu_nms
from time import sleep


class Detector(object):

    def __init__(self, name='my_video', frame_num=10, k_size=7, color=(0, 255, 0)):

        self.name = name

        self.color = color

    def catch_video(self, video_index=0, min_area=360):

        cap = cv2.VideoCapture(video_index)  # 创建摄像头识别类

        if not cap.isOpened():
            # 如果没有检测到摄像头,报错
            raise Exception('Check if the camera is on.')

        self.frame_num = 0

        self.mog = cv2.createBackgroundSubtractorMOG2()

        while cap.isOpened():
            sleep(0.1)
            mask, frame = self.gaussian_bk(cap)

            _, cnts, _ = cv2.findContours(
                mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

            bounds = [cv2.boundingRect(
                c) for c in cnts if cv2.contourArea(c) > min_area]

            for b in bounds:

                x, y, w, h = b

                thickness = (w*h)//min_area

                thickness = thickness if thickness <= 3 else 3
                thickness = thickness if thickness >= 1 else 1

                cv2.rectangle(frame, (x, y), (x+w, y+h), self.color, thickness)

            # 在window上显示背景
            # cv2.imshow(self.name+'_bk', background)
            cv2.imshow(self.name, frame)  # 在window上显示图片
            cv2.imshow(self.name+'_frame', mask)  # 边界

            cv2.waitKey(10)

            if cv2.getWindowProperty(self.name, cv2.WND_PROP_AUTOSIZE) < 1:
                # 点x退出
                break

            if cv2.getWindowProperty(self.name+'_frame', cv2.WND_PROP_AUTOSIZE) < 1:
                # 点x退出
                break

        # 释放摄像头
        cap.release()
        cv2.destroyAllWindows()

    def gaussian_bk(self, cap, k_size=3):

        catch, frame = cap.read()  # 读取每一帧图片

        if not catch:

            if self.is_camera:

                raise Exception('Unexpected Error.')

            else:

                print('The end of the video.')

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        mask = self.mog.apply(gray).astype('uint8')

        mask = cv2.medianBlur(mask, k_size)

        return mask, frame


if __name__ == "__main__":

    detector = Detector(name='test')

    detector.catch_video('./test.avi', min_area=360)

(四)查看检测效果:

在这里插入图片描述

2019-07-21 18:22:20 weixin_38107271 阅读数 927
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30273 人正在学习 去看看 唐宇迪

People-Detection-and-Tracking

[Github 原文档] @Bobby Chen 记得留下小星星
在这里插入图片描述

TownCentre 行人流量计数 Demo - [ Bilibili ]

Requirement - 依赖项

  • OpenCV
  • NumPy
  • sklean
  • Pillow
  • tensorflow-gpu 1.10.0

项目算法

It uses:

* YOLOv3 to detect objects on each of the video frames. - 目标检测算法

* Deep_SORT to track those objects over different frames. - 目标追踪算法

DeepSORT 是在 SORT 目标追踪基础上的改进版本,加入了行人重识别数据集上训练的深度学习模型,在实时目标追踪过程中,提取目标的表观特征进行最近邻匹配,提高了目标追踪的鲁棒性。

This repository contains code for Simple Online and Realtime Tracking with a Deep Association Metric (Deep SORT). We extend the original SORT algorithm to integrate appearance information based on a deep appearance descriptor. See the arXiv preprint for more information.

DeepSORT Flowwork:

  • 读取当前帧目标检测框的位置及各检测框图像块的深度特征
  • 根据置信度 (confidence) 对检测框进行过滤,删除置信度不够高的检测框
  • 对所有检测框进行非最大值抑制 (non-maximum suppression),消除置信度得分 (confidence score) 低的检测框,留下最佳的目标检测框
  • 预测:使用 kalman 滤波预测目标在当前帧的位置
  • 更新:更新 kalman 追踪器参数及特征集,另外进行目标消失、新目标出现的判断

Quick Start - 快速开始

详细代码可参考 [Github 原文档] @Bobby Chen

1. 下载Git代码.

git clone https://github.com/yehengchen/Object-Detection-and-Tracking.git

2. 下载 [yolov3.weights] 并将 [ .weights] 文件放入 yolov3_sort/yolo-obj/

这里可以下载我训练的 [yolo_cc_0612.h5] 行人目标检测权重 for detection person/car/bicycle,etc.

3. 将你训练的 [ .weights ] 模型转换为 [ .h5 ] 模型:

$ python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

4. 运行 YOLO_DEEP_SORT:

$ python main.py -c [CLASS NAME] -i [INPUT VIDEO PATH]

$ python main.py -c person -i ./test_video/testvideo.avi

5. 根据需求可更换检测类别 [deep_sort_yolov3/yolo.py] 的__Line 100__行可更换参数.

DeepSORT pre-trained weights using people-ReID datasets only for person, other targets is not good

    if predicted_class != args["class"]:
               continue
    
    if predicted_class != 'person' and predicted_class != 'car':
               continue

Train on Market1501 & MARS - 目标追踪模型训练

Object Re-identification model

cosine_metric_learning for training a metric feature representation to be used with the deep_sort tracker.


Citation

YOLOv3 :

@article{yolov3,
title={YOLOv3: An Incremental Improvement},
author={Redmon, Joseph and Farhadi, Ali},
journal = {arXiv},
year={2018}
}

Deep_SORT :

@inproceedings{Wojke2017simple,
title={Simple Online and Realtime Tracking with a Deep Association Metric},
author={Wojke, Nicolai and Bewley, Alex and Paulus, Dietrich},
booktitle={2017 IEEE International Conference on Image Processing (ICIP)},
year={2017},
pages={3645--3649},
organization={IEEE},
doi={10.1109/ICIP.2017.8296962}
}

@inproceedings{Wojke2018deep,
title={Deep Cosine Metric Learning for Person Re-identification},
author={Wojke, Nicolai and Bewley, Alex},
booktitle={2018 IEEE Winter Conference on Applications of Computer Vision (WACV)},
year={2018},
pages={748--756},
organization={IEEE},
doi={10.1109/WACV.2018.00087}
}

Reference

Github:deep_sort@Nicolai Wojke nwojke
Github:deep_sort_yolov3@Qidian213
2019-07-01 15:46:56 yychentracy 阅读数 610
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30273 人正在学习 去看看 唐宇迪

多目标追踪按照轨迹生成的顺序可以分为离线的多目标追踪和在线的多目标追踪
离线的多目标追踪通常构造为图模型,设计和计算检测之间的相似度或者距离是决定图模型构造正确性的关键。在线的多目标是根据当前的检测观测,计算与已有轨迹的匹配关系。无论是离线还是在线,学习检测的特征并计算匹配相似度或者距离度量都是多目标跟踪算法的关键。基于深度学习的多目标追踪算法主要任务是优化检测之间相似性和距离度量的设计,根据学习特征的不同,基于深度学习的多目标追踪可以分为基于
基于深度表征学习的多目标跟踪,
基于深度相似性度量学习的多目标追踪
基于深度高阶特征匹配的多目标追踪
在这里插入图片描述
深度相似性度量:学习检测之间的特征相似性,比如设计深度网络计算不同检测集距离度量函数,相同目标的检测距离小,不同目标的检测距离大,从而构造检测距离的度量函数也可以设计二类分类代价,使相同目标的检测特征匹配类型为1,而不同目标的检测类型为0,从而输出0,1之间的检测匹配度。
深度高阶特征匹配:如果考虑已有轨迹与检测之间的匹配或者轨迹之间的匹配,采用深度学习的方法可以设计用来并计算轨迹之间的匹配相似度,这种方法可以认为是基于深度学习的高阶特征匹配的方法。采用深度学习计算高阶特征匹配可以学习多帧表现特征的高阶匹配相似性,也可以学习运用特征的匹配相关性。
基于Siamese对称网络的多目标追踪算法
Siamese对称网络是一种检测匹配对量学习方法,用两个尺寸相同的检测图像块作为输入,输出为两个图像块是否属于同一个目标的判别。学习过程采用经典的带有动量的随机梯度反向传播算法,minibatch大小的选择为128,学习率为0.01,Siamese网络学习完成之后,作者采永第六层全连接网络的输出作为表现特征,为了融合运动信息,又设计了6维运动的上下文特征,尺寸相对变化,位置相对变化,以及速度相对变化。
基于全连接孪生siamese-fc网路的目标追踪
Siamese-fc与之前提到的siamese cnn都采用了孪生结构,算法本身是比价搜索区域与目标模板的相似度,最后得到搜索区域的score map,从原理上来说,这种方法和相关性滤波的方法很相似,都在搜索区域里面与目标模板进行逐点匹配,siamese-fc算法将这种逐点平移匹配计算相似度的方法看成一种卷积操作了,然后在卷积结果中找到相似度最大的点,作为新的目标的中心。
MDnet的改进网络
MDNet是一种存深度的目标跟踪算法,训练时首先在每个视频中根据目标的位置使用高斯分布,均匀分布和随机分布结合的方式取样取得ROI框,提取对应图像patch,然后输入网路的最后一层,利用softmax输出目标和背景的概率,然后根据groundtruth计算loss反传,训练时仅最后一层fc根据不同类的视频而不同,而仅有前面的层共享参数,目的是学习更鲁棒的特征,检测的时候去掉最后一层,用新的fc层使用第一帧的信息finetune,MDNet缺点就是太慢,fps-40
real-time MDNet的贡献是:
1,受mask-rcnn的启发,提出一种自适应的ROIAlign
2,对损失函数进行改进,引入了一个内嵌实例的loss

自适应的ROIAlign:

如果把MDNet比作tracking版的R-CNN,那么RT-MDNet就可以近似的认为是tracking版的Mask R-CNN。

原始的MDNet像R-CNN一样,是先产生proposal,然后用proposal在原图上抠图提特征,这就会像R-CNN一样在提特征时产生很多冗余的部分,很自然的,可以像Faster那样,先提原图的特征,然后在featuremap上去找RoI,这样可以大大加快速度。但是普通的RoI
Pooling会在两次量化的过程中积累很多误差,这些误差再积累到tracking的时序上,最后很可能会让模型漂掉。所以自然的又想到了用RoI
Pooling的改进版,RoIAlign。

然而,当RoIAlign中的采样点间隔太大,会损失掉featuremap上一些有用的信息。比如,一个feature map
grid上是5×5的点,但是RoIAlign在每个grid上只采2×2共4个点,这必然会导致featuremap上的信息被丢失。所以作者根据feature
map grid的size自适应的调整网格里samplepoints的数量,来减少信息的损失。这就是自适应的ROIAlign。

对损失函数的改进:

对Loss的改进如图4所示,引入了内嵌实例的loss,使不同域的目标在特征空间的距离相互更远,这样能学到更有判别力的特征。MDNet仅仅是在每一个域中区分目标和背景,而当目标们有相似的外观时就不能有效判别不同域中的目标,所以作者loss中嵌入了其他视频中的目标来使相互之间更有判别力。这里是引用

基于时空域关注模型的多目标跟踪算法
除了解决目标重识别问题的深度网络架构检测匹配特征,还可以根据多目标跟踪场景发的特点,设计合适的深度网路模型来学习检测匹配特征,chu等人对行人多目标跟踪问题中跟踪算法发生漂移进行统计分析,发现不同行人发生交互是,互相遮挡是根据跟踪算法产生偏移的重要原因,针对这个问题,提出了时空域关注模型来学习遮挡情况,并判别出可能出现的干扰目标,空间关注墨香用于遮挡发生时的特征权重,对候选框特征加权之后,用过分类器进行选择,得到估计额目标跟踪的结果,时间关注模型加权历史样本和当前样本,从而得到甲醛的损失函数,用于在线更新模型。每个目标独立管理更新自己的时空域关注模型,并选择候选检测进行跟踪,因此本质上,这种方法是对单目标跟踪算法子啊多目标跟踪汇总扩展。为了区分不同的目标,关键的步骤是如何对遮挡状态下进行建模和区分接近的不同目标
空间注意模型用于每个时刻的遮挡状态进行分析,时间关注模型
基于LSTM判别融合表现的多目标的追踪算法
前面介绍的几个算法采用的是深度网络模型都是基于卷积网络结构,由于目标跟踪是通过历史轨迹信息来判断新的目标状态,因此设计能够记忆历史信息并根据历史信息来学习匹配相似性的网络结构,也是比较可行的算法框架。

首先,轨迹目标与检测的匹配需要用到三种特征(表观特征、运动特征、交互特征)(左);然后,采用分层的LSTM模型(中)来实现三种特征的融合;最后,通过相似度的二部图匹配算法实现最终的匹配结果(右)。

在这里插入图片描述
总结
目前的基于深度学习的多目标跟踪框架在以下的两个方向都取得的较好的进展
1)结合多目标跟踪场景对网络进行悠哈,这种考虑跟踪场景的网络设计对于跟踪结果有明显的提升效果
2)采用循环神经网络,利用历史信息来表达跟踪中的轨迹特征,这是跟踪问题的有一二重要的研究方向

计算机视觉life https://mp.weixin.qq.com/s?__biz=MzIxOTczOTM4NA==&mid=2247487882&idx=1&sn=72129a00bc51263e1f1993295302c5f7&chksm=97d7f41da0a07d0bb6e21c4a95f64d3120fce4a5980b767f836f8e99241b3d6d2b5a9d64ebc6&mpshare=1&scene=1&srcid=0626M6bXpxhCwWmknZsiCfuL&key=64b5b2c11d4b7b9ace5b3a68e57793828fe57a4e16e068ef182074e354913b7ff3d10669cfb411998ea03356363d6dbf71d3518597e55b1e847e9664abfbaf979bfdfd900c8384dd7c3addf7bbb69ee0&ascene=1&uin=MjE2MjUxNzI0NA%3D%3D&devicetype=Windows+10&version=62060739&lang=zh_CN&pass_ticket=1SvJVFD%2FRFnvPRygJ1Fwsf5%2Fe7N79wbEfqXS4v069Z9Ve5J%2FqlBOcusyV7Rplr%2BN。

2018-11-15 07:50:00 hestendelin 阅读数 8
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30273 人正在学习 去看看 唐宇迪

[1] Hierarchical Convolutional Features for Visual Tracking

Chao Ma et al.

SJTU

ICCV 2015

https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Ma_Hierarchical_Convolutional_Features_ICCV_2015_paper.pdf

本文的主要步骤示例如下

640?wx_fmt=png

卷积层可视化示例如下

640?wx_fmt=png

本文所提算法伪代码示例如下

640?wx_fmt=png

其中(1)式及符号解释如下

640?wx_fmt=png

(4)式及符号解释如下

640?wx_fmt=png

(5)式及符号解释如下

640?wx_fmt=png

(6)式及符号解释如下

640?wx_fmt=png

各方法效果比较如下

640?wx_fmt=png

代码地址

https://github.com/jbhuang0604/CF2


              smiley_12.png我是分割线smiley_12.png


[2] Visual Tracking with Fully Convolutional Networks

Lijun Wang et al.

Dalian University of Technology

ICCV 2015

https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Wang_Visual_Tracking_With_ICCV_2015_paper.pdf

目标定位的特征映射示例如下

640?wx_fmt=png

CNN用于图像分类时可以携带空间信息的示例如下

640?wx_fmt=png

算法整体流程示例如下

640?wx_fmt=png

对应的文字描述为

640?wx_fmt=png

各方法效果对比如下

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

https://github.com/scott89/FCNT


              smiley_12.png我是分割线smiley_12.png


[3] Learning Multi-Domain Convolutional Neural Networks for Visual Tracking

Hyeonseob Nam, Bohyung Han

POSTECH

CVPR 2016

https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Nam_Learning_Multi-Domain_Convolutional_CVPR_2016_paper.pdf

多领域网络结构示例如下

640?wx_fmt=png

算法伪代码示例如下

640?wx_fmt=png

各方法效果对比如下

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

代码地址

http: //cvlab.postech.ac.kr/research/mdnet/

https://github.com/HyeonseobNam/MDNet


               smiley_12.png我是分割线smiley_12.png


[4] Deep Tracking: Seeing Beyond Seeing Using Recurrent Neural Networks

Peter Ondru´ska

University of Oxford

AAAI 2016

http://www.robots.ox.ac.uk/~mobile/Papers/2016AAAI_ondruska.pdf

RNN滤波图解如下

640?wx_fmt=png

4层的循环神经网络示例如下

640?wx_fmt=png

代码地址

https://github.com/pondruska/DeepTracking


              smiley_12.png我是分割线smiley_12.png


[5] ECO: Efficient Convolution Operators for Tracking

Martin Danelljan et al.

Linkoping University

CVPR 2017

http://openaccess.thecvf.com/content_cvpr_2017/papers/Danelljan_ECO_Efficient_Convolution_CVPR_2017_paper.pdf

各方法效果对比如下

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

代码地址

https://github.com/martin-danelljan/ECO


            smiley_12.png我是分割线smiley_12.png


您可能感兴趣

没有更多推荐了,返回首页