AI爆火的2023年,也是我开始学习AI的第一年,从后端领域向AI领域发展也是一个不错的选择。是什么原因让我觉得AI领域更值得钻研和发展呢?其实之前的文章也能体现出来,AI的爆火在于它确实能促进整个社会中大多人群的学习工作和生活的效率的提升,这是非常实用的。我要和大家分享的项目也是我学习AI过程中做的小项目,是利用视频分析技术结合深度学习构建的一个智能视频监控系统,用来进行实时监测和分析人员活动,提供监测识别和报警等功能,还能用于大数据分析,远程访问和管理等等。下面我将使用软件工程的思路,为大家详细介绍我是如何使用深度学习与视频分析技术构建项目的。
需求分析
这可能是一个与本文主题关联不大的模块,为了能让读者清楚了解项目背景,就简单总结几点项目需求。首先在功能方面,系统大致需要能解码视频并提取关键帧用于人脸检测和行为识别,并且要能展示分析结果,包括标注人脸和行为,还能够实时报警。系统性能方面,要在实时场景下对大量视频数据进行处理和分析,所以需要有高效的算法和硬件支持,简而言之性能上必须要符合要求。还有一个很重要的问题就是安全方面,要确保视频数据的安全和隐私的保护,禁止没有授权的访问和篡改等恶意操作。
技术可行性
做项目之前,也是查了很多资料,确保项目能顺利实施。视频监控项目一般都需要进行视频流的采集,并且处理视频流,这里我选用的是图像处理库(如OpenCV)对视频流进行预处理,这些技术也已经非常成熟。视频还需要进行解码与帧的提取,这是为了方便后续的人脸检测和行为识别,使用了oneAPI加速工具对视频进行解码。人脸检测模块使用了OpenVINO™ Toolkit中的人脸检测模型,可以对每个关键帧进行实时的检测人脸,此工具包含了经训练和优化的模型,可行性也还不错。行为识别模块采用了Distribution of OpenVINO™ Toolkit中的行为识别模型,对监控区域内的人员活动进行分析,这些技术也都很成熟,实施起来成功率是较高的。有了一些技术支撑,后面的项目才能更好的进行,从软件工程角度来说,一个完整的需求分析和可行性分析,是一个项目是否能成功的重要关注点。
详细设计
数据采集后需要使用适当的图像处理库(如OpenCV)对视频流进行预处理,如去噪、降低分辨率等。去噪处理是因为实时视频流可能会受一些干扰,摄像头本身的噪声,光线变化等都会有影响,不能放过这些细节。去噪处理后也能获得更高质量的视频流。
#读原始帧
frame = cv2.imread("original_frame.jpg")
#去噪
denoised_frame = cv2.GaussianBlur(frame, (5, 5), 0)
#显示结果
cv2.imshow("Denoised Frame", denoised_frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
还有一个小技巧,对视频流进行降低分辨率处理,这样可以减少数据量和计算复杂度,同时也能加快后续人脸检测和行为识别的处理速度,这也很关键。
#读原始帧
frame = cv2.imread("original_frame.jpg")
#降低分辨率处理
scaled_frame = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5)
#显示降低分辨率后的结果
cv2.imshow("Scaled Frame", scaled_frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过降噪和降低分辨率处理能使得后续的步骤更加高校和准确,这相当于项目的前置工作。
获得了经处理的视频流,还需要进行解码和帧提取。做项目过程中,我发现其实并不需要对视频的每一帧都进行人脸检测和行为识别,因为视频数据通常都会包含大量的冗余信息,所以帧提取的过程中,选择提取视频中的关键帧就能达到目的,然后对这些关键帧进行后续的处理和分析。这样做能提高不少帧提取的效率,时间就是金钱嘛,保证质量的同时,效率自然越高越好咯。
#视频帧计数器
frame_count = 0
#提取间隔,每隔5帧提取一次
extract_interval = 5
#逐帧读取视频
while video_capture.isOpened():
#读取一帧
ret, frame = video_capture.read()
if not ret:
break
#如果达到提取间隔,保存当前帧为关键帧
if frame_count % extract_interval == 0:
key_frame_name = 'keyframe_{}.jpg'.format(frame_count)
cv2.imwrite(key_frame_name, frame)
print('Saved key frame: {}'.format(key_frame_name))
frame_count += 1
video_capture.release()
cv2.destroyAllWindows()
下来就是最重要的人脸检测和行为识别,人脸检测需要从上述获取的关键帧进行人脸检测,这里也是应用了深度学习领域的知识。我给出核心步骤代码
#读取关键帧
frame = cv2.imread("keyframe.jpg")
#预处理
input_blob = cv2.dnn.blobFromImage(frame, size=(300, 300), ddepth=cv2.CV_8U)
#推理
result = exec_net.infer(inputs={'input_blob_name': input_blob})
#解析结果for detection in result['detection_out']:
confidence = detection[2]
if confidence > 0.5:
x_min, y_min, x_max, y_max = detection[3:7]
cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)
行为识别使用了TensorFlow进行训练得到的行为识别模型,对关键帧预处理后输入到模型中进行推理然后得到预测的结果,并且将结果进行标注展示给监控人员,如下是部分代码。
#加载模型
model = tf.keras.models.load_model('behavior_model.h5')
#读取关键帧
frame = cv2.imread("keyframe.jpg")
#对关键帧进行预处理
processed_frame = preprocess_image(frame)
#进行图像预处理,调整大小、归一化等操作
#使用模型进行推理
predictions = model.predict(processed_frame)
#获取最终的行为识别结果
predicted_behavior = get_predicted_behavior(predictions)
#根据模型输出行为识别结果
#在图像上标注行为识别结果
cv2.putText(frame,predicted_behavior,(50,50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 显示带有行为识别结果标注的图像
cv2.imshow("Behavior Recognition", frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
测试结果
测试过程中,系统能实时从摄像头中获取到视频流,并在关键帧上进行人脸检测和实时结果的展示。
在发现异常情况时,还标记了人脸检测和行为识别结果的关键帧保存用来作为报警记录,以便后续的查看和分析,是将结果帧保存为图片文件来实现的。
以上就是本项目的大致细节,有兴趣的朋友可以尝试动手实践交流了,有问题也欢迎探讨~
未来,我相信随着深度学习技术和硬件技术的不断发展,智能监控系统会实现更高精度和更快速的处理能力,为安防领域带来更多保障,通过项目的上手实践,会对深度学习领域有更深的理解。学习这件事就像大家所说的一群人才会走的更远,新的一年期待AI继续火爆,期待能与各位伙伴在社区共同交流学习! infoq原文链接:我的深度学习项目经验分享_AI_小王撤了_InfoQ写作社区