• YOLO-V3实时检测实现(opencv+python实现)——改进——>更加的易懂


    1.上一篇文章YOLO-V3实时检测实现

    https://blog.csdn.net/Keep_Trying_Go/article/details/125503943


    2.上对于上一篇的改进之处

    #获取网络模型
        model=cv2.dnn_DetectionModel(net)
        #设置网络的输入参数
        model.setInputParams(scale=1/255,size=(416,416))
        #进行预测
        class_id,scores,boxes=model.detect(frame,confThreshold=Confidence_thresh,
                     nmsThreshold=Nms_thresh)
        #返回预测的类别和坐标
        return class_id,scores,boxes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    不需要存储预测框坐标的转换,需要进行相关 (坐标,高宽,置信度,概率值以及类别)进行重新的遍历和存储,直接得到输出的结果。


    3.代码实战

    (1)网络文件(.cfg)和权重文件的读取

    #读取YOLO-V3权重文件和网络配置文件
    net=cv2.dnn.readNet(model='dnn_model/yolov3.weights',config='dnn_model/yolov3.cfg')
    
    
    • 1
    • 2
    • 3

    (2)类别文件的读取

    #设置置信度阈值和非极大值抑制的阈值
    Confidence_thresh=0.2
    Nms_thresh=0.35
    #读取coco.names文件中的类别
    with open('dnn_model/coco.names','r') as fp:
        classes=fp.read().splitlines()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (3)网络模型的加载

    #yolo-v3检测
    def detect(frame):
        #获取网络模型
        model=cv2.dnn_DetectionModel(net)
        #设置网络的输入参数
        model.setInputParams(scale=1/255,size=(416,416))
        #进行预测
        class_id,scores,boxes=model.detect(frame,confThreshold=Confidence_thresh,
                     nmsThreshold=Nms_thresh)
        #返回预测的类别和坐标
        return class_id,scores,boxes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (4)得到预测的结果

    #进行预测
            class_ids,scores,boxes=detect(frame)
    
    • 1
    • 2

    (5)绘制图形

    #绘制矩形框
            for (class_id,box) in enumerate(boxes):
                (x,y,w,h)=box
                class_name=classes[class_ids[class_id]]
                confidence=scores[class_id]
                confidence=str(round(confidence,2))
                cv2.rectangle(img=frame,pt1=(x,y),pt2=(x+w,y+h),
                              color=(0,255,0),thickness=2)
                text=class_name+' '+confidence
                cv2.putText(img=frame,text=text,
                            org=(x,y-10),fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                            fontScale=1.0,color=(0,255,0),thickness=2)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (6)整体的代码

    import os
    import cv2
    import numpy as np
    
    #创建窗口
    # cv2.namedWindow(winname='detect',flags=cv2.WINDOW_AUTOSIZE)
    # cv2.resizeWindow(winname='detect',width=750,height=600)
    
    #读取YOLO-V3权重文件和网络配置文件
    net=cv2.dnn.readNet(model='dnn_model/yolov3.weights',config='dnn_model/yolov3.cfg')
    
    #设置置信度阈值和非极大值抑制的阈值
    Confidence_thresh=0.2
    Nms_thresh=0.35
    #读取coco.names文件中的类别
    with open('dnn_model/coco.names','r') as fp:
        classes=fp.read().splitlines()
    
    #yolo-v3检测
    def detect(frame):
        #获取网络模型
        model=cv2.dnn_DetectionModel(net)
        #设置网络的输入参数
        model.setInputParams(scale=1/255,size=(416,416))
        #进行预测
        class_id,scores,boxes=model.detect(frame,confThreshold=Confidence_thresh,
                     nmsThreshold=Nms_thresh)
        #返回预测的类别和坐标
        return class_id,scores,boxes
    
    
    #实时的检测
    def detect_time():
        #开启摄像头 'video/los_angeles.mp4' or 'video/soccer.mp4'
        cap=cv2.VideoCapture(0)
    
        while cap.isOpened():
            OK,frame=cap.read()
            if not OK:
                break
    
            frame=cv2.flip(src=frame,flipCode=2)
            # frame=cv2.resize(src=frame,dsize=(416,416))
            #进行预测
            class_ids,scores,boxes=detect(frame)
            #绘制矩形框
            for (class_id,box) in enumerate(boxes):
                (x,y,w,h)=box
                class_name = classes[class_ids[class_id]]
                confidence = scores[class_id]
                confidence=str(round(confidence,2))
                cv2.rectangle(img=frame,pt1=(x,y),pt2=(x+w,y+h),
                              color=(0,255,0),thickness=2)
                text=class_name+' '+confidence
                cv2.putText(img=frame,text=text,
                            org=(x,y-10),fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                            fontScale=1.0,color=(0,255,0),thickness=2)
    
            cv2.imshow('detect',frame)
            key=cv2.waitKey(1)
            if key==27:
                break
    
        cap.release()
    #单张图片的检测
    def signal_detect(image_path='images/face1.jpg'):
        frame=cv2.imread(image_path)
        frame = cv2.resize(src=frame, dsize=(416, 416))
        # 进行预测
        class_ids, scores, boxes = detect(frame)
        # 绘制矩形框
        for (class_id, box) in enumerate(boxes):
            (x, y, w, h) = box
            class_name = classes[class_ids[class_id]]
            confidence = scores[class_ids[class_id]]
            confidence = str(round(confidence, 2))
            cv2.rectangle(img=frame, pt1=(x, y), pt2=(x + w, y + h),
                          color=(0, 255, 0), thickness=2)
            text = class_name + ' ' + confidence
            cv2.putText(img=frame, text=text,
                        org=(x, y - 10), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                        fontScale=1.0, color=(0, 255, 0), thickness=2)
    
        cv2.imshow('detect', frame)
        cv2.waitKey(0)
    
    cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
        print('Pycharm')
        # signal_detect()
        detect_time()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    (7)单张图片的预测

    在这里插入图片描述

    (8)实时的检测

    yolov3视频演示1

  • 相关阅读:
    Java 基于 SPringBoot 的幼儿园管理系统,附源码、数据库
    Go是如何处理goroutine阻塞的?
    Rust入门基础
    AI数字人SadTalker实战
    Exception_json反序列化失败_JSONException
    Day45:Element-Plus
    js农历与阳历转换使用笔记
    次氯酸消毒剂制备中的全氟醚橡胶密封耐腐蚀电动阀门解决方案
    【Linux】 文件类型和访问权限
    【Java】JVM学习
  • 原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/125520487