目标跟踪(1)SORT Windows实战+代码解析

2023-11-09

1.Windows实战

  1. 下载代码,解压文件
  2. 安装SORT所需的环境
    进入到sort环境下
pip install -r requirements.txt

在这里插入图片描述

  1. 有两种使用方式
    (1)不基于视频
 python sort.py

(2)基于视频

  1. 下载视频
    在这里插入图片描述

  2. 在windows中移动到sort-master里面就行

python sort.py --display

检测效果:在这里插入图片描述

2.代码解析

2.1 det.txt文件

在这里插入图片描述
每行都是10个数,含义如图
在这里插入图片描述
即第一个值表示目标出现在第几帧;
第二个值表示目标的ID号,在目标信息文件中都为-1;
第三到第六个值为标注bounding box的坐标尺寸值,即bounding box的左上坐标及宽高;
第七个值为目标检测表示的置信度得分(confidence score);
第八到第十个值表示行人实际坐标中的3D位置,在2D追踪的情况下,这些值将被忽略并设置为-1。
【参考文档】多目标跟踪数据集格式介绍(MOTChallenge)

2.2 main

然后sort.py从main开始整体理解一下

if __name__ == '__main__':
  # all train
  args = parse_args()
  display = args.display
  phase = args.phase
  total_time = 0.0
  total_frames = 0

#-----------视频实际处理展示-----------------------
  colours = np.random.rand(32, 3) #选择随机颜色用于展示 used only for display
  if(display):
    if not os.path.exists('mot_benchmark'):#检查当前路径上是否存在mot_benchmark文件
      print('\n\tERROR: mot_benchmark link not found!\n\n    Create a symbolic link to the MOT benchmark\n    (https://motchallenge.net/data/2D_MOT_2015/#download). E.g.:\n\n    $ ln -s /path/to/MOT2015_challenge/2DMOT2015 mot_benchmark\n\n')
      exit()
    plt.ion()
    fig = plt.figure()
    ax1 = fig.add_subplot(111, aspect='equal')
# ----------------------------------

#创建output文件夹
  if not os.path.exists('output'):
    os.makedirs('output')

  pattern = os.path.join(args.seq_path, phase, '*', 'det', 'det.txt')
        #默认情况下是  sort-master下的data, data下的train,全部文件
        #默认的最终的路径是 data/train/ * /det/det.txt

  for seq_dets_fn in glob.glob(pattern):#遍历路径下的所有的det.txt文件
    mot_tracker = Sort(max_age=args.max_age, 
                       min_hits=args.min_hits,
                       iou_threshold=args.iou_threshold) #创建SORT实例create instance of the SORT tracker

    seq_dets = np.loadtxt(seq_dets_fn, delimiter=',')#读取文件,第一个维度整个文件 第二个维度是每一个逗号分隔的每一列
    # print(seq_dets)

    seq = seq_dets_fn[pattern.find('*'):].split(os.path.sep)[0]#获得train下面的文件名(e.g. ADL-Rundle-6...)
    #相对路径是 data/train/ * /det/det.txt
    #seq_dets_fn[pattern.find('*'):]------->  */det/det.txt  ---split后取*的部分-------> *(e.g. ADL-Rundle-6...)
    
    with open(os.path.join('output', '%s.txt'%(seq)),'w') as out_file:#顺便把output/ * 文件创建了
      print("Processing %s."%(seq))

      for frame in range(int(seq_dets[:,0].max())):

        # print(seq_dets[:, 2])
        frame += 1 #检测和帧数都从1开始 detection and frame numbers begin at 1

        dets = seq_dets[seq_dets[:, 0]==frame, 2:7]
        #1,-1,1689,385,146.62,332.71,67.567,-1,-1,-1
        #       2   3     4     5     6(conference)
        # 1689, 385, 146.62, 332.71, 67.567
        dets[:, 2:4] += dets[:, 0:2] #转化坐标格式(右下=左上+长宽)convert to [x1,y1,w,h] to [x1,y1,x2,y2]
        total_frames += 1

        if(display):
          fn = os.path.join('mot_benchmark', phase, seq, 'img1', '%06d.jpg'%(frame))
          im =io.imread(fn)
          ax1.imshow(im)
          plt.title(seq + ' Tracked Targets')

        start_time = time.time()
        trackers = mot_tracker.update(dets)
        cycle_time = time.time() - start_time
        total_time += cycle_time

        for d in trackers:
          print('%d,%d,%.2f,%.2f,%.2f,%.2f,1,-1,-1,-1'%(frame,d[4],d[0],d[1],d[2]-d[0],d[3]-d[1]),file=out_file)
          if(display):
            d = d.astype(np.int32)
            ax1.add_patch(patches.Rectangle((d[0],d[1]),d[2]-d[0],d[3]-d[1],fill=False,lw=3,ec=colours[d[4]%32,:]))

        #---图片每一帧进行处理--------------
        if(display):
          fig.canvas.flush_events()
          plt.draw()
          ax1.cla()
        # -----------------

  print("Total Tracking took: %.3f seconds for %d frames or %.1f FPS" % (total_time, total_frames, total_frames / total_time))

  if(display):
    print("Note: to get real runtime results run without the option: --display")

2.2.1 维度信息

seq_dets
在这里插入图片描述
这是第一个文件中的维度信息,第一个维度就是整个文件所有行,第二个维度就是每一行的所有项

2.2.2 核心

创建SORT实例

    mot_tracker = Sort(max_age=args.max_age, 
                       min_hits=args.min_hits,
                       iou_threshold=args.iou_threshold)

更新

trackers = mot_tracker.update(dets)

2.2 sort

主要是包括这两个方法

class Sort(object):
  def __init__(self, max_age=1, min_hits=3, iou_threshold=0.3):
  def update(self, dets=np.empty((0, 5))):

2.2.1 _init _

初始化一些变量

  def __init__(self, max_age=1, min_hits=3, iou_threshold=0.3):
    """
    Sets key parameters for SORT
    """
    self.max_age = max_age  # 最大年龄值(未被检测更新的跟踪器随帧数增加),超过之后会被删除
    self.min_hits = min_hits # 目标命中的最小次数,小于该次数不返回
    self.iou_threshold = iou_threshold
    self.trackers = [] # KalmanBoxTracker类型
    self.frame_count = 0
2.2.1.1 KalmanBoxTracker类型
#-------KalmanBoxTracker------------
class KalmanBoxTracker(object):
  """
  此类表示作为bbox观察到的单个跟踪对象的内部状态。This class represents the internal state of individual tracked objects observed as bbox.
  """
  count = 0
  def __init__(self,bbox):
    """
    使用初始边界框初始化跟踪器。
    Initialises a tracker using initial bounding box.
    """
    #定义等速模型define constant velocity model
    
    基本参数

    self.kf.x[:4] = convert_bbox_to_z(bbox)
    self.time_since_update = 0
    self.id = KalmanBoxTracker.count
    KalmanBoxTracker.count += 1
    self.history = []
    self.hits = 0
    self.hit_streak = 0
    self.age = 0

  def update(self,bbox):
    """
    Updates the state vector with observed bbox.
    """
    self.time_since_update = 0
    self.history = []
    self.hits += 1
    self.hit_streak += 1
    self.kf.update(convert_bbox_to_z(bbox))

    """
      update(bbox):使用观测到的目标框bbox更新状态更新向量x(状态变量x)
      1.time_since_update = 0
              1.连续预测的次数,每执行predict一次即进行time_since_update+=12.在连续预测(连续执行predict)的过程中,一旦执行update的话,time_since_update就会被重置为02.在连续预测(连续执行predict)的过程中,只要连续预测的次数time_since_update大于0的话,
                就会把hit_streak(连续更新的次数)重置为0,表示连续预测的过程中没有出现过一次更新状态更新向量x(状态变量x)的操作,
                即连续预测的过程中没有执行过一次update。
      2.history = []      
             清空history列表。
             history列表保存的是单个目标框连续预测的多个结果([x,y,s,r]转换后的[x1,y1,x2,y2]),一旦执行update就会清空history列表。
      3.hits += 1:
              该目标框进行更新的总次数。每执行update一次,便hits+=14.hit_streak += 1
              1.连续更新的次数,每执行update一次即进行hit_streak+=12.在连续更新(连续执行update)的过程中,一旦开始连续执行predict两次或以上的情况下,
                当连续第一次执行predict时,因为time_since_update仍然为0,并不会把hit_streak重置为0,
                然后才会进行time_since_update+=1;
                当连续第二次执行predict时,因为time_since_update已经为1,那么便会把hit_streak重置为0,
                然后继续进行time_since_update+=15.kf.update(convert_bbox_to_z(bbox))
              convert_bbox_to_z负责将[x1,y1,x2,y2]形式的检测框转为滤波器的状态表示形式[x,y,s,r],那么传入的为kf.update([x,y,s,r])。
              然后根据观测结果修改内部状态x(状态更新向量x)。
              使用的是通过yoloV3得到的“并且和预测框相匹配的”检测框来更新卡尔曼滤波器得到的预测框。
      """

  def predict(self):
    """
    推进状态向量并返回预测的边界框估计值。
    Advances the state vector and returns the predicted bounding box estimate.
    """


  def get_state(self):
    """
    返回当前边界框估计值。 Returns the current bounding box estimate.
    """
    return convert_x_to_bbox(self.kf.x)
#------------------------------------------

2.2.2 update

【参考文档】多目标追踪
原文是使用yolov3进行识别的,我们主要截取sort部分进行理解
在这里插入图片描述

  def update(self, dets=np.empty((0, 5))):
    """
    Params:
      dets - a numpy array of detections in the format [[x1,y1,x2,y2,score],[x1,y1,x2,y2,score],...]
    Requires: this method must be called once for each frame even with empty detections (use np.empty((0, 5)) for frames without detections).
    Returns the a similar array, where the last column is the object ID.
    一个numpy检测数组,格式为[[x1,y1,x2,y2,score][x1、y1、x2、y2,score],…]
    要求:即使检测为空,也必须为每个帧调用一次此方法(对于没有检测的帧,使用np.empty((05)))。
    返回一个类似的数组,其中最后一列是对象ID。

    NOTE: The number of objects returned may differ from the number of detections provided.
    注意:返回的对象数可能与提供的检测数不同。
    """
    self.frame_count += 1
#----------step1 从现有跟踪器获取预测位置(卡尔曼滤波预测)------------------ get predicted locations from existing trackers.
    trks = np.zeros((len(self.trackers), 5))# 生成一个len(self.trackers)* 5的矩阵
    to_del = []#想要删除的文件                # 5 代表 x1,x2,y1,y2,confidence ,从main的dets = seq_dets[seq_dets[:, 0]==frame, 2:7]传入
    ret = [] #最终会输出的
    for t, trk in enumerate(trks):#遍历现存的每一个追踪器使用卡尔曼滤波预测位置
      pos = self.trackers[t].predict()[0]
      trk[:] = [pos[0], pos[1], pos[2], pos[3], 0]
      if np.any(np.isnan(pos)):# any:测试沿给定轴的任何数组元素的计算结果是否为True。除非`axis`不是``None,否则返回单个布尔值``
        to_del.append(t)

    # numpy.ma.masked_invalid 屏蔽出现无效值的数组(NaN 或 inf)
    # numpy.ma.compress_rows 压缩包含掩码值的2-D 数组的整行,将包含掩码值的整行去除
    # trks中存储了上一帧中跟踪的目标并且在当前帧中的预测跟踪框
    trks = np.ma.compress_rows(np.ma.masked_invalid(trks))

    for t in reversed(to_del): # 逆向删除异常的跟踪器,防止破坏索引
      self.trackers.pop(t)
      # 将目标检测框与卡尔曼滤波器预测的跟踪框关联获取跟踪成功的目标,新增的目标,离开画面的目标
    matched, unmatched_dets, unmatched_trks = associate_detections_to_trackers(dets,trks, self.iou_threshold)

#----------step2 用指定的检测器更新匹配的跟踪器------update matched trackers with assigned detections
    for m in matched:
      self.trackers[m[1]].update(dets[m[0], :])#卡尔曼滤波更新

#----------step3创建并初始化新的跟踪器以进行不匹配的检测------------create and initialise new trackers for unmatched detections
    for i in unmatched_dets:
        trk = KalmanBoxTracker(dets[i,:])
        self.trackers.append(trk)#对于每一个新的检测目标维护一个卡尔曼滤波
    i = len(self.trackers)
    for trk in reversed(self.trackers):
        d = trk.get_state()[0]
        if (trk.time_since_update < 1) and (trk.hit_streak >= self.min_hits or self.frame_count <= self.min_hits):
          ret.append(np.concatenate((d,[trk.id+1])).reshape(1,-1)) # +1,因为MOT(多目标跟踪)基准要求积为正 +1 as MOT benchmark requires positive
        i -= 1
        # remove dead tracklet
        if(trk.time_since_update > self.max_age):
          self.trackers.pop(i)
    if(len(ret)>0):
      return np.concatenate(ret)
    return np.empty((0,5))
2.2.2.1 associate_detections_to_trackers

将检测指定给跟踪对象(均表示为边界框)

def associate_detections_to_trackers(detections,trackers,iou_threshold = 0.3):
  """
  Assigns detections to tracked object (both represented as bounding boxes)
  将检测指定给跟踪对象(均表示为边界框)
  Returns 3 lists of matches, unmatched_detections and unmatched_trackers
  返回匹配项、unmatched_detections和unmatched_tracker的3个列表
  """
  #如果没有追踪到
  if(len(trackers)==0):
    return np.empty((0,2),dtype=int), np.arange(len(detections)), np.empty((0,5),dtype=int)

#-----step1 获得 追踪器 和 检测目标 的 iou-----------------------------------
  iou_matrix = iou_batch(detections, trackers)#计算目标和追踪器预测的位置的iou
                        #trackers:len(self.trackers)* 5类型的数组(detections同理)
  #和普通iou的区别:(1)传入的是不只一个对象,可以理解为一个二维数组 (2)传入对象是(x1,y1,x2,y2)
#-----------------------------------------

#---------step2 获得匹配索引------------------------------------
  if min(iou_matrix.shape) > 0:#存在检测对象
    a = (iou_matrix > iou_threshold).astype(np.int32)#将bool类型转化int
    # a 是一个(检测对象数量 * 追踪器数量)的矩阵---->1可以理解为(检测对象和追踪器)匹配到了

    if a.sum(1).max() == 1 and a.sum(0).max() == 1:#有且仅有一个对象而且被匹配到了
        matched_indices = np.stack(np.where(a), axis=1)#stack:沿新轴连接一系列数组。 # where :根据“condition”返回从“x”或“y”中选择的元素。
        #matched_indices第0维代表检测对象对象,第1维代表追踪对象

    else: #存在多个对象而且被追踪到了
      matched_indices = linear_assignment(-iou_matrix)
  else:
    matched_indices = np.empty(shape=(0,2))#不存在检测对象
# ---------------------------------------------

 # -----step3 未匹配的 新检测目标&追踪器  -----------------------------------
  unmatched_detections = [] #未匹配的新检测目标
  for d, det in enumerate(detections):
    if(d not in matched_indices[:,0]):
      unmatched_detections.append(d)

  unmatched_trackers = [] #未匹配的追踪器
  for t, trk in enumerate(trackers):
    if(t not in matched_indices[:,1]):
      unmatched_trackers.append(t)
  # ---------------------------------------------


  #滤波器输出与低IOU匹配 filter out matched with low IOU
  matches = []
  for m in matched_indices:
    if(iou_matrix[m[0], m[1]]<iou_threshold):
      unmatched_detections.append(m[0])#第0维代表 检测对象对象
      unmatched_trackers.append(m[1])#第1维代表追踪对象
    else:
      matches.append(m.reshape(1,2))#匹配上的
  if(len(matches)==0):
    matches = np.empty((0,2),dtype=int)
  else:
    print(matches) #array([[0, 0]], dtype=int64)
    matches = np.concatenate(matches,axis=0)# 去掉其他信息
    #print(matches)#[0 0]

  return matches, np.array(unmatched_detections), np.array(unmatched_trackers)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标跟踪(1)SORT Windows实战+代码解析 的相关文章

  • BEV基础

    在计算机视觉领域中 BEV Bird s Eye View 是一种常见的数据表示方式 用于处理车辆或行人的感知和决策任务 BEV基础涉及一些常见的BEV相关算法和技术 包括以下四个方面 LSS LiDAR Scan Sequence LSS
  • 论文阅读笔记4——MOTR: End-to-End Multiple-Object Tracking with TRansformer(利用Transformer进行多目标跟踪)

    首个完全基于端到端 Transformer 的多目标追踪模型 21年5月上传到arxiv上 论文 论文 代码 代码 space 1 Abstract 摘要大概由两部分组成 一是过去启发式算法的缺陷 二是MOTR的基本思路 他说MOT问题的关
  • sort算法流程

    通过卷积神经网络得到detection以后做一个IoU的匹配 这个匹配是和当前的tracks做匹配 detection的数目和tracks的数目并不一定相等 匹配是通过匈牙利算法进行求解 结果就有 Unmatched Tracks 未匹配上
  • MixFormer: End-to-End Tracking with Iterative Mixed Attention解读

    MixFormer End to End Tracking with Iterative Mixed Attention 代码 文章 https github com MCG NJU MixFormer Abstract 跟踪通常采用特征提
  • MyCobot六轴机械臂的基本操作(二)

    上一讲我们做ssh和vnc的设置 有小伙伴问设置些有什么用 那么这里我先来解释一下这些功能有什么用处 首先我们可以通过ssh在我们的Windows桌面进行程序开发 然后上传到树莓派进行验证 我们也可以在windows平台通过vnc远程操作我
  • 基于元学习的红外弱小点状目标跟踪算法

    基于元学习的红外弱小点状目标跟踪算法 人工智能技术与咨询 昨天 本文来自 激光技术 作者热孜亚 艾沙等 引言 红外点状目标的跟踪是红外搜索和跟踪 infrared search and track IRST 系统中的关键技术之一 1 在红外
  • 昇腾应用案例体验:(5) 全目标结构化

    昇腾AI应用 探索人工智能的无限可能 使能千行百业 全目标结构化 概述 全目标结构化旨在处理海量视频 图像等机器无法理解的非结构化数据 从中挖掘潜在有价值信息并将其结构化存储 本例基于 mxVision 提供的插件以及自开发的目标挑选 人脸
  • 相关滤波之开篇Mosse原理及代码详解

    相关滤波之开篇Mosse原理及代码详解 相关滤波 Correlation Filter 介绍 代码解读 程序框图 本文主要介绍相关滤波算法开篇 mosse具体原理及其python代码实现流程 相关滤波 Correlation Filter
  • MV-YOLO翻译(2018年5月 CVPR论文)【原创】

    声明 作者翻译论文仅为学习 如有侵权请联系作者删除博文 谢谢 另 如有不当的地方 请各位大佬批评指正 谢谢 MV YOLO 通过语义目标检测实现运动矢量跟踪 原论文pdf下载地址 https arxiv org pdf 1805 00107
  • 如何在深度学习中处理图像数据?

    深度学习在图像处理领域取得了重大的突破 可以用于图像分类 目标检测 图像生成等各种任务 处理图像数据的关键是将图像转换为适合深度学习模型处理的形式 下面是处理图像数据的一般步骤 1 数据准备 收集和整理用于训练的图像数据集 数据集应包含图像
  • SCTracker 跟踪论文阅读笔记

    SCTracker 跟踪论文阅读笔记 SCTracker Multi object tracking with shape and confidence constraints 论文链接 未开源状态 论文主要更新点围绕shape const
  • 匹配算法之 匈牙利算法详解

    参考 算法学习笔记 5 匈牙利算法 漫谈匈牙利算法 匈牙利算法 KM算法 匈牙利算法 二分图 通俗易懂小白入门 二分图最大匹配 匈牙利算法 多目标跟踪之数据关联 匈牙利匹配算法和KM算法 小白学习笔记 一 目标跟踪 匈牙利匹配 一 匈牙利算
  • 下载、安装与使用 pysot

    本篇文章简要介绍了如何在windows环境下 使用anaconda进行pysot运行环境的部署以及使用 目录 1 下载仓库 2 设置环境 3 下载模型 4 运行 demo py 4 1 PYTHONPATH 4 2 Demo运行参数 pys
  • PannoOccUnified Occupancy Representation for Camera-based 3D Panoptic Segmentation

    中科院 摘要 周围三维世界的综合建模是自主驾驶成功的关键 然而 现有的感知任务 比如目标检测 道路结构分割 深度和高度估计以及开放式对象定位 都只关注于整体三维场景理解任务的一小部分 这种分而治之的策略简化了算法开发过程 但代价是失去了问题
  • 计算机视觉(二)——HSV色彩分离及目标跟踪

    HSV是根据颜色的直观特性由A R Smith在1978年创造的一种颜色空间 也称六角锥体模型 这个模型中颜色的参数分别是 色调 H 饱和度 S 明度 V HSV比传统的RGB颜色空间更能准确的感知颜色 并仍保持在计算上的简单 HSV色彩分
  • CSTrack: Rethinking the competition between detection and ReID in Multi-Object Tracking

    CSTrack Rethinking the competition between detection and ReID in Multi Object Tracking 论文链接 https arxiv org abs 2010 121
  • python的扩展控制鼠标

    1 使用资料 PyAutoGUI 简介 今天要介绍的工具就是 PyAutoGUI 看到这个名字 就能猜到它的作用 无非用 Python 自动处理图形界面的操作 的确是这样 你可以使用编程的方式来控制电脑的鼠标和键盘 它有两个优点 跨平台 支
  • siammask_e 安装和使用

    基于siammask e的成绩 验证下demo效果 https paperswithcode com sota visual object tracking on vot2019 p fast visual object tracking
  • OPENCV手势识别抓取图片

    PENCV手势识别抓取图片 一位油管的小哥做的项目非常棒 照着写了一个 代码 注意 看好cvzone的版本 太新的版本中有个函数没有 如果找不到这个函数的时候请更换一下库的版本 import cv2 from cvzone HandTrac
  • YOLOv8+BoT-SORT多目标跟踪(行人车辆计数与越界识别)

    课程链接 https edu csdn net course detail 38919 BoT SORT是发表于2022年的先进的多目标跟踪算法 它结合了运动和外观信息 相机运动补偿和更准确的卡尔曼滤波状态向量 并把这些改进集成到ByteT

随机推荐

  • 【Python零基础入门篇 · 12】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate

    文章目录 函数的定义和作用 函数的结构 函数调用 返回值 函数参数 区分形参和实参 必备参数 默认参数 可变参数 关键字参数 函数嵌套 枚举函数 enumerate 函数的定义和作用 函数 function 是将具有独立功能的代码块组织成为
  • 【BEVformer部署】tensorrt部署整体流程

    1 安装依赖包 CUDA cuDNN TensorRT 下载安装 CUDA 11 6 cuDNN 8 6 0 TensorRT 8 5 1 7 地址 NVIDIA PyTorch安装指令 pip install torch 1 12 1 c
  • Python爬虫 实例 网络爬虫

    一 这里是一个简单的网页爬虫例子 python import requests from bs4 import BeautifulSoup url https example com response requests get url so
  • [小技巧] git 清理 repository

    使用如下命令可以快速清除 repository 里没有被 git 管理的文件 git clean xdf 如果要保留某些后缀的文件 如 txt 文件 使用如下命令 git clean xdfe txt 参考 http stackoverfl
  • 在 NetBeans 中自动生成 get、set 和构造函数

    如果您使用的是 NetBeans 以下内容将为您节省大量时间 您可以在几秒钟内为您的变量以及构造函数自动生成函数get set以下适用于 Java 和 PHP 但我认为它也适用于其他语言 只需将光标指向您希望生成的代码出现的位置 然后按 A
  • elasticsearch 一对多普通文档子对象边界值问题

    一般为保证大数据量 低延时业务数据查询都会用到基于lucene的搜索引擎elasticsearch ES的出现解决了大数据搜索的一大问题 但是由于某些特殊业务数据就可能出现一些问题 比如 一对多业务普通索引的子对象边界值问题 什么是子对象边
  • [游戏开发][Unity]点击Play按钮后卡死很久

    一般小工程不会遇到这个问题 我在公司接手了几个老项目 都遇到了这个问题 每次Play卡顿几分钟甚至十几分钟 很是头疼 原因大概率就是下图 Packing Sprite Atlases 打包纹理图集 Windows上的Unity项目经常不显示
  • 【分治法】中位数问题和Gray码问题——武汉理工大学算法设计与分析课程实验

    1 中位数问题 问题描述 设X 0 n 1 和Y 0 n 1 为两个数组 每个数组中含有n个已排好序的数 找出X和Y的2n个数的中位数 编程任务 利用分治策略试设计一个O log n 时间的算法求出这2n个数的中位数 数据输入 由文件inp
  • UML建模详解

    摘要 本教程简要介绍了统一建模语言 面向对象问题解决的核心是构建一个模型 该模型从其通常复杂的现实世界中抽象出基本问题的基本细节 几个建模工具被包裹在UML 的标题下 代表统一建模语言 本课程的目的是介绍UML的重要亮点 UML的中心是我们
  • 二十二. Kubernetes ResourceQuota配额限制与LimitRanger限制范围

    目录 一 ResourceQuota 资源限制基础解释 二 LimitRanger 一 ResourceQuota 资源限制基础解释 官方文档 ResourceQuota 是k8s中对每个命名空间资源消耗总量提供的一种限制 可以限制指定命名
  • 基于STM32F407的SDCard读写操作

    基于STM32F407的SDCard读写操作 目录 基于STM32F407的SDCard读写操作 硬件电路 SD卡结构示意图 管脚连接 SDIO方式 SDCard初始化 SDCacr寄存器介绍 SDCacr初始化代码 在之前没有做过SD卡相
  • 解神者x2服务器维护,解神者X2服务器维护中? 登不上与连网失败解决攻略

    解神者X2连网失败怎样解决 等待开放测试 才能顺利加入 创意手游小编带来测试详情 应对线上挑战 登不上与连网失败解决攻略 星辰跃迁测试预下载已开启 测试时间为 7月29日10 00 8月5日16 00 欢迎大家登船 测试类型 不限量 删档
  • 使用DLL在多个进程间共享全局变量

    默认情况下 同一个程序启动多个进程 它们各自的变量值是不会相互影响的 第二个实例启动后 在修改全局变量的时候 系统会运用内存管理系统copy on write的特性来防止修改了第一个实例的数据 即系统会再分配一些内存 并将全局变量复制到这块
  • c语言中 文件,c语言中文件的使用方法

    c语言中文件的使用方法 一 文件指针的定义 FILE fp 注意FILE的大写 二 文件的打开 fp fopen 路径 文件名 文件格式后缀 文件的使用方法 注意路径下为 而不是 三 文件的使用方法 1 r 模式 1 1 打开文件进行只读操
  • ansible 一键部署 kubernetes高可用框架

    ansible 一键部署 kubernetes高可用框架 kube router版 分享一个自己写的k8s搭建项目 github https github com Fear2014 kubernetes ansible deploy 框架说
  • 2021-06-10

    NFS Network File System 网络文件系统 是FreeBSD支持的文件系统中的一种 它允许网络中的计算机 不同的计算机 不同的操作系统 之间通过TCP IP网络共享资源 主要在unix系列操作系统上使用 在NFS的应用中
  • Android开发插件化来龙去脉(附全套学习视频)(1),app架构图

    Step3 通过反射获取到pluginClassLoader中的pathList字段 Object pluginDexPathList ReflectUtil getField BaseDexClassLoader class plugin
  • pyltp实现NER以及实体统计

    pyltp实现NER以及实体统计 人工智能火热 NLP技术也蓬勃发展 今天主要讲述NLP中的一项基础任务NER的实现 首先介绍一下NER 命名实体识别 Named entity recognition 是NLP的一项子任务 旨在实现从文本中
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 目标跟踪(1)SORT Windows实战+代码解析

    1 Windows实战 下载代码 解压文件 安装SORT所需的环境 进入到sort环境下 pip install r requirements txt 有两种使用方式 1 不基于视频 python sort py 2 基于视频 先下载视频