centernet+deepsort做多目标跟踪(针对猪)

参考

多目标跟踪的开源项目,参考和修改自:centerNet 多用户追踪(基于centerNet的人体检测器 + 带有pytorch的深度排序算法),github地址,该项目从yolov3+deepsort修改而来,并对centernet+deepsort和yolov3+deepsort的速度进行了对比。总结就是centernet精度和速度方面都具有更好的优势。
centernet+deepsort做多目标跟踪(针对猪)_第1张图片
(左图)基于CenterNet的跟踪.器:fps 18-23 /(右图)原始的 yolov3版本[2]:fps 8-9
速度上几乎提高了一倍。

使用centernet训练猪检测器

官方的操作:New dataset
上面的项目是利用centernet预训练的模型,并没有用自己数据集。接下来用centernet训练自己的数据集。

1. 将voc转coco格式

文件:https://download.csdn.net/download/u011622208/11271598,修改一下文件夹的路径就好。得到train_pig.json和val_pig.json

训练

1. VOC转COCO标注格式

将运行./src/data_process/pig_coco.py文件,只需要修改xml文件文件夹的路径。
xml_path = '/home/yangna/deepblue/2_MOT/darknet/scripts/VOCdevkit/VOC2019/Annotations'

2. 训练

  • 在CENTERNET/data文件夹下,新建一个pig文件夹
    data
    │ ├── pig # 和数据集的名字有关
    │ │ ├── annotations # coco标注文件json所在的位置
    │ │ └── images -> /home/yangna/deepblue/2_MOT/darknet/scripts/VOCdevkit/VOC2019/JPEGImages # 图片所在的位置

  • 继续训练
    python main.py --resume

3. 训练一个新的数据集

  • src/lib/datasets/dataset下复制pascal.py新建一个pig.py,参考以下修改:
class PIG(data.Dataset):
  num_classes = 1								# 1. 总的类别,不包括背景
  default_resolution = [512, 512]				# 2. 图片的尺寸
  mean = np.array([0.485, 0.456, 0.406],
                   dtype=np.float32).reshape(1, 1, 3)
  std  = np.array([0.229, 0.224, 0.225],
                   dtype=np.float32).reshape(1, 1, 3)
  
  def __init__(self, opt, split):
    super(PIG, self).__init__()
    self.data_dir = os.path.join(opt.data_dir, 'pig')	# 3. data文件夹下新建了一个pig文件夹,images放图片,train_pig.json是训练用,val_pig.json测试用
    self.img_dir = os.path.join(self.data_dir, 'images')	# 4. 读取json文件,可以输出变量调试一下
    _ann_name = {'train': 'train', 'val': 'val'}
    self.annot_path = os.path.join(
      self.data_dir, 'annotations', 
      '{}_pig.json').format(_ann_name[split])
    self.max_objs = 50
    self.class_name = ['__background__', "pig"]				# 5. 修改类名称
    self._valid_ids = np.arange(1, 21, dtype=np.int32)
    self.cat_ids = {v: i for i, v in enumerate(self._valid_ids)}
    self._data_rng = np.random.RandomState(123)
    self._eig_val = np.array([0.2141788, 0.01817699, 0.00341571],
                             dtype=np.float32)
    self._eig_vec = np.array([
        [-0.58752847, -0.69563484, 0.41340352],
        [-0.5832747, 0.00994535, -0.81221408],
        [-0.56089297, 0.71832671, 0.41158938]
    ], dtype=np.float32)
    self.split = split
    self.opt = opt
**重点:**  
- 总的类别,不包含背景num_classes
- pig文件夹的位置,self.data_dir = os.path.join(opt.data_dir, 'pig')
- 图片的位置,self.img_dir = os.path.join(self.data_dir, 'images')
- 类别名称,self.class_name = ['__background__', "pig"]	
  • 在dataset_factory中导入
    修改 -src/lib/datasets/dataset_factory.py- 文件
from .dataset.pig import PIG		# 1. 导入


dataset_factory = {
  'coco': COCO,
  'pascal': PascalVOC,
  'kitti': KITTI,
  'coco_hp': COCOHP,
  'pig': PIG					# 2. 前面的class PIG
}

_sample_factory = {
  'exdet': EXDetDataset,
  'ctdet': CTDetDataset,
  'ddd': DddDataset,
  'multi_pose': MultiPoseDataset
}
  • 在训练中使用pig数据集
    修改src/lib/opts.py文件
'--dataset', default='pig',				# 1. 采用pig dataset

4. 测试

  • 修改src/lib/opts.py中的--demo属性,让其指向一张图片

  • 修改src/lib/opts.py中的--load_model属性,让其指向模型的位置

self.parser.add_argument('--load_model', default='../exp/ctdet/dla/model_best.pth',
                             help='path to pretrained model')
  • 修改src/lib/utils/debugger.py文件,在第65行插入以下语句
elif num_classes == 1 or dataset == 'pig':              # 自己的数据集
      self.names = pig_class_name
  • 测试,
cd src
python demo.py

效果

blili链接

你可能感兴趣的:(多目标跟踪,centernet,deepsort,多目标跟踪)