Ejemplo n.º 1
0
            error = 0

    face_location_list = faceutil.get_face_location(image)
    for (left, top, right, bottom) in face_location_list:
        cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2)

    cv2.imshow('Collecting Faces', image)  # show the image
    # Press 'ESC' for exiting video
    k = cv2.waitKey(100) & 0xff
    if k == 27:
        break

    face_count = len(face_location_list)
    if error == 0 and face_count == 0:  # 没有检测到人脸
        print('[WARNING] 没有检测到人脸')
        audioplayer.play_audio(os.path.join(audio_dir, 'no_face_detected.mp3'))
        error = 1
        start_time = time.time()
    elif error == 0 and face_count == 1:  # 可以开始采集图像了
        print('[INFO] 可以开始采集图像了')
        audioplayer.play_audio(
            os.path.join(audio_dir, 'start_image_capturing.mp3'))
        break
    elif error == 0 and face_count > 1:  # 检测到多张人脸
        print('[WARNING] 检测到多张人脸')
        audioplayer.play_audio(
            os.path.join(audio_dir, 'multi_faces_detected.mp3'))
        error = 1
        start_time = time.time()
    else:
        pass
Ejemplo n.º 2
0
class fall:
    # 传入参数
    audio_dir = '/audios'
    ap = argparse.ArgumentParser()
    ap.add_argument("-f", "--filename", required=False, default='', help="")
    args = vars(ap.parse_args())
    input_video = args['filename']
    flag = 1
    # 控制陌生人检测
    fall_timing = 0  # 计时开始
    fall_start_time = 0  # 开始时间
    fall_limit_time = 1  # if >= 1 seconds, then he/she falls.

    # 全局变量
    model_path = 'models/fall_detection.hdf5'
    output_fall_path = 'supervision/fall'
    # your python path
    python_path = '/home/reed/anaconda3/envs/tensorflow/bin/python'

    # 全局常量
    TARGET_WIDTH = 64
    TARGET_HEIGHT = 64

    # 初始化摄像头
    if not input_video:
        vs = cv2.VideoCapture('rtmp://39.100.106.24:1935/stream/pupils_trace')
        time.sleep(2)
    else:
        vs = cv2.VideoCapture(input_video)

    # 加载模型
    model = load_model(model_path)

    print('[INFO] 开始检测是否有人摔倒...')
    # 不断循环
    counter = 0
    while True:
        counter += 1
        # grab the current frame
        (grabbed, image) = vs.read()
        vs.grab()
        vs.grab()
        vs.grab()
        vs.grab()
        vs.grab()

        # if we are viewing a video and we did not grab a frame, then we
        # have reached the end of the video
        if input_video and not grabbed:
            break

        if not input_video:
            image = cv2.flip(image, 1)

        roi = cv2.resize(image, (TARGET_WIDTH, TARGET_HEIGHT))
        roi = roi.astype("float") / 255.0
        roi = img_to_array(roi)
        roi = np.expand_dims(roi, axis=0)

        # determine facial expression
        (fall, normal) = model.predict(roi)[0]
        label = "Fall (%.2f)" % (
            fall) if fall > normal else "Normal (%.2f)" % (normal)

        # display the label and bounding box rectangle on the output frame
        cv2.putText(image, label, (image.shape[1] - 150, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)

        if fall > normal:
            if fall_timing == 0:  # just start timing
                fall_timing = 1
                fall_start_time = time.time()
            else:  # alredy started timing
                fall_end_time = time.time()
                difference = fall_end_time - fall_start_time

                current_time = time.strftime('%Y-%m-%d %H:%M:%S',
                                             time.localtime(time.time()))

                if difference < fall_limit_time:
                    print('[INFO] %s, 走廊, 摔倒仅出现 %.1f 秒. 忽略.' %
                          (current_time, difference))
                else:
                    if (flag == 1):
                        img_name = 'snapshot_%s.jpg' % (
                            time.strftime('%Y%m%d_%H%M%S'))
                        cv2.imwrite(os.path.join(output_fall_path, img_name),
                                    image)
                        path = output_fall_path + "/" + img_name
                        myimg = open(path, 'rb')
                        img_data = myimg.read()
                        audioplayer.play_audio(os.path.join('audios/fall.mp3'))
                        curr_time = datetime.datetime.now()
                        db = pymysql.connect(host='123.57.246.9',
                                             user='******',
                                             password='******',
                                             port=3306,
                                             db='oldcare')
                        cursor = db.cursor()
                        # sql语句
                        sql = "insert into event_info(event_date,event_type,event_desc,event_location) value(now(),3,'有人摔倒!!!','走廊')"
                        try:
                            cursor.execute(
                                "insert into event_info(event_date,event_type,event_desc,event_location,image) value(now(),3,'有人摔倒!!!','走廊',%s)",
                                (img_data))
                            print('Successful')
                            db.commit()
                        except:
                            print('Failed')
                            db.rollback()
                        cursor.close()
                        db.close()
                        flag = 0
                        print('[EVENT] %s, 走廊, 有人摔倒!!!' % (current_time))

        else:  #normal,restart 识别
            flag = 1
            fall_timing = 0
        cv2.imshow('Fall detection', image)

        # Press 'ESC' for exiting video
        k = cv2.waitKey(1) & 0xff
        if k == 27:
            break

    vs.release()
    cv2.destroyAllWindows()
Ejemplo n.º 3
0
class fence:
    # 得到当前时间
    fall_timing = 0  # 计时开始
    fall_start_time = 0  # 开始时间
    fall_limit_time = 2
    current_time = time.strftime('%Y-%m-%d %H:%M:%S',
                                 time.localtime(time.time()))
    print('[INFO] %s 禁止区域检测程序启动了.' % (current_time))
    flag = 1
    # 传入参数
    ap = argparse.ArgumentParser()
    ap.add_argument("-f", "--filename", required=False, default='', help="")
    args = vars(ap.parse_args())

    # 全局变量
    prototxt_file_path = 'models/mobilenet_ssd/MobileNetSSD_deploy.prototxt'
    # Contains the Caffe deep learning model files.
    # We’ll be using a MobileNet Single Shot Detector (SSD),
    # “Single Shot Detectors for object detection”.
    model_file_path = 'models/mobilenet_ssd/MobileNetSSD_deploy.caffemodel'
    output_fence_path = 'supervision/fence'
    input_video = args['filename']
    skip_frames = 30  # of skip frames between detections
    # your python path
    python_path = '/home/reed/anaconda3/envs/tensorflow/bin/python'

    # 超参数
    # minimum probability to filter weak detections
    minimum_confidence = 0.80

    # 物体识别模型能识别的物体(21种)
    CLASSES = [
        "background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus",
        "car", "cat", "chair", "cow", "diningtable", "dog", "horse",
        "motorbike", "person", "pottedplant", "sheep", "sofa", "train",
        "tvmonitor"
    ]

    # if a video path was not supplied, grab a reference to the webcam
    if not input_video:
        print("[INFO] starting video stream...")
        vs = cv2.VideoCapture('rtmp://39.100.106.24:1935/stream/pupils_trace')
        time.sleep(2)
    else:
        print("[INFO] opening video file...")
        vs = cv2.VideoCapture(input_video)

    # 加载物体识别模型
    print("[INFO] loading model...")
    net = cv2.dnn.readNetFromCaffe(prototxt_file_path, model_file_path)

    # initialize the frame dimensions (we'll set them as soon as we read
    # the first frame from the video)
    W = None
    H = None

    # instantiate our centroid tracker, then initialize a list to store
    # each of our dlib correlation trackers, followed by a dictionary to
    # map each unique object ID to a TrackableObject
    ct = CentroidTracker(maxDisappeared=40, maxDistance=50)
    trackers = []
    trackableObjects = {}

    # initialize the total number of frames processed thus far, along
    # with the total number of objects that have moved either up or down
    totalFrames = 0
    totalDown = 0
    totalUp = 0

    # start the frames per second throughput estimator
    fps = FPS().start()

    # loop over frames from the video stream
    while True:
        # grab the next frame and handle if we are reading from either
        # VideoCapture or VideoStream
        ret, frame = vs.read()
        vs.grab()
        vs.grab()
        vs.grab()
        vs.grab()
        vs.grab()

        # if we are viewing a video and we did not grab a frame then we
        # have reached the end of the video
        if input_video and not ret:
            break

        if not input_video:
            frame = cv2.flip(frame, 1)

        # resize the frame to have a maximum width of 500 pixels (the
        # less data we have, the faster we can process it), then convert
        # the frame from BGR to RGB for dlib
        frame = imutils.resize(frame, width=500)
        rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        # if the frame dimensions are empty, set them
        if W is None or H is None:
            (H, W) = frame.shape[:2]

        # initialize the current status along with our list of bounding
        # box rectangles returned by either (1) our object detector or
        # (2) the correlation trackers
        status = "Waiting"
        rects = []

        # check to see if we should run a more computationally expensive
        # object detection method to aid our tracker
        if totalFrames % skip_frames == 0:
            # set the status and initialize our new set of object trackers
            status = "Detecting"
            trackers = []

            # convert the frame to a blob and pass the blob through the
            # network and obtain the detections
            blob = cv2.dnn.blobFromImage(frame, 0.007843, (W, H), 127.5)
            net.setInput(blob)
            detections = net.forward()

            # loop over the detections
            for i in np.arange(0, detections.shape[2]):
                # extract the confidence (i.e., probability) associated
                # with the prediction
                confidence = detections[0, 0, i, 2]

                # filter out weak detections by requiring a minimum
                # confidence
                if confidence > minimum_confidence:
                    # extract the index of the class label from the
                    # detections list
                    idx = int(detections[0, 0, i, 1])

                    # if the class label is not a person, ignore it
                    if CLASSES[idx] != "person":
                        continue

                    # compute the (x, y)-coordinates of the bounding box
                    # for the object
                    box = detections[0, 0, i, 3:7] * np.array([W, H, W, H])
                    (startX, startY, endX, endY) = box.astype("int")

                    # construct a dlib rectangle object from the bounding
                    # box coordinates and then start the dlib correlation
                    # tracker
                    tracker = dlib.correlation_tracker()
                    rect = dlib.rectangle(startX, startY, endX, endY)
                    tracker.start_track(rgb, rect)

                    # add the tracker to our list of trackers so we can
                    # utilize it during skip frames
                    trackers.append(tracker)

        # otherwise, we should utilize our object *trackers* rather than
        # object *detectors* to obtain a higher frame processing throughput
        else:
            # loop over the trackers
            for tracker in trackers:
                # set the status of our system to be 'tracking' rather
                # than 'waiting' or 'detecting'
                status = "Tracking"

                # update the tracker and grab the updated position
                tracker.update(rgb)
                pos = tracker.get_position()

                # unpack the position object
                startX = int(pos.left())
                startY = int(pos.top())
                endX = int(pos.right())
                endY = int(pos.bottom())

                # draw a rectangle around the people
                cv2.rectangle(frame, (startX, startY), (endX, endY),
                              (0, 255, 0), 2)

                # add the bounding box coordinates to the rectangles list
                rects.append((startX, startY, endX, endY))

        # draw a horizontal line in the center of the frame -- once an
        # object crosses this line we will determine whether they were
        # moving 'up' or 'down'
        cv2.line(frame, (0, H // 2), (W, H // 2), (0, 255, 255), 2)

        # use the centroid tracker to associate the (1) old object
        # centroids with (2) the newly computed object centroids
        objects = ct.update(rects)

        # loop over the tracked objects
        for (objectID, centroid) in objects.items():
            # check to see if a trackable object exists for the current
            # object ID
            to = trackableObjects.get(objectID, None)
            if fall_timing == 0:  # just start timing
                fall_timing = 1
                fall_start_time = time.time()
            else:  # alredy started timing
                fall_end_time = time.time()
                difference = fall_end_time - fall_start_time

                current_time = time.strftime('%Y-%m-%d %H:%M:%S',
                                             time.localtime(time.time()))

                if difference < fall_limit_time:
                    print('[INFO] %s, 院子, people仅出现 %.1f 秒. 忽略.' %
                          (current_time, difference))
                else:  # strangers appear
                    if (flag == 1):
                        current_time = time.strftime(
                            '%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
                        audioplayer.play_audio(
                            os.path.join('audios/off-limits-area.mp3'))
                        print('[EVENT] %s, 院子, 有人闯入禁止区域!!!' % (current_time))
                        img_name = 'snapshot_%s.jpg' % (
                            time.strftime('%Y%m%d_%H%M%S'))
                        cv2.imwrite(os.path.join(output_fence_path, img_name),
                                    frame)
                        path = output_fence_path + "/" + img_name
                        myimg = open(path, 'rb')
                        img_data = myimg.read()
                        db = pymysql.connect(host='123.57.246.9',
                                             user='******',
                                             password='******',
                                             port=3306,
                                             db='oldcare',
                                             charset='utf8')
                        cursor = db.cursor()
                        try:
                            cursor.execute(
                                "insert into event_info(event_date,event_type,event_desc,event_location,image) values(now(),4,'有人闯入禁止区域!!!','院子', %s)",
                                (img_data))
                            print('Successful')
                            db.commit()
                        except:
                            print('Failed')
                            db.rollback()
                        cursor.close()
                        db.close()
                        flag = 0

            # if there is no existing trackable object, create one
            if to is None:
                to = TrackableObject(objectID, centroid)
                flag = 1

            # otherwise, there is a trackable object so we can utilize it
            # to determine direction
            else:
                # the difference between the y-coordinate of the *current*
                # centroid and the mean of *previous* centroids will tell
                # us in which direction the object is moving (negative for
                # 'up' and positive for 'down')
                y = [c[1] for c in to.centroids]
                direction = centroid[1] - np.mean(y)
                to.centroids.append(centroid)

                # check to see if the object has been counted or not
                if not to.counted:
                    # if the direction is negative (indicating the object
                    # is moving up) AND the centroid is above the center
                    # line, count the object
                    if direction < 0 and centroid[1] < H // 2:
                        totalUp += 1
                        to.counted = True

                    # if the direction is positive (indicating the object
                    # is moving down) AND the centroid is below the
                    # center line, count the object
                    elif direction > 0 and centroid[1] > H // 2:
                        totalDown += 1
                        to.counted = True

            # store the trackable object in our dictionary
            trackableObjects[objectID] = to

            # draw both the ID of the object and the centroid of the
            # object on the output frame
            text = "ID {}".format(objectID)
            cv2.putText(frame, text, (centroid[0] - 10, centroid[1] - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
            cv2.circle(frame, (centroid[0], centroid[1]), 4, (0, 255, 0), -1)

        # construct a tuple of information we will be displaying on the
        # frame
        info = [
            # ("Up", totalUp),
            ("Down", totalDown),
            ("Status", status),
        ]

        # loop over the info tuples and draw them on our frame
        for (i, (k, v)) in enumerate(info):
            text = "{}: {}".format(k, v)
            cv2.putText(frame, text, (10, H - ((i * 20) + 20)),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)

        # show the output frame
        cv2.imshow("Prohibited Area", frame)

        k = cv2.waitKey(1) & 0xff
        if k == 27:
            break

        # increment the total number of frames processed thus far and
        # then update the FPS counter
        totalFrames += 1
        fps.update()

    # stop the timer and display FPS information
    fps.stop()
    print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))  # 14.19
    print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))  # 90.43

    # close any open windows
    vs.release()
    cv2.destroyAllWindows()