基于yolov3的口罩检测

1、数据集准备
假设已经有了标注好的一分部数据,
(1)运行voc2yolo3.py生成txt文件,保存在ImageSets/Main目录下
(2)修改voc_annotation.py中的classes

classes = ["mask", "unmask"]

运行后,生成三个txt文件,每一行对应的是一张图片的位置,标注的真实框位置以及label, 0代表戴口罩,1代表未戴口罩:
在这里插入图片描述
我的目录结构:
基于yolov3的口罩检测_第1张图片

2、修改先验框中的值
根据训练集中标注框的大小,利用kmeans.py生成合适的先验框保存在model_data下的yolo_anchors.txt和tiny_yolo_anchors.txt中,而不使用官方给定的。这里有两种架构,yolov3_tiny架构和yolov3架构,k=9,生成yolo_anchors;k=6,生成tiny_yolo_anchors。
基于yolov3的口罩检测_第2张图片
然后,将model_data下的voc_classes.txt中的类别修改为需要的类别:mask与unmask,或新建object_classes.txt写入。
基于yolov3的口罩检测_第3张图片
3、训练
在训练之前先将预先下载的yolov3 的 weights文件转化为keras的h5文件:
在cmd下切换到工程目录:

python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

python convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/tiny_yolo.h5

这里我使用的是yolo.y5进行的训练。

注意修改train.py里的classes_path,anchors_path,pretrained_path:

def _main():
    annotation_path = 'dataset/2007_train.txt'
    log_dir = 'logs/'
    classes_path = 'model_data/object_classes.txt'
    anchors_path = 'model_data/yolo_anchors.txt'
    class_names = get_classes(classes_path)
    num_classes = len(class_names)
    anchors = get_anchors(anchors_path)

    input_shape = (416, 416)
    pretrained_path = 'model_data/yolo.h5' 

    is_tiny_version = len(anchors)==6 # default setting
    if is_tiny_version:
        model = create_tiny_model(input_shape, anchors, num_classes,
            freeze_body=2, weights_path='model_data/tiny_yolo.h5')
    else:
        model = create_model(input_shape, anchors, num_classes,
            freeze_body=2, weights_path=pretrained_path)

运行train.py 即可开始训练,训练好的模型会存放在logs目录下。

yolo3 相关权重和转换后的.h5文件可以获取:
链接:https://pan.baidu.com/s/1ImfxETUl11LLkG_Ge3WbdQ
提取码:gam8

4、测试
(1)单张图片测试
detect_image_test(img_path, out_path)
基于yolov3的口罩检测_第4张图片
基于yolov3的口罩检测_第5张图片
(2)本地视频测试并保存
对应的yolo.py文件detect_video函数中vid = cv2.VideoCapture(“视频路径+视频名+视频后缀名”);

(3)电脑摄像头实时测试
对应的yolo.py文件detect_video函数中vid = cv2.VideoCapture(0);

github地址

参考:https://blog.csdn.net/Mind_programmonkey/article/details/104348106#comments

你可能感兴趣的:(深度学习)