背景

最近在参加一个作弊行为分析的比赛,数据集是由比赛方提供的,也是被标注的。对于数据标注,我也进行了一些尝试。

赛题

我们最终目标是从真实考场视频录像中检测出谁在什么时候作弊,以及作弊的类型,如看手机,扔纸团等。
现阶段我们通过员工录制模拟作弊视频,视频有十段,每段比较类似,都是考场固定30个座位,有二,三十人按照以下顺序作弊:
作弊类型:(视频也是根据这个顺序录制的,扔是单人行动,传是两人手与手之间的传动)
1.拿出包放到桌上,
2.低头拿出手机等偷看
3.扔纸团到前桌桌上
4.扔纸团给后桌桌上,
5.扔纸团给左边桌上
6.扔纸团给右边桌上
7.传纸条给前桌
8.传纸条给后桌
9.传纸条给左桌
10.传纸条给右桌
11.扔纸团到前桌地上
12.扔纸团到后桌地上
13.扔纸团到左桌地上
14.扔纸团到右桌地上
15.捡纸团 (捡纸团可能出现在前面行动中,因为可能纸团掉在地上都会去捡)
16.打开纸团 (打开纸团前面行动也会有,不管是扔纸团还是传)
带试卷出场

数据标注

对于视频数据的标注的要求是需要找出各种作弊行为对应的所在帧数。
第一行是关注区域四个点坐标,这个区域不能太大,以至于其他同学干扰,不能太小,以至于关注的人动作被剪裁。
第二行开始每一个作弊行为一行,每一行起始帧结束帧作弊类型。下图就是示例:

数据示例
数据示例

对于视频数据的标注,就需要用到OpenCV了,初步的想法是:

  1. 将指定个某个人的位置框出来
  2. 实时显示帧率

不过这也有个小问题,人的动作行为太快,帧率也很快,人工标注是有误差的。尽管如此,我还是对几个样本数据进行了标注,代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2

cap = cv2.VideoCapture('./7.mp4')
frame_count = 0
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
frame = frame[100:250,950:1100]
font = cv2.FONT_HERSHEY_SIMPLEX
frame_count = frame_count + 1
cv2.putText(frame, str(frame_count),(0,30), font, 0.5,(255,255,255),2,cv2.LINE_AA)
cv2.imshow('frame',frame)
c = cv2.waitKey(1)
if cv2.waitKey(1) & 0xFF == ord(' '):
cv2.waitKey(0)
elif c == 27:
break
else:
break

cap.release()
cv2.destroyAllWindows()

左上角的白色数据就是帧数,这里的视频就是规定显示的视频区域,由此可以根据要求标注数据。

区域视频
区域视频