参考
多目标跟踪的开源项目,参考和修改自:centerNet 多用户追踪(基于centerNet的人体检测器 + 带有pytorch的深度排序算法),github地址,该项目从yolov3+deepsort修改而来,并对centernet+deepsort和yolov3+deepsort的速度进行了对比。总结就是centernet精度和速度方面都具有更好的优势。
(左图)基于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