人头检测算法,人流量统计,人计数
人头检测在安防监控中是比较常用的功能,而公交车、商场或者大型场馆的拥挤人群计数的精准性也非常重要。
import cv2
import os
import shutil
import numpy as np
import tensorflow as tf
import core.utils as utils
from core.config import cfg
from core.yolov3 import YOLOV3
from PIL import Image
import imutils
from time import *
class YoloTest(object):
def __init__(self):
self.input_size = cfg.TEST.INPUT_SIZE
self.anchor_per_scale = cfg.YOLO.ANCHOR_PER_SCALE
self.classes = utils.read_class_names(cfg.YOLO.CLASSES)
self.num_classes = len(self.classes)
self.anchors = np.array(utils.get_anchors(cfg.YOLO.ANCHORS))
self.score_threshold = cfg.TEST.SCORE_THRESHOLD
self.iou_threshold = cfg.TEST.IOU_THRESHOLD
self.moving_ave_decay = cfg.YOLO.MOVING_AVE_DECAY
self.annotation_path = cfg.TEST.ANNOT_PATH
self.weight_file = cfg.TEST.WEIGHT_FILE
self.write_image = cfg.TEST.WRITE_IMAGE
self.write_image_path = cfg.TEST.WRITE_IMAGE_PATH
self.show_label = cfg.TEST.SHOW_LABEL
with tf.name_scope('input'):
self.input_data = tf.placeholder(dtype=tf.float32, name='input_data')
self.trainable = tf.placeholder(dtype=tf.bool, name='trainable')
model = YOLOV3(self.input_data, self.trainable)
self.pred_sbbox, self.pred_mbbox, self.pred_lbbox = model.pred_sbbox, model.pred_mbbox, model.pred_lbbox
with tf.name_scope('ema'):
ema_obj = tf.train.ExponentialMovingAverage(self.moving_ave_decay)
self.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))
self.saver = tf.train.Saver(ema_obj.variables_to_restore())
self.saver.restore(self.sess, self.weight_file)
def predict(self, image):
org_image = np.copy(image)
org_h, org_w, _ = org_image.shape
image_data = utils.image_preporcess(image, [self.input_size, self.input_size])
image_data = image_data[np.newaxis, ...]
pred_sbbox, pred_mbbox, pred_lbbox = self.sess.run(
[self.pred_sbbox, self.pred_mbbox, self.pred_lbbox],
feed_dict={
self.input_data: image_data,
self.trainable: False
}
)
pred_bbox = np.concatenate([np.reshape(pred_sbbox, (-1, 5 + self.num_classes)),
np.reshape(pred_mbbox, (-1, 5 + self.num_classes)),
np.reshape(pred_lbbox, (-1, 5 + self.num_classes))], axis=0)
bboxes = utils.postprocess_boxes(pred_bbox, (org_h, org_w), self.input_size, self.score_threshold)
bboxes = utils.nms(bboxes, self.iou_threshold)
return bboxes
# ----------------------------------------------------------------------------------------------------------------------
if __name__ == '__main__':
yolo = YoloTest()
vs = cv2.VideoCapture("./test/q.mp4")
writer = None
start_time = time()
while True:
_, frame = vs.read()
bboxes = yolo.predict(frame)
frame, count = utils.draw_bbox(frame, bboxes)
cv2.putText(frame, str(count), (20, 100), cv2.FONT_HERSHEY_COMPLEX, 3, (0, 0, 255), 3)
if writer is None:
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
writer = cv2.VideoWriter("./out/out.mp4", fourcc, 25, (frame.shape[1], frame.shape[0]), True)
writer.write(frame)
frame = imutils.resize(frame, width=600)
cv2.imshow("", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# ----------------------------------------------------------------------------------------------------------------------
我尝试了用yolo实现了人头计数。效果如图:
效果视频:
-
python-yolo人数统计,人流量检测
项目代码下载:
pythonyolo视频人头计数人流量监测景区人流量监测教室人头检测源码已商用-互联网文档类资源-CSDN下载
0基础小白部署该项目视频教程: