Анализ кода обнаружения объектов в реальном времени

OpenCV

1 Импортировать базовую библиотеку

1import numpy as np 
2import argparse  #命令行参数解析模块
3import time
4import cv2

2 Добавить параметры

1ap = argparse.ArgumentParser()
2ap.add_argument("-p", "--prototxt", required = True,  help = "path to Caffe 'deploy' prototxt file")
3ap.add_argument("-m", "--model", required = True, help = "path to Caffe pre-trained model")
4ap.add_argument("-c", "--probability", type = float, default = 0.2, help = "minimum probability to filter weak detections")
5args = vars(ap.parse_args())  #vars() 函数返回属性和属性值的字典对象,比如说调用args["prototxt"]就会返回传入的参数文件,除此之外,程序只能在命令行传入参数运行,有两种方法:.py --prototxt + 文件 或者 .py -p +文件

3 Подготовка

1CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
2"dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
3COLORS = np.random.uniform(0, 255, size = (len(CLASSES), 3))
4print("[INFO] loading model...")
5net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
6print("[INFO] starting video stream...")
7vs = cv2.VideoCapture(0)
8vs.set(300, 400)
9vs.set(300, 500)

CLASSESМассив для хранения меток классифицированных объектов

COLORSдает цвет границы, заданныйuniformПроизвольно сгенерируйте 0-255RGB пикселей.

cv2.dnn.readNetFromCaffe()Используется для чтения уже обученной модели кафе. Описание параметра: prototxt представляет собой структурный текст сети кафе, а модель представляет результаты обученных параметров. возвращаемое значение:Net object

VideoCaptureчитать видеоконтент

4 основной цикл

1while True:
2    suc, frame = vs.read()  #读取视频的下一帧,返回值为suc:是否成功读取  frame:视频的每一帧
3    (h, w) = frame.shape[:2]   #得到视频的width和height,返回的实际是shape[0]和shape[1]
4    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 0.007843, (300, 300), 127.5)

blobFromImageЭто предварительная обработка изображения для последующей классификации с помощью глубокого обучения.Эта функция очень важна, и настройка ее параметров определяет эффект распознавания.
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True,crop=False,ddepth = CV_32F )Параметр Описание

image: входящее изображение, используемое здесьresizeУстановите размер изображения 300*300.

масштабный фактор: Коэффициент масштабирования, по умолчанию равен 1, что имеет хорошие отношения с моделью и оказывает большое влияние на точность распознавания.

size: Размер изображения после масштабирования.

среднее: среднее значение для вычитания, которое может быть тройкой средних значений R, G, B или значением. Это значение вычитается из каждого канала, и среднее значение вычитается. Порядок каналов: R, G, Б. Если порядок каналов входного изображения — B, G, R, убедитесь, чтоswapRB = True, обменный канал.

swapRB: OpenCV считает, что порядок канала изображения — B, R, G, а порядок — R, G, B при вычитании среднего, и порядок меняется после его включения.

урожай: урожай.

ddepth: глубина выходного большого двоичного объекта.

Короче говоря, каждый параметр здесь важнее и нуждается в небольшой корректировке в соответствии с разными моделями.

1net.setInput(blob)
2detections = net.forward()

Установите большой двоичный объект в качестве входа в сеть, а затем выполните прямое распространение.

 1    for i in np.arange(0, detections.shape[2]):
2        probability = detections[0, 0, i, 2]
3        if probability > args["probability"]:
4            idx = int(detections[0, 0, i, 1])
5            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
6            (startX, startY, endX, endY) = box.astype("int")
7            label = "{}: {:.2f}%".format(CLASSES[idx], probability * 100)
8            cv2.rectangle(frame, (startX, startY), (endX, endY), COLORS[idx], 2)
9            y = startY - 15 if startY - 15 > 15 else startY + 15
10            cv2.putText(frame, label, (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)

detection.shape[2]Должен ли он возвращать количество идентификаций? ,такiЗначение(0,100).

detection[0, 0, i, 2]Это соответствующий показатель точности каждого распознавания.

Когда уровень точности превышает минимальное значение (установленное в аргументе), добавьте метку к распознанному изображению.

detection[0, 0, i, 1]Соответствующим является серийный номер (ID) распознанного объекта.

detection[0, 0, i, 3:7]* np.array([w, h, w, h])Соответственно координаты положения кадра распознанного объекта преобразуются в целые числа.

Окончательное соответствие заключается в размещении метки поверх изображения.

1    cv2.imshow("Frame", frame)
2    key = cv2.waitKey(1) & 0xFF
3    if key == ord("q"):
4        break
5cv2.destroyAllWindows()
6vs.stop()

Отделочные работы.