假如 ,使用訓(xùn)練好的模型在驗證集上的準(zhǔn)確率是99% ,那就是平均100張有1張錯誤。在視頻識別的過程中,如果視頻幀數(shù)為比較低的30幀,那也代表3秒內(nèi)平均有3次錯誤。如果是流暢視頻就更高了。
理論上模型的識別是幾乎沒有到達(dá)100%。損失函數(shù)也幾乎不可能為0,那樣幾乎就是過擬合了。
為了提高在視頻里面的識別準(zhǔn)確率,采用多次判別,并且每次判別結(jié)果都一致之后,才進(jìn)行輸出。這是我常采用的方法。
number_count = 0
number =0
N_K = 0
def judge_number(frame,count=5):
#在判定殺人的情況下,判定擊殺人數(shù)
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 來判別 連續(xù)5個畫面都有查找到需要識別的內(nèi)容
- 然后使用 N_k 來判別,連續(xù)90次的結(jié)果都是一致的才進(jìn)行輸出
在幀數(shù)為60的視頻里,90次的畫面判別也只需要1.5秒。在我目前做的項目中已經(jīng)可以達(dá)到要求。關(guān)鍵是不能輸出錯誤的結(jié)果
如果調(diào)整的連續(xù)正確畫面數(shù)目太大,可能會造成沒有輸出;但是調(diào)小之后如果造成輸出不準(zhǔn)確,有兩個方面進(jìn)行考慮:
- 調(diào)整N_K 參數(shù),到合適的范圍(這是個費時間的過程);
- 提高模型的準(zhǔn)確率,提高方法就有許多了 :)