基於opencv的安全帽佩戴檢測


最近老板在外面吹牛說我們可以做基於工地的監控,檢測工人佩戴安全帽的情況。現在國內做圖像識別的公司基本都是頂尖的技術公司了,可以參考的案例並不多,咨詢了像海康這樣的專門做視頻的公司,銷售人員說沒有產品,可以做項目。那費用至少幾十萬上百萬了。可海康官網明明說有檢測安全帽功能的(心里暗罵一句,騙子)。找別人開發的成本太高,沒辦法只能硬着頭皮上了。好在有一個圖像處理神器opencv。只不過現在大多數的應用都是圍繞在臉部,什么人臉檢測啊,人臉識別啊。難得找到一個現成的行人檢測分類器,經過測試發現效果還可以接受。附效果圖一張。

綠框是檢測到的行人。

# -*- coding: utf-8 -*-
# 行人檢測
import cv2
from imutils.object_detection import non_max_suppression
from imutils import paths
from imutils.video import FileVideoStream
import numpy as np
import os,imutils 
cap = FileVideoStream(r'E:\test-3_000130-000849.mp4').start()
hog = cv2.HOGDescriptor()   
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
frame_index = 0
while True:
    frame = cap.read()
    frame = imutils.resize(frame, width=min(800, frame.shape[1]))
    (rects, weights) = hog.detectMultiScale(frame, winStride=(8, 8), padding=(8, 8), scale=1.15)
    rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])
    pick = non_max_suppression(rects, probs=None, overlapThresh=0.65)

    for (x, y, w, h) in pick:
        cv2.rectangle(frame, (x, y), (w, h), (0, 255, 0), 2)
        newpath = os.path.join(r'image/capture/' , str(frame_index) + ".jpg");
        cv2.imwrite(newpath,frame[y:h,x:w]);
        frame_index = frame_index + 1
    cv2.imshow("frame",frame)
    if cv2.waitKey(1) == 27:
        break
   

  python的代碼很簡單,以上20幾行就是檢測行人的全部代碼了。

經過幾番調整參數,檢測效果還算理想。這樣就可以有做下去的希望了。在網上尋找一番沒有找到已經訓練好的用於檢測安全帽的分類器,無耐只能自己收集素材,進行訓練。收集素材真是一項苦差事。好在我有數據源,通過抓取攝像頭的視頻流,沒幾天我們就收集了幾十萬的素材,當然這里面有很多錯誤數據,需要人工的一一剔除。最終 產生了大量的這樣的素材,

這些圖片包含的特征信息過多,還不能用於訓練 。經過人工處理以后變成如下格式。

有了正樣本,訓練還需要反樣本。好在之前下載過一套行人檢測的樣本庫,可以利用里面的反樣本,拿着處理好的幾百張素材,信心滿滿的去訓練了,訓練的過程就不詳說了,網上有很多教程。我自己寫了一個工具,用於產生訓練需要的文檔信息。訓練的過程還算順利,通過這兩百多個手工處理的樣本,識別出了大概2000多張對應的數據。錯誤率在可以接收的范圍內。接下來我就掉入了第一個坑,一開始以為隨着素材庫的變大,識別的內容會越精確 。這樣我就拿200 -> 2000 -> 5000 -> 10000 ,訓練所花的時間快速增加,一開始花10幾20分鍾就可以完成,后面逐漸兩個小時,半天,一晚上。最后我拿着一萬個樣本扔到服務器上去訓練的時候,記得那天是周五的白天,心想周一肯定可以看結果了吧。結果周一上班發現竟然沒有完成。直到周二才完成。整整 花了60多個小時。可是最終識別結果並不理想。無法有效識別戴安全帽和不戴安全帽的人員,識別率過低。

經過思考以后發現可能是樣本存在的問題,那么就近一步的縮小樣本,只保留安全帽部分。接下來的效果就比較理想了,我用了1000個樣本訓練的結果,就遠超之前10000個樣本的識別率了。

雖然識別率還不是很理想,但還有很大的優化空間。至少可以證明這個思路是正確的。

雖然圖片可以實現有效的檢測,但應用到視頻流中由於單禎的處理時間過長,導致視頻無法流暢播放。最后經過大量的優化,效果還是比較理想。

 

鏈接:https://download.csdn.net/download/shushukui/11617089

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM