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

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

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

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

博文概述如下:

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

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

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

博文结构: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 阅读数 1464
  • 深度学习框架Tensorflow案例实战视频课程

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

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

论文地址:
《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)

(四)查看检测效果:

在这里插入图片描述

2018-08-09 13:52:00 weixin_42419002 阅读数 896
  • 深度学习框架Tensorflow案例实战视频课程

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

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

基于深度学习的目标跟踪

链接:

基于深度学习的目标检测

基于深度学习的目标检测综述

目标检测算法汇聚

目标检测算法总结

10行代码实现目标检测

深度学习目标检测

综述(作者的个人理解 一刀流)

TensorFlow实现的目标检测(有github)

目标检测算法简介,都是文字

内容摘要:R-CNN是Region-based Convolutional Neural Networks的缩写,中文翻译是基于区域的卷积神经网络,是一种结合区域提名(Region Proposal)和卷积神经网络(CNN)的目标检测方法。Ross Girshick在2013年的开山之作《Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation》[1]奠定了这个子领域的基础,这篇论文后续版本发表在CVPR 2014[2],期刊版本发表在PAMI 2015[3]。

其实在R-CNN之前已经有很多研究者尝试用Deep Learning的方法来做目标检测了,包括OverFeat[7],但R-CNN是第一个真正可以工业级应用的解决方案,这也和深度学习本身的发展类似,神经网络、卷积网络都不是什么新概念,但在本世纪突然真正变得可行,而一旦可行之后再迅猛发展也不足为奇了。

R-CNN这个领域目前研究非常活跃,先后出现了R-CNN[1,2,3,18]、SPP-net[4,19]、Fast R-CNN[14, 20] 、Faster R-CNN[5,21]、R-FCN[16,24]、YOLO[15,22]、SSD[17,23]等研究。Ross Girshick作为这个领域的开山鼻祖总是神一样的存在,R-CNN、Fast R-CNN、Faster R-CNN、YOLO都和他有关。这些创新的工作其实很多时候是把一些传统视觉领域的方法和深度学习结合起来了,比如选择性搜索(Selective Search)和图像金字塔(Pyramid)等。

第一步是要做区域提名(Region Proposal):找出可能的感兴趣区域(Region Of Interest, ROI)

一、滑动窗口:本质上就是穷举法(不同的尺度和长宽比把所有可能的大大小小的块都穷举出来,然后送去识别),复杂度太高,产生了很多的冗余候选区域,在现实当中不可行。

二、规则块:穷举法的基础上进行了一些剪枝,只选用固定的大小和长宽比,对于普通的目标检测来说,规则块依然需要访问很多的位置,复杂度高。

三、选择性搜索:核心在于如何有效地去除冗余候选区域(其实冗余候选区域大多是发生了重叠)。方法:自底向上合并相邻的重叠区域,从而减少冗余。        选择性搜索采用多样性策略来增加候选区域以保证召回,比如颜色空间考虑RGB、灰度、HSV及其变种等,相似度计算时既考虑颜色相似度,又考虑纹理、大小、重叠情况等。

总体上,选择性搜索是一种比较朴素的区域提名方法,被早期的基于深度学习的目标检测方法(包括Overfeat和R-CNN等)广泛利用,但被当前的新方法弃用了。

OverFeat是用CNN统一来做分类、定位和检测的经典之作,作者是深度学习大神之一————Yann Lecun在纽约大学的团队。OverFeat也是ILSVRC 2013任务3(分类+定位)的冠军得主[10]。

Overfeat是CNN用来做目标检测的早期工作,主要思想是采用了多尺度滑动窗口来做分类、定位和检测,虽然是多个任务但重用了模型前面几层,这种模型重用的思路也是后来R-CNN系列不断沿用和改进的经典做法。

当然Overfeat也是有不少缺点的,至少速度和效果都有很大改进空间,后面的R-CNN系列在这两方面做了很多提升。

基于区域提名的方法,包括R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN。

1.R-CNN:Overfeat可以看做是R-CNN的一个特殊情况,只需要把Selective Search(RCNN)换成多尺度的滑动窗口(Overfeat),每个类别的边框回归器换成统一的边框回归器,SVM换为多层网络即可。但是Overfeat实际比R-CNN快9倍,这主要得益于卷积相关的共享计算。

事实上,R-CNN有很多缺点:重复计算,SVM模型,训练测试分为多步,训练的空间和时间代价很高,(GPU上处理一张图片需要13秒,CPU上则需要53秒)

R-CNN效果好,其中ILSVRC 2013数据集上的mAP由Overfeat的24.3%提升到了31.4%,第一次有了质的改变。

2.Fast R-CNN是要解决R-CNN和SPP-net两千个左右候选框带来的重复计算问题,其主要思想为:使用一个简化的SPP层,训练和测试是不再分多步,SVD

Fast R-CNN比R-CNN的训练速度(大模型L)快8.8倍,测试时间快213倍,比SPP-net训练速度快2.6倍,测试速度快10倍左右。

3.Faster R-CNN则直接利用RPN(Region Proposal Networks)网络来计算候选框,抛弃了Selective Search,引入了RPN网络,使得区域提名、分类、回归一起共用卷积特征,从而得到了进一步的加速。但是,Faster R-CNN需要对两万个Anchor Box先判断是否是目标(目标判定),然后再进行目标识别,分成了两步。

4.R-FCN则将目标检测最后的全连接层之类换为了一个位置敏感的的卷积网络,从而让所有计算都可以共享。

端到端(End-to-End)的目标检测方法,这些方法无需区域提名,包括YOLO和SSD

YOLO的全拼是You Only Look Once,顾名思义就是只看一次,进一步把目标判定和目标识别合二为一,所以识别性能有了很大提升,达到每秒45帧,而在快速版YOLO(Fast YOLO,卷积层更少)中,可以达到每秒155帧。

 

posted @ 2018-08-09 13:52 YangZhaonan 阅读(...) 评论(...) 编辑 收藏

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

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

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

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
2018-11-15 07:50:00 hestendelin 阅读数 23
  • 深度学习框架Tensorflow案例实战视频课程

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

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

[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


您可能感兴趣

多目标追踪

阅读数 863

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