Encontrar infracciones en video usando visión por computadora

Supongamos que esta violación es posible. ¿Cómo identificarlo?





Tenemos a nuestra disposición registros de cámaras de vigilancia del lugar de trabajo del empleado y un registro de operaciones.





Buscaremos todos los momentos del registro en los que el cliente estuvo ausente. La red neuronal MobileNet y CSRT Tracker de la biblioteca opencv nos ayudarán con esto. Y para mayor comodidad, también Tesseract-OCR.





Para encontrar una persona en el marco, usaremos la red neuronal MobileNet. Esta red le permite detectar y localizar 20 tipos de objetos en la imagen. Para que funcione, necesita descargar dos archivos: arquitectura y pesos. Estos archivos se pueden encontrar en el repositorio de Github .





Antes de escribir el código, necesitamos instalar la biblioteca de visión por computadora cv2 y el paquete pytesseract para procesar texto en imágenes. 





!pip install opencv-python
!pip install pytesseract
      
      



Para que Pytesseract funcione, primero debe descargar la distribución Tesseract-OCR del sitio web oficial e instalarla.





Comenzando a prepararse para el procesamiento de video





Importamos los paquetes y escribimos la ruta a la carpeta Tesseract-OCR en el entorno local:





import os

video_path = ... #  
tesseract_path = ... #   Tesseract
os.environ["PATH"] += os.pathsep + tesseract_path

import pytesseract
import cv2
import imutils
import pandas as pd
import datetime as dt
      
      



, . , / :





df = pd.DataFrame(columns = ['', '  '])
work_place = () #,   
date = None #      
tracked = False # 
      
      



, . , :





prototxt = 'MobileNetSSD_deploy.prototxt' #
weights = 'MobileNetSSD_deploy.caffemodel' #
      
      



20 , :





classNames = {0: 'background',
              1: 'aeroplane',
              2: 'bicycle',
              3: 'bird',
              4: 'boat',
              5: 'bottle',
              6: 'bus',
              7: 'car',
              8: 'cat',
              9: 'chair',
              10: 'cow',
              11: 'diningtable',
              12: 'dog',
              13: 'horse',
              14: 'motorbike',
              15: 'person',
              16: 'pottedplant',
              17: 'sheep',
              18: 'sofa',
              19: 'train',
              20: 'tvmonitor'}
      
      



, .





thr = 0.1 # 
      
      



:





net = cv2.dnn.readNetFromCaffe(prototxt, weights) #
      
      



cv2.VideoCapture, :





cap = cv2.VideoCapture(video_path)
      
      



, .read(), . , . . :





%%time

cap = cv2.VideoCapture(video_path)

total_frame = 0
while True:
    success, frame = cap.read()
    if success:
        total_frame += 1
    else:
        break
        

video_length = ... #   
fps = round(total_frame / video_length)
fps
      
      



  , . 100- 2 .









, , , . , , .





while cap.isOpened():

    ret, frame = cap.read()
    
    if ret:
        
        frame = imutils.resize(frame, width=1200) # ,   


        #  ,    
        if len(work_place) == 0:
            cv2.putText(frame, 'Set the client\'s location', (0, 90), cv2.FONT_HERSHEY_SIMPLEX, 
                2, (0,255,0), 2)
            work_place = cv2.selectROI('frame', frame, fromCenter=False, showCrosshair=True)
            x, y, w, h = [int(coord) for coord in work_place]
            
        # 
        if not date:
            try:
                cv2.putText(frame, 'Set the date, (0, 160), cv2.FONT_HERSHEY_SIMPLEX, 
                    2, (0,255,0), 2)
                date = cv2.selectROI('frame', frame, fromCenter=False, showCrosshair=True)
                date_x, date_y, date_w, date_h = [int(coord) for coord in date]
                date_ = frame[date_y : date_y+date_h, date_x : date_x+date_w]
                date_ = cv2.cvtColor(date_, cv2.COLOR_BGR2GRAY) #   
                #date_ = cv2.threshold(date_, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
                date_ = cv2.threshold(date_, 180, 255, 0)[1] #     
                date = pytesseract.image_to_string(date_)
                date = dt.datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
                
            except:
                print('   ,      -- ::')
                date_ = input()
                date = dt.datetime.strptime(date_, '%Y-%m-%d %H:%M:%S')
                

        if cap.get(1) % fps == 0:
            date += dt.timedelta(seconds = 1)
        
        if not tracked or (cap.get(1) % (fps * 30) == 0):

            # 
            frame_resized = cv2.resize(frame, (300, 300)) #   300  300 
            blob = cv2.dnn.blobFromImage(frame_resized, 0.007843, 
                                         (300,300), (127.5, 127.5, 127.5), False)

            #    
            net.setInput(blob)
            detections = net.forward() 
            #[0, 0, object, [0, class_id, confidence, xLeftBottom, yLeftBottom, xRightTop, yRightTop]]

            #   
            cols = frame_resized.shape[1]
            rows = frame_resized.shape[0]

            #       
            for obj in detections[0,0, :, :]:
                confidence = obj[2]
                if confidence > thr:

                    class_id = int(obj[1])
                    if class_id == 15:

                        xLeftBottom = int(obj[3] * cols)
                        yLeftBottom = int(obj[4] * rows)
                        xRightTop   = int(obj[5] * cols)
                        yRightTop   = int(obj[6] * rows)

                        #     
                        heightFactor = frame.shape[0] / 300.0
                        widthFactor = frame.shape[1] / 300.0

                        #    
                        xLeftBottom = int(widthFactor * xLeftBottom)
                        yLeftBottom = int(heightFactor * yLeftBottom)
                        xRightTop   = int(widthFactor * xRightTop)
                        yRightTop   = int(heightFactor * yRightTop)

                        #    
                        xCenter = xLeftBottom + (xRightTop - xLeftBottom)/2
                        yCenter = yLeftBottom + (yRightTop - yLeftBottom)/2

                        #     
                        if xCenter < x + w and yCenter < y + h and xCenter > x and yCenter > y:
                            tracker = cv2.TrackerCSRT_create()
                            tracker.init(frame, (xLeftBottom, yLeftBottom, xRightTop-xLeftBottom, yRightTop-yLeftBottom))
                            tracked = True
                            cv2.rectangle(frame, (xLeftBottom,yLeftBottom), (xRightTop,yRightTop), (0,255,0), 3, 1)
                            break
                        else:
                            tracked = False
        else:
            _, bbox = tracker.update(frame)
            X, Y, W, H = [int(coord) for coord in bbox]

            xCenter = X + W/2
            yCenter = Y + H/2
            
            if xCenter < x + w and yCenter < y + h and xCenter > x and yCenter > y:
                
                tracked = True
                cv2.rectangle(frame, (X,Y), (X + W, Y + H), (255,255,0), 3, 1)
            else:
                tracked = False

        cv2.imshow('frame', frame)
        df.loc[cap.get(1), :] = [date, tracked]
        print(cap.get(1), date, tracked) #  ,   / 
        if cv2.waitKey(1) == 27: #ESC
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()
      
      



.read() : , , – . , , , .





. , «-- ::». , : , . date



.





Tesseract-

, . , , .





.get() 1 , , fps



, date



. tesseract, , .





  : cv2.resize() cv2.dnn.blobFromImage(). , . , detections



. , 20 .





  , 15. , , tracked



True . tracked



date



df



.





  , . , tracked



True False, .





  . , , . .





  , / . , , . , .





df_ = df.groupby('', as_index=False).agg(max)
df_.to_excel('output.xlsx', index=False)
      
      



, :





  • . , . opencv. , , .





  • . .





  • . , , . «» , .





El primer y segundo problema pueden resolverse mediante rastreadores basados ​​en el aprendizaje profundo. Por ejemplo, un rastreador GOTURN



. Este rastreador está implementado en la biblioteca opencv



, pero para su funcionamiento es necesario descargar archivos adicionales. También puede utilizar el rastreador popular Re3



o el rastreador introducido recientemente AcurusTrack



. El tercer problema se puede resolver reemplazando la red neuronal y / o reentrenándola en personas sentadas.





Enlace al código .








All Articles