假如 ,使用训练好的模型在验证集上的准确率是99% ,那就是平均100张有1张错误。在视频识别的过程中,如果视频帧数为比较低的30帧,那也代表3秒内平均有3次错误。如果是流畅视频就更高了。
理论上模型的识别是几乎没有到达100%。损失函数也几乎不可能为0,那样几乎就是过拟合了。
为了提高在视频里面的识别准确率,采用多次判别,并且每次判别结果都一致之后,才进行输出。这是我常采用的方法。
number_count = 0
number =0
N_K = 0
def judge_number(frame,count=5):
#在判定杀人的情况下,判定击杀人数
global kill_number_count
global number
global N_K
cut = cut_number(frame)
cut = cv2.resize(cut,(50,50))
cut = cv2.cvtColor(cut, cv2.COLOR_BGR2LAB)
b, g, r = cv2.split(cut)
out = g
ret,binary=cv2.threshold(out,165,255,cv2.THRESH_BINARY_INV)
binary = np.expand_dims(binary, axis=0)
predict=model.predict(binary)
A = predict[0].tolist()
result = (A.index(max(A)))+1
number_count += 1
if number_count >= count:
if number == result:
N_K += 1
if N_K > 90:
number_count = 0
N_K = 0
return result
number = result
- 使用 count 来判别 连续5个画面都有查找到需要识别的内容
- 然后使用 N_k 来判别,连续90次的结果都是一致的才进行输出
在帧数为60的视频里,90次的画面判别也只需要1.5秒。在我目前做的项目中已经可以达到要求。关键是不能输出错误的结果
如果调整的连续正确画面数目太大,可能会造成没有输出;但是调小之后如果造成输出不准确,有两个方面进行考虑:
- 调整N_K 参数,到合适的范围(这是个费时间的过程);
- 提高模型的准确率,提高方法就有许多了 :)
网友评论