YOLOv3只检测人

文章目录

  • 问题描述
  • 解决方案
  • 方法一:改代码
  • 方法二: 重新训练
  • 备注

问题描述

YOLOv3可以检测很多对象,但只想检测人




解决方案

  • 修改源码只输出人一类。实际上会检测另外79类。
  • 重新训练。

对应文献:

  1. (法一,简单高效)yolov3 修改 只识别一类
  2. (法二,麻烦完美)yolov3算法检测单类物体

文献1是针对C下的YOLOv3,本文针对Python Keras下的YOLOv3:




方法一:改代码

修改yolo.py第135行,添加如下代码

            #Just detect person
            if predicted_class != 'person':
                continue

YOLOv3只检测人_第1张图片
此方法实际上还是会检测别的对象,只是不输出而已




方法二: 重新训练

  1. 源码地址:
    qqwweee/keras-yolo3: A Keras implementation of YOLOv3 (Tensorflow backend)

  2. 预训练权重:
    yolov3.weights

  3. 数据集:
    yolov3训练数据

  4. 放在代码同一目录下解压

  5. 修改yolo.cfg:

  • classes 修改为1(3处)
  • filters=255 修改为 filters=18(3处),值的公式为 (classes+5)*3
  1. 修改voc_annotation.py:
    classes 修改成classes = ["person"]
    YOLOv3只检测人_第2张图片

  2. 修改model_data文件夹下的coco_class.txt和voc_class.txt
    只留下person
    YOLOv3只检测人_第3张图片
    在这里插入图片描述

  3. 生成训练、验证、测试文件

  • 运行python voc_annotation.py
  • 看到生成三个文件:2007_train.txt2007_test.txt2007_val.txt
  • 将三个文件分别改名,去掉前缀2007_
    在这里插入图片描述
  1. 转换预训练权重成.h5
    python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5

  2. 训练
    python train.py

训练过程会出现val_loss: nan的情况,解决办法:

  • 调大epoch(修改train.py),50代后开始降低
  • 调大batch(修改yolov3.cfg)
    YOLOv3只检测人_第4张图片
    训练完成后权重.h5文件放在logs/000
  1. 更换权重
  • logs/000/trained_weights_stage_1.h5移动到model_data
  • 修改yolo.py中的默认权重路径"model_path"trained_weights_stage_1.h5
  1. 测试
    随便找个带有人的mp4放进去测试
    python yolo_video.py --input 1.mp4
    将结果保存到本地
    python yolo_video.py --input test.mp4 --output test1.mp4
    YOLOv3只检测人_第5张图片

备注

  • 仅训练50代效果远远没有官方提供的权重好

你可能感兴趣的:(Python,机器学习)