前言
大一申报的大创项目,没办法自己申报的项目,哭着也得做完,总的来说真正开始搞得时间就是最后一个月
这篇文章只是记录了我做项目时遇到的一些问题以及解决方案,不讨论具体实现和源码。
项目简介
基于OpenCV-python和python3.6的课堂动态识别系统,可自动估算教室人数,计算课堂抬头率(即专注度),并评定一节课的课堂质量。
一. 为什么用OpenCV-python而非OpenCV-C++:
主要原因是对于入门者来说困难,python相比于C++更简单,更容易理解。
薄弱的文档 :C++文档很少会贴出代码的例子,以致于理解变得更加得困难。尽管贴出的代码有用,但是其也并非很好地被记录在文档中。#附上OpenCV中文文档
一个计算机视觉引擎时常需要大量的机器学习程序。然而,相比于 OpenCV(Python),OpenCV(C++)只含有一个小型的机器学习算法子集。
python有了 OpenCV、 numpy 、 scipy 、 scikit-learn 以及 matplotlib ,在计算机视觉领域和机器学习领域,提供了一个学习和实验的强大环境。
#5. 其实我也尝试过api端口,亲测利用opencv-python可以实现。
二. 为何在实现统计人数功能时不使用OpenCV:
统计人数时视频很卡顿。
opencv只能识别正脸,当低头、侧脸时无法检测。(后面引进一个强大的工具
ImageAI
)算法相对基础,实际应用误差大。(测试时3米以外很难识别,而imageai10米内问题不大)
本人对opencv相关知识掌握不到位,利用工具比较方便。
三. 什么是ImageAI?
ImageAI
是一个python库,旨在使开发人员能够使用简单的几行代码构建具有包含深度学习和计算机视觉功能的应用程序和系统。 ImageAI本着简洁的原则,支持最先进的机器学习算法,用于图像预测,自定义图像预测,物体检测,视频检测,视频对象跟踪和图像预测训练。ImageAI目前支持使用在ImageNet-1000数据集上训练的4种不同机器学习算法进行图像预测和训练。ImageAI还支持使用在COCO数据集上训练的RetinaNet进行对象检测,视频检测和对象跟踪。 最终,ImageAI将为计算机视觉提供更广泛和更专业化的支持,包括但不限于特殊环境和特殊领域的图像识别。
#附上ImageAI 中文文档 , 幸运的是,基本用法介绍很详尽,可以放心学习。
四.为什么用ImageAI?
优点:深度学习库,训练模型样本大,不需要自己训练模型,算法简洁,节约时间精力,识别精确度。
缺点:可以分析输入的图片视频,但无法实时检测监控中画面。
(转换思路——固定间隔截取一帧画面,将视频分析转为对图片的分析,实现统计人数的作用)
五.具体实现流程:
调出系统摄像头
通过Haar级联实时检测人脸(Haar 级联不具有旋转不变性,即不认为侧面照与正面照是相同的)
统计出正脸人数(视为专心听讲人数)
固定时间间隔截取一帧画面
利用imageai对图片进行分析,统计出总人数
总人数与正脸人数做差,计算出低头或转头的人数,视此部分人数即为听讲不专注人数
计算班级整体专注度,评价课堂质量
六.克服困难及设计思路:
首先,预想的实时视频中分析与统计人数的实现相对困难: 此项目要求精准对相对较高,利用opencv Haar级联检测人脸精准度低且测试距离短,且运行后画面卡顿(不明原因),很难符合要求。
因此寻找到更强大的工具——ImageAI,它可以解决人不同姿势的识别问题,但是缺陷是不能通过摄像头对画面进行实时检测物体,于是转换思路,通过截取一帧画面,将视频分析问题转化为图片分析问题,进而实现人数的统计的功能。
上课的专注程度问题复杂,我尝试过通过分析眨眼频率来判断人是否困倦,事实证明当只分析一个人时功能正常实现(且只能分析正脸),但是这种算法无法做到多人实时检测。于是反向思维,即不分析睡觉的同学,而是分析认真听讲的同学,如果能统计出这一部分人,做差便是不专心的同学人数。于是利用Haar级联精准度低的特点,测出正脸人数,其余便是不专注学生数量(包括低头、转头或转身)。
设定课堂质量评价标准,以班级专注度为标准,专注度>85%,课堂质量为优;50%<专注度<85%,课堂质量为中;专注度<50%,课堂质量为差。
七.存在的问题bug:
对于光线要求比较高,在昏暗条件下(如阴天)效果不好。
测试距离不足,对于面积大的教室效果欠佳。
学生的眼镜有一定干扰,带上眼镜后识别准确度会有所下降。
人数多而密集时,精准度也会大大降低。
八.README.md:
本项目利用 OpenCV
、 ImageAI
和 Python3
完成,经测试适用于人数不多、采光较好的小教室。
时间仓促,程序简陋,测试结果粗略,仅以学习为目的,仅供参考。