首页 > 其他分享 >10.1 基于深度学习的目标检测

10.1 基于深度学习的目标检测

时间:2024-11-20 11:14:59浏览次数:3  
标签:10.1 idx img 检测 frame args cv2 深度 net

首次完成时间:2024 年 11月 20 日


1. 使用OpenCV的dnn模块实现图像分类。

1)程序代码:

import numpy as np
import cv2

# 解析标签文件
row = open("model1/synset_words.txt").read().strip().split("\n")
class_label = [r[r.find(" "):].split(",")[0] for r in row]

# 载入caffe所需的配置文件
net = cv2.dnn.readNetFromCaffe("model1/bvlc_googlenet.prototxt",
                               "model1/bvlc_googlenet.caffemodel")

# 读取待分类图像
img = cv2.imread("photos/cat.jpg")  # 确保这里的路径是正确的

# 转换格式
blob = cv2.dnn.blobFromImage(img, 1, (224, 224), (104, 117, 123))

# 加载图像
net.setInput(blob)

# 预测
preds = net.forward()

# 排序,取概率最大的结果
idx = np.argsort(preds[0])[-1]

# 获取图片的原始尺寸
(h, w) = img.shape[:2]

# 等比例缩减图片大小
resized_img = cv2.resize(img, (w // 4, h // 4))

# 可视化处理,显示图像类别、置信度等信息
text = "label: {}-{:.2f}%".format(class_label[idx], preds[0][idx] * 100)
cv2.putText(resized_img, text, (5, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0))

# 显示缩减后的图片
cv2.imshow("resized_result", resized_img)

# 保存缩减后的图片
cv2.imwrite("photos/resized_result.jpg", resized_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

2)代码分析:

2. 使用OpenCV实现目标检测,实现发现不明车辆或行人进入检测区,即进行报警。

1)程序代码:

import numpy as np
import cv2

def prepareDataSet():
    # 准备数据集
    args = {}
    args["prototxt"] = "model2/MobileNetSSD_deploy.prototxt"
    args["model"] = "model2/MobileNetSSD_deploy.caffemodel"
    return args

def createNet():
    # 构建网络模型对象
    args = prepareDataSet()
    # load our serialized model from disk
    print("[INFO] loading model...")
    net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
    return net

if __name__ == "__main__":
    # 定义类别名称序列
    CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
               "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog",
               "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

    # 定义边框颜色序列
    COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))

    # 打开摄像头或视频文件
    camera = cv2.VideoCapture("videos/12686501_3840_2160_60fps.mp4")

    # 构建网络模型
    net = createNet()

    while True:
        ret, frame = camera.read()
        if ret:
            # 将帧的尺寸调整为1080p
            frame = cv2.resize(frame, (1920, 1080))
            (h, w) = frame.shape[:2]
            blob = cv2.dnn.blobFromImage(cv2.resize(
                frame, (300, 300)), 0.007843, (300, 300), 127.5)
            net.setInput(blob)
            detections = net.forward()

            # 遍历结果
            for i in np.arange(0, detections.shape[2]):
                # 获得置信度
                confidence = detections[0, 0, i, 2]
                # 根据置信度阈值过滤执行度
                if confidence > 0.2:
                    # 根据最大置信度获取类别下标
                    idx = int(detections[0, 0, i, 1])
                    # 获取位置信息
                    box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
                    (startX, startY, endX, endY) = box.astype("int")

                    # 显示类别信息和位置边框
                    label = "{}: {:.2f}%".format(CLASSES[idx], confidence * 100)
                    print("[INFO] {}".format(label))
                    cv2.rectangle(frame, (startX, startY), (endX, endY), COLORS[idx], 2)
                    y = startY - 15 if startY - 15 > 15 else startY + 15
                    cv2.putText(frame, label, (startX, y),
                                cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)

                    if CLASSES[idx] == "person":
                        print("raise the alarm")

            # 显示结果
            cv2.imshow("result", frame)

            # 按下空格退出 or esc
            if cv2.waitKey(1) == ord(' ') or cv2.waitKey(1) == 27:
                break
        else:
            break

    camera.release()
    cv2.destroyAllWindows()

2)代码分析:

标签:10.1,idx,img,检测,frame,args,cv2,深度,net
From: https://blog.csdn.net/m0_64545019/article/details/143906084

相关文章

  • 基于蚁群算法实现图像边缘检测——Matlab代码实现
    图像边缘检测是计算机视觉领域中的一个重要问题,它在图像处理、模式识别、目标跟踪等方面具有广泛的应用,本文将介绍一种基于蚁群算法实现的图像边缘检测方法,并提供相应的Matlab代码实现。蚁群算法是一种模拟自然界蚂蚁觅食行为的优化算法,其具有自适应、高效等优点,在图像边缘......
  • 10.11
    原型模式//抽象原型类abstractclassPrototypeimplementsCloneable{publicabstractPrototypeclone();}//具体原型类classConcretePrototypeextendsPrototype{privateStringattribute;publicConcretePrototype(Stringattribute){......
  • 10.10
    构建者模式下面是一个简单的Java代码展示示例,展示了构建者模型的现实://产品类classProduct{privateStringpart1;privateStringpart2;privateStringpart3;publicvoidsetPart1(Stringpart1){this.part1=part1;}publicv......
  • 10.14
    过滤器模式下面是一个简单的Java代码展示示例,展示了经过滤器模型的现实:importjava.util.ArrayList;importjava.util.List;//实体类classProduct{privateStringname;privateStringcategory;publicProduct(Stringname,Stringcategory){......
  • 10.13
    桥接模式桥接模型(BridgePattern)是一种结构设计模型,先在将抽像部分和实际部分解析成,使它们可以独立地改变。桥接模型通通过使用组合关系而不是继承关系,将两个单独立变的维数分离开来,从而提高系统的灵性和可扩展性。在桥接口模式中,抽像部分和实际部分分别由两个抽像类(或接口)确定......
  • 10.17
    外观模式外观模式(FacadePattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式隐藏了子系统的复杂性,简化了客户端与子系统之间的交互。下面是一个简单的Java代码示例,演示了外观模式的实现://子系统类AclassSubsystemA{publicv......
  • 10.16
    装饰器模式下面是一个简单的Java代码示例,展示了装饰器模式的实现//抽象组件接口interfaceComponent{voidoperation();}//具体组件类classConcreteComponentimplementsComponent{@Overridepublicvoidoperation(){System.out.println("C......
  • 10.15
    组合模式下面是一个简单的Java代码示例,展示了组合模式的现实:importjava.util.ArrayList;importjava.util.List;//组件抽象类abstractclassComponent{protectedStringname;publicComponent(Stringname){this.name=name;}public......
  • 10.19
    代理模式代理模式(ProxyPattern)是一种结构型设计模式,它提供了一个代理对象,控制对原始对象的访问,并允许在访问过程中添加额外的逻辑。下面是一个简单的Java代码示例,演示了代理模式的实现//接口定义interfaceSubject{voidrequest();}//原始对象类classRealSubjec......
  • 10.18
    享元模式享元模式(FlyweightPattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。享元模式适用于需要创建大量相似对象的情况,通过共享这些对象的内部状态,可以显著减少对象的数量。下面是一个简单的Java代码示例,演示了享元模式的实现:importjava.util.HashMap;......