行人計數(shù)分析 deepsort--track.py

這個模塊主要是用于跟蹤算法的粘捎,用的是kalman filter+級聯(lián)檢測目標,基本算法是畫軌跡丘侠,根據(jù)軌跡的情況徒欣,判斷是否新的id,比如軌跡斷開了30幀以上婉陷,判斷這個軌跡delete了帚称;(如果我躲在樹后面幾分鐘再出來,會不會判斷我是兩個人秽澳? 不會闯睹,除了軌跡的級聯(lián)匹配,還用到了tf的特征判斷担神,會把每個人的特征cache保存下來楼吃,用來比較是否兩個人,一個id對應(yīng)一個特征妄讯,再用tensorflow進行相似度比較孩锡,tensorflow的數(shù)據(jù)集釋Mars的,有100W張圖片亥贸,ID SW的錯誤比較低躬窜,除非是模糊的人像 )

# vim: expandtab:ts=4:sw=4

#單個目標跟蹤狀態(tài)的枚舉類型。
新建的跟蹤是被歸類為“暫定”直到收集到足夠的證據(jù)炕置。
然后荣挨,軌道狀態(tài)更改為“確認”男韧。
不再活著的軌跡被分類為'刪除',以標記他們從一組活躍刪除默垄。

class TrackState:
    """
    Enumeration type for the single target track state. Newly created tracks are
    classified as `tentative` until enough evidence has been collected. Then,
    the track state is changed to `confirmed`. Tracks that are no longer alive
    are classified as `deleted` to mark them for removal from the set of active
    tracks.

    """
# 三種狀態(tài)   嘗試性的此虑,確定的,被刪除的
    Tentative = 1
    Confirmed = 2
    Deleted = 3


class Track:
    """
    # 具有狀態(tài)空間的單個目標軌道(x口锭,y朦前,A,H)和相關(guān)聯(lián)速度鹃操,
      其中“(x韭寸,y)”是bbox的中心,A是高寬比和“H”是高度组民。
    
    A single target track with state space `(x, y, a, h)` and associated
    velocities, where `(x, y)` is the center of the bounding box, `a` is the
    aspect ratio and `h` is the height.

    Parameters
    ----------
mean :
        # 初始狀態(tài)分布的平均向量棒仍。
        Mean vector of the initial state distribution.

covariance :  #協(xié)方差
        # 初始狀態(tài)分布的協(xié)方差矩陣
        Covariance matrix of the initial state distribution.

track_id : int
        # 唯一的軌跡ID
        A unique track identifier.
    
n_init : int
        # 在軌道設(shè)置為confirmed之前的連續(xù)檢測幀數(shù)。
        當一個miss發(fā)生時臭胜,軌道狀態(tài)設(shè)置為Deleted幀莫其。
        Number of consecutive detections before the track is confirmed. 
The track state is set to `Deleted` if a miss occurs within the first
 `n_init` frames.
    
max_age : int
        # 在偵測狀態(tài)設(shè)置成Deleted前,最大的連續(xù)miss數(shù)耸三。
        The maximum number of consecutive misses before the track state is set to `Deleted`.

feature : Optional[ndarray]
        # 特征向量檢測的這條軌道的起源乱陡。
          如果為空,則這個特性被添加到'特性'緩存中仪壮。
        Feature vector of the detection this track originates from. If not None,
        this feature is added to the `features` cache.

trackid:
      軌跡ID憨颠。
---------
Attributes #屬性
   
 mean : ndarray  #均值:
        # 初始分布均值向量。
        Mean vector of the initial state distribution.
   
 covariance : ndarray  # 協(xié)方差:
       # 初始分布協(xié)方差矩陣积锅。
        Covariance matrix of the initial state distribution.
   
 track_id : int
        A unique track identifier.
   
 hits : int
        #測量更新的總數(shù)爽彤。
        Total number of measurement updates.
   
 hit_streak : int
        # 自上次miss之后,連續(xù)測量更新的總數(shù)缚陷。(更新一次+1)
        Total number of consective measurement updates since last miss.
    age : int
        #從開始的總幀數(shù)
        Total number of frames since first occurance.

    time_since_update : int
        # 從上次的測量更新完后适篙,統(tǒng)計的總幀數(shù)
        Total number of frames since last measurement update.

  state : TrackState
        # 當前的偵測狀態(tài)
        The current track state.
   
 features : List[ndarray]
        # 特性的緩存。在每個度量更新中箫爷,相關(guān)的特性
向量添加到這個列表中嚷节。
        A cache of features. On each measurement update, the associated feature
        vector is added to this list.

    """
# 初始化各參數(shù)
    def __init__(self, mean, covariance, track_id, n_init, max_age,
                 feature=None):
        self.mean = mean
        self.covariance = covariance
        self.track_id = track_id
        self.hits = 1
        self.hit_streak = 1
        self.age = 1
        self.time_since_update = 0

        self.state = TrackState.Tentative
        self.features = []
        if feature is not None:
            self.features.append(feature)

        self._n_init = n_init
        self._max_age = max_age

# 將bbox轉(zhuǎn)換成xywh
    def to_tlwh(self):
        """Get current position in bounding box format `(top left x, top left y,
        width, height)`.

        Returns
        -------
        ndarray
            The bounding box.

        """
        ret = self.mean[:4].copy()
        ret[2] *= ret[3]
        ret[:2] -= ret[2:] / 2
        return ret

# 獲取當前位置以某種格式,不太明白
    def to_tlbr(self):
        """Get current position in bounding box format `(min x, miny, max x, max y)`.

        Returns
        -------
        ndarray
            The bounding box.

        """
        ret = self.to_tlwh()
        ret[2:] = ret[:2] + ret[2:]
        return ret

# 預(yù)測虎锚,基于kalman filter
    def predict(self, kf):
        """Propagate the state distribution to the current time step using a
        Kalman filter prediction step.

        Parameters
        ----------
        kf : kalman_filter.KalmanFilter
            The Kalman filter.

        """
        self.mean, self.covariance = kf.predict(self.mean, self.covariance)
        self.age += 1
        self.time_since_update += 1

# 更新硫痰。 主要是步進和特征,檢測方法為級聯(lián)檢測
    def update(self, kf, detection):
        """Perform Kalman filter measurement update step and update the feature
        cache.

        Parameters
        ----------
        kf : kalman_filter.KalmanFilter
            The Kalman filter.
        detection : Detection
            The associated detection.

        """
        self.mean, self.covariance = kf.update(
            self.mean, self.covariance, detection.to_xyah())
        self.features.append(detection.feature)

        self.hit_streak += 1
        self.hits += 1
        self.time_since_update = 0
        if self.state == TrackState.Tentative and self.hits >= self._n_init:
            self.state = TrackState.Confirmed

# 標記已經(jīng)miss的窜护,如果從更新起miss了_max_age(30)幀以上效斑,
設(shè)置為Deleted
    def mark_missed(self):
        """Mark this track as missed (no association at the current time step).
        """
        if self.state == TrackState.Tentative:
            self.state = TrackState.Deleted
        elif self.time_since_update > self._max_age:
            self.state = TrackState.Deleted
        self.hit_streak = 0

# 設(shè)置三種狀態(tài)
    def is_tentative(self):
        """Returns True if this track is tentative (unconfirmed).
        """
        return self.state == TrackState.Tentative

    def is_confirmed(self):
        """Returns True if this track is confirmed."""
        return self.state == TrackState.Confirmed

    def is_deleted(self):
        """Returns True if this track is dead and should be deleted."""
        return self.state == TrackState.Deleted

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柱徙,隨后出現(xiàn)的幾起案子鳍悠,更是在濱河造成了極大的恐慌税娜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏研,死亡現(xiàn)場離奇詭異,居然都是意外死亡概行,警方通過查閱死者的電腦和手機蠢挡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凳忙,“玉大人业踏,你說我怎么就攤上這事〗眩” “怎么了勤家?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柳恐。 經(jīng)常有香客問我伐脖,道長,這世上最難降的妖魔是什么乐设? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任讼庇,我火速辦了婚禮,結(jié)果婚禮上近尚,老公的妹妹穿的比我還像新娘蠕啄。我一直安慰自己,他們只是感情好戈锻,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布歼跟。 她就那樣靜靜地躺著,像睡著了一般格遭。 火紅的嫁衣襯著肌膚如雪哈街。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天如庭,我揣著相機與錄音叹卷,去河邊找鬼。 笑死坪它,一個胖子當著我的面吹牛骤竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播往毡,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蒙揣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了开瞭?” 一聲冷哼從身側(cè)響起懒震,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤罩息,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后个扰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓷炮,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年递宅,在試婚紗的時候發(fā)現(xiàn)自己被綠了娘香。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡办龄,死狀恐怖烘绽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俐填,我是刑警寧澤安接,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站英融,受9級特大地震影響盏檐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矢赁,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一糯笙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撩银,春花似錦给涕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抄邀,卻和暖如春耘眨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背境肾。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工剔难, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奥喻。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓偶宫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親环鲤。 傳聞我的和親對象是個殘疾皇子纯趋,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 階段一、人工智能基礎(chǔ) — 高等數(shù)學必知必會 本階段主要從數(shù)據(jù)分析、概率論和線性代數(shù)及矩陣和凸優(yōu)化這四大塊講解基礎(chǔ)吵冒,...
    每天都有新的太陽閱讀 1,488評論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理纯命,服務(wù)發(fā)現(xiàn),斷路器痹栖,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Machinarium(機械迷城)由瑞典游戲開發(fā)公司Amanita Design于2009年開發(fā)的一款解謎游戲亿汞,游...
    暗影M_Shadow閱讀 713評論 0 3
  • 辭職后創(chuàng)業(yè)留夜,到現(xiàn)在已經(jīng)一年多了。在這一年的時間了發(fā)生過很多的事情图甜,我也想在這個時間好好的總結(jié)以下我創(chuàng)業(yè)這1年來的大...
    職場邏輯閱讀 695評論 4 16
  • 我只想努力的看看這個世界 看遍每一朵鮮花 體會不同的生活; 我就想盡情的愛一次 用力的痛一次鳖眼; 我啊黑毅,就只是想知道...
    踏著朝陽閱讀 209評論 0 3