作者 | 李秋键
责编 | Carol
封图 | CSDN 下载自视觉中国
众所周知随着人工智能智能的发展,人工智能的落地项目也在变得越来越多,尤其是计算机视觉方面。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
所以今天我们也是做一个计算机视觉方面的训练,用python来判断用户溺水行为,结合姿态识别和图像识别得到结果。其中包括姿态识别和图像分类。
首先图像分类是根据各自在 图像信息 中所 反映 的不同特征,把不同类别的目标区分开来的图像处理方法。 它是利用计算机对图像 进行 定量 分析 ,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读 。
人体姿态是被主要分为基于计算机视角的识别和基于运动捕获技术的识别。基于计算机视觉的识别主要通过各种特征信息来对人体姿态动作进行识别, 比如视频图像序列、人体轮廓、多视角等。
这里整体程序的流程如下:
-
百度姿态识别图片并标注
-
CNN网络实现图像分类
-
根据分类结果可视化输出结果
最终输出的程序效果如下图:
一、实验前的准备
首先我们使用的python版本是3.6.5所用到的模块如下:
OpenCV:用来调用姿态识别接口绘制姿态识别结果
Baidu-aip:用来加载人体分析模块实现人体姿态识别
configparser :配置文件模块 读写配置文件
keras:用来训练和调用神经网络模型
素材准备
首先我们准备不同的图片放到一个特定文件夹下。图片分为三个类别,一个是溺水图片文件夹,一个是正常游泳图片文件夹,另一个是疑似溺水无法判定的图片文件夹。在这里我们把它放到data文件夹下,
其中疑似图片文件夹,如下图可见:
人体姿态识别搭建
1、姿态配置文件设定:
在这里为了足够的精度和方便调用,我们使用百度提供的人体分析接口。按照官方的规定设定了配置文件。主要就是设定人体各个肢体零件连接配置。
其对应的代码如下:
def draw_line(self, img):
# nose ---> neck
cv2.line(img, (int(self.dic['nose']['x']), int(self.dic['nose']['y'])),
(int(self.dic['neck']['x']), int(self.dic['neck']['y'])), (0, 255, 0), 2)
# neck --> left_shoulder
cv2.line(img, (int(self.dic['neck']['x']), int(self.dic['neck']['y'])),
(int(self.dic['left_shoulder']['x']), int(self.dic['left_shoulder']['y'])), (0, 255, 0), 2)
# neck --> right_shoulder
cv2.line(img, (int(self.dic['neck']['x']), int(self.dic['neck']['y'])),
(int(self.dic['right_shoulder']['x']), int(self.dic['right_shoulder']['y'])), (0, 255, 0), 2)
# left_shoulder --> left_elbow
cv2.line(img, (int(self.dic['left_shoulder']['x']), int(self.dic['left_shoulder']['y'])),
(int(self.dic['left_elbow']['x']), int(self.dic['left_elbow']['y'])), (0, 255, 0), 2)
# left_elbow --> left_wrist
cv2.line(img, (int(self.dic['left_elbow']['x']), int(self.dic['left_elbow']['y'])),
(int(self.dic['left_wrist']['x']), int(self.dic['left_wrist']['y'])), (0, 255, 0), 2)
# right_shoulder --> right_elbow
cv2.line(img, (int(self.dic['right_shoulder']['x']), int(self.dic['right_shoulder']['y'])),
(int(self.dic['right_elbow']['x']), int(self.dic['right_elbow']['y'])), (0, 255, 0), 2)
# right_elbow --> right_wrist
cv2.line(img, (int(self.dic['right_elbow']['x']), int(self.dic['right_elbow']['y'])),
(int(self.dic['right_wrist']['x']), int(self.dic['right_wrist']['y'])), (0, 255, 0), 2)
# neck --> left_hip
cv2.line(img, (int(self.dic['neck']['x']), int(self.dic['neck']['y'])),
(int(self.dic['left_hip']['x']), int(self.dic['left_hip']['y'])), (0, 255, 0), 2)
# neck --> right_hip
cv2.line(img, (int(self.dic['neck']['x']), int(self.dic['neck']['y'])),
(int(self.dic['right_hip']['x']), int(self.dic['right_hip']['y'])), (0, 255, 0), 2)
# left_hip --> left_knee
cv2.line(img, (int(self.dic['left_hip']['x']), int(self.dic['left_hip']['y'])),
(int(self.dic['left_knee']['x']), int(self.dic['left_knee']['y'])), (0, 255, 0), 2)
# right_hip --> right_knee
cv2.line(img, (int(self.dic['right_hip']['x']), int(self.dic['right_hip']['y'])),
(int(self.dic['right_knee']['x']), int(self.dic['right_knee']['y'])), (0, 255, 0), 2)
# left_knee --> left_ankle
cv2.line(img, (int(self.dic['left_knee']['x']), int(self.dic['left_knee']['y'])),
(int(self.dic['left_ankle']['x']), int(self.dic['left_ankle']['y'])), (0, 255, 0), 2)
# right_knee --> right_ankle
cv2.line(img, (int(self.dic['right_knee']['x']), int(self.dic[