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()
Отделочные работы.