目标跟踪(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
  • 基于元学习的红外弱小点状目标跟踪算法

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

    昇腾AI应用 探索人工智能的无限可能 使能千行百业 全目标结构化 概述 全目标结构化旨在处理海量视频 图像等机器无法理解的非结构化数据 从中挖掘潜在有价值信息并将其结构化存储 本例基于 mxVision 提供的插件以及自开发的目标挑选 人脸
  • Ranking-Based Siamese Visual Tracking(基于排序的暹罗视觉跟踪)-CVPR2022

    摘要 目前基于暹罗的跟踪器主要将视觉跟踪分为两个独立的子任务 包括分类和定位 它们通过单独处理每个样本来学习分类子网络 忽略了正负样本之间的关系 此外 这样的跟踪范例仅采用用于最终预测的建议的分类置信度 这可能产生分类和定位之间的不对准 为
  • 目标跟踪序列化测试以及搜参

    1 序列化测试 对于一些跟踪算法 特别是siamese系列 一般进行20epochs的训练 对应20个训练模型 特别是backbone解冻的后10个模型 均有可能出现最好的结果 got 10k与lasot的结果一般容易出现在10 15 ot
  • MV-YOLO翻译(2018年5月 CVPR论文)【原创】

    声明 作者翻译论文仅为学习 如有侵权请联系作者删除博文 谢谢 另 如有不当的地方 请各位大佬批评指正 谢谢 MV YOLO 通过语义目标检测实现运动矢量跟踪 原论文pdf下载地址 https arxiv org pdf 1805 00107
  • 使用Opencv+Python的AR小demo

    摘要 浅浅了解一下 Python OpenCV 试着给自己的 iphone 8 做一下相机标定 github 源码 https github com aeeeeeep OpenCvArDemo 定义 增强现实 AR 是一种真实世界环境的交互
  • 实时目标追踪:ByteTrack算法步骤详解和代码逐行解析

    文章目录 ByteTrack算法简介 算法步骤分析 算法框架流程 一 对追踪轨迹和边界框进行分类 二 对轨迹进行第一次追踪 仅针对激活状态的轨迹的高分匹配 三 对轨迹进行第二次追踪 仅针对激活状态的轨迹的低分匹配 四 对未激活状态的轨迹进行
  • 目标跟踪算法研究整理

    最近项目有用到目标跟踪的算法 用的还是传统opencv 整理一下 1 基础框架 目标跟踪基础认识 视频图像跟踪算法综述 opencv实现目标跟踪的八种算法 2 CSRT追踪器 CSRT追踪器 官方描述 在具有通道和空间可靠性的判别相关滤波器
  • ECCV2022 多目标跟踪(MOT)汇总

    一 Towards Grand Unification of Object Tracking 作者 Bin Yan1 Yi Jiang2 Peize Sun3 Dong Wang1 Zehuan Yuan2 Ping Luo3 and Hu
  • 下载、安装与使用 pysot

    本篇文章简要介绍了如何在windows环境下 使用anaconda进行pysot运行环境的部署以及使用 目录 1 下载仓库 2 设置环境 3 下载模型 4 运行 demo py 4 1 PYTHONPATH 4 2 Demo运行参数 pys
  • 【多目标跟踪论文阅读笔记——2021年CVPR论文粗读记录】

    阅读心得 多目标跟踪经典论文 2021CVPR论文粗读记录 前言 一 学习策略类 QDTrack 二 Temporal Spatial 类 TADAM Alpha Refine TraDes CorrTracker 三 Motion mod
  • CVPR2022 多目标跟踪(MOT)汇总-补充篇

    为该文章的后续补充https blog csdn net qq 34919792 article details 124343166 七 Multi Object Tracking Meets Moving UAV 作者 Shuai Liu
  • StrongSORT:Make DeepSORT Great Again

    1北京邮电大学2中国网络系统与网络文化北京市重点实验室 摘要 现有的多目标跟踪 Multi Object Tracking MOT 方法大致可以分为基于检测的跟踪和联合检测关联两种范式 虽然后者引起了更多的关注 并显示出与前者相当的性能 但
  • OpenMMLab MMDetectionV3.1.0-SAM(环境安装、模型测试、训练以及模型后处理工具)

    OpenMMLab Playground 概况 当前通用目标检测的研究方向正在朝着大型多模态模型发展 除了图像输入之外 最近的研究成果还结合了文本模式来提高性能 添加文本模态后 通用检测算法的一些非常好的属性开始出现 例如 可以利用大量易于
  • 光流法( Optical Flow Method)

    在计算机视觉中 光流法即可用于运动目标检测 也可以用于目标跟踪 本文主要介绍光流法在运动目标检测和目标跟踪中的区别与联系 1 光流与光流场 光流的概念最初是由 Gibson 于 1950 年首先提出来的 当人的眼睛观察运动物体时 物体的景象
  • StrongSORT(deepsort强化版)浅实战+代码解析

    1 实战部分 1 1 具体操作 其实和之前的deepsort没差 到github上下载Yolov5 StrongSORT OSNet 下载对应的yolov5去替代原文件中yolov5 下载yolov5权重 可以自动下载 和ReID权重 可能
  • ubuntu16.04上利用opencv目标跟踪工具实现8种目标跟踪

    一共八种工具 八种工具包括 BOOSTING Tracker 和Haar cascades AdaBoost 背后所用的机器学习算法相同 但是距其诞生已有十多年了 这一追踪器速度较慢 并且表现不好 但是作为元老还是有必要提及的 最低支持Op
  • CVPR-2022- MixFormer: End-to-End Tracking with Iterative Mixed Attention 阅读笔记

    目录 端到端的MixFormer跟踪整体框架 Mixed attention module MAM 基于角的定位头 基于查询的定位头 分数预测模块 SPM 论文地址 https arxiv org abs 2203 11082 代码地址 h
  • OPENCV手势识别抓取图片

    PENCV手势识别抓取图片 一位油管的小哥做的项目非常棒 照着写了一个 代码 注意 看好cvzone的版本 太新的版本中有个函数没有 如果找不到这个函数的时候请更换一下库的版本 import cv2 from cvzone HandTrac

随机推荐

  • 【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 基于视频 先下载视频