人体检测、跟踪实战 | 附源码

点击下方卡片,关注“小白玩转Python”公众号

人体检测和跟踪是一项基本的计算机视觉任务,涉及在给定场景中识别并跟踪个体的移动。这项技术在各种实际应用中发挥着关键作用,从监视和安全到自动驾驶车辆和人机交互都有涉及。人体检测的主要目标是在图像或视频帧中定位和分类人体,而跟踪侧重于在这些个体在不同帧之间移动时保持连续性,以便进行监测和分析。

本教程分为三个部分,旨在指导您创建自己的人体检测和跟踪系统。它利用了YOLOv8检测算法和多种跟踪方法。检测模型经过精心训练,使用了HumanCrowd(HC)数据集和多目标跟踪(MOT)数据集。在本文中,我们将带领您完成为此项目准备数据的过程。

为了开发和评估人体检测和跟踪算法,研究人员和从业者通常依赖于提供各种真实场景和挑战的大型数据集。在这一领域中两个显著的数据集是CrowdHuman和多目标跟踪(MOT)数据集。

CrowdHuman数据集:

CrowdHuman是一个广泛使用的人体检测数据集。它包含超过15,000张带有人体实例注释的图像。CrowdHuman的独特之处在于其多样性,包括拥挤的场景、遮挡以及各种姿势和尺度。该数据集共包括15,000张图像,分为4,370张用于验证和5,000张用于测试,以及训练集。CrowdHuman的注释详尽,并涵盖了各种场景。

7ce20ddd81f813d5a366865b7f222113.jpeg

CrowdHuman数据集包含每个人的全身、可见身体和头部边界框注释的基准数据

在该数据集中,训练和验证子集中的个体人数总计达到惊人的470,000,每张图像平均有22.6名行人。此外,提供了详细的注释,包括可见区域的边界框、头部区域的边界框以及全身注释,确保了对人体检测研究而言是一种全面且宝贵的资源。数据首先使用以下代码转换为COCO格式:

def crowdhuman_to_coco(DATA_PATH, OUT_PATH, SPLITS= ['val', 'train'], DEBUG=False):
    if OUT_PATH is None:
        OUT_PATH = DATA_PATH + 'annotations/'


    if not os.path.exists(OUT_PATH):
        os.makedirs(OUT_PATH, exist_ok=True)
    for split in SPLITS:
        data_path = DATA_PATH + split
        out_path = OUT_PATH + '{}.json'.format(split)
        out = {'images': [], 'annotations': [], 'categories': [{'id': 1, 'name': 'person'}]}
        ann_path = DATA_PATH + 'annotation_{}.odgt'.format(split)
        anns_data = load_func(ann_path)
        image_cnt = 0
        ann_cnt = 0
        video_cnt = 0
        for ann_data in tqdm(anns_data):
            image_cnt += 1
            file_path = DATA_PATH + split + '/Images/{}.jpg'.format(ann_data['ID'])
            assert os.path.isfile(file_path)
            im = Image.open(file_path)
            image_info = {'file_name': 'Images/{}.jpg'.format(ann_data['ID']),
                          'id': image_cnt,
                          'height': im.size[1],
                          'width': im.size[0]}
            out['images'].append(image_info)
            if split != 'test':
                anns = ann_data['gtboxes']
                for i in range(len(anns)):
                    if anns[i]['tag'] == 'mask':
                        continue  # ignore non-human
                    assert anns[i]['tag'] == 'person'
                    ann_cnt += 1
                    fbox = anns[i]['fbox']  # fbox means full body box
                    ann = {'id': ann_cnt,
                         'category_id': 1,
                         'image_id': image_cnt,
                         'track_id': -1,
                         'bbox_vis': anns[i]['vbox'],
                         'bbox': fbox,
                         'area': fbox[2] * fbox[3],
                         'iscrowd': 1 if 'extra' in anns[i] and \
                                         'ignore' in anns[i]['extra'] and \
                                         anns[i]['extra']['ignore'] == 1 else 0}
                    out['annotations'].append(ann)
        print('loaded {} for {} images and {} samples'.format(split, len(out['images']), len(out['annotations'])))
        json.dump(out, open(out_path, 'w'))

在这里,我们只考虑人类类别并忽略头部位置的边界框。

多目标跟踪(MOT)数据集:

另一方面,MOT数据集专门设计用于人体跟踪任务。这些数据集包含视频序列,并提供了关于在帧之间移动的个体人的跟踪注释。MOT数据集对于评估跟踪算法的稳健性和准确性至关重要,因为它们提供了地面实况数据,以衡量算法在长时间内能够一致地跟踪和识别个体的能力。著名的MOT数据集包括MOT17和MOT20,每个都包含各种具有挑战性的场景,使其对跟踪研究至关重要。

COCO(上下文中的通用对象)格式数据集和YOLO(You Only Look Once)格式数据集是用于目标检测和图像识别任务的两种广泛使用的数据格式,各自具有其特定的结构和目的。以下是每种格式的概述:

COCO格式数据集:

{
 "images": [{
  "file_name": "000001.jpg",
  "height": 500,
  "width": 353,
  "id": 1
 }, {
  ...
 }, {
  "file_name": "009962.jpg",
  "height": 375,
  "width": 500,
  "id": 9962
 }, {
  "file_name": "009963.jpg",
  "height": 500,
  "width": 374,
  "id": 9963
 }],
 "type": "instances",
 "annotations": [{
  "segmentation": [
   [47, 239, 47, 371, 195, 371, 195, 239]
  ],
  "area": 19536,
  "iscrowd": 0,
  "image_id": 1,
  "bbox": [47, 239, 148, 132],
  "category_id": 12,
  "id": 1,
  "ignore": 0
 }, {
  "segmentation": [
   [138, 199, 138, 301, 207, 301, 207, 199]
  ],
  "area": 7038,
  "iscrowd": 0,
  "image_id": 2,
  "bbox": [138, 199, 69, 102],
  "category_id": 19,
  "id": 3,
  "ignore": 0
 }, {
 ...
 }, {
  "segmentation": [
   [1, 2, 1, 500, 374, 500, 374, 2]
  ],
  "area": 185754,
  "iscrowd": 0,
  "image_id": 9963,
  "bbox": [1, 2, 373, 498],
  "category_id": 7,
  "id": 14976,
  "ignore": 0
 }],
 "categories": [{
  "supercategory": "none",
  "id": 1,
  "name": "aeroplane"
 }, {
  "supercategory": "none",
  "id": 2,
  "name": "bicycle"
 }, {
  "supercategory": "none",
  "id": 3,
  "name": "bird"
 }, {
  "supercategory": "none",
  "id": 4,
  "name": "boat"
 }, {
 ...
 }, {
  "supercategory": "none",
  "id": 19,
  "name": "train"
 }, {
  "supercategory": "none",
  "id": 20,
  "name": "tvmonitor"
 }]
}

注释结构:

COCO数据集格式以其结构化和全面的注释而闻名。数据集中的每个图像都与一个包含有关图像中存在的对象的信息的JSON文件相关联。注释通常包括对象类别、边界框坐标、分割掩膜以及姿势估计的关键点等详细信息。COCO还支持关键点检测、对象关系等方面的注释。

YOLO(You Only Look Once)格式数据集:

注释结构:YOLO格式数据集专门设计用于目标检测任务。YOLO的注释通常存储在与每个图像相关联的文本文件中,与COCO相比,其格式更简单。文件夹结构定义如下:

0ea4162f49a10331bc2f16ba8f7f8ae1.jpeg

在“Label”文件夹中,有一些与“Image”文件夹中的图像名称相似的文本文件。在每个文本文件中,YOLO格式提供了有关图像中每个对象的详细信息,如对象类别和边界框的坐标(class_id、中心 x、中心 y、宽度和高度),这些坐标是相对于图像尺寸进行标准化的。

由于每个数据集都有其自己的格式,在这系列教程中,我首先将所有数据合并到COCO格式,然后再转换为YOLO格式来训练检测模型。一个从COCO转换为YOLO的示例可以查看代码:

https://github.com/vankhoa21991/human_dettrack/blob/dev/datasets/coco_to_yolo.py

·  END  ·

🌟 想要变身计算机视觉小能手?快来「小白玩转Python」公众号!

回复Python视觉实战项目,解锁31个超有趣的视觉项目大礼包!🎁

07573f1305caceb41eab774d841c3531.png

本文仅供学习交流使用,如有侵权请联系作者删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值