Rgascoin commited on
Commit
edcb323
1 Parent(s): 5a169e9

Add hugging files

Browse files
original_app/.DS_Store ADDED
Binary file (6.15 kB). View file
 
original_app/README.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ This is the based scarecrow application with the back-end and the scarecrow communication setup.
2
+
3
+ Inside the huggingface face application, as a demo, there is only the back-end part with some visualisation setup.
4
+
5
+
6
+ - a.mp3 -> predator sound for human
7
+ - b.mp3 -> predator sound for cell_phone
8
+ - coco.names -> labels for yolo to use
9
+ - scarecrow.py -> the application that collect video and send the stream to the back-end
10
+ - backend.py -> the application which run the model to detect animals
11
+ - yolov3.cfg & yolov3.weights -> can't be included inside huggingface as binary
original_app/a.mp3 ADDED
Binary file (60.2 kB). View file
 
original_app/b.mp3 ADDED
Binary file (56.8 kB). View file
 
original_app/backend.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ import socket
4
+ import pickle
5
+ import struct
6
+
7
+ # Load YOLO model
8
+ net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
9
+ classes = []
10
+ with open("coco.names", "r") as f:
11
+ classes = [line.strip() for line in f.readlines()]
12
+
13
+ resolved_label = ''
14
+
15
+ # Set up socket
16
+ HOST = ''
17
+ PORT = 8089
18
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
19
+ print('Socket created')
20
+ s.bind((HOST, PORT))
21
+ print('Socket bind complete')
22
+ s.listen(10)
23
+ print('Socket now listening')
24
+
25
+ # Accept connections
26
+ conn, addr = s.accept()
27
+
28
+ # Receive and process frames
29
+ data = b''
30
+ payload_size = struct.calcsize("L")
31
+ while True:
32
+ # Retrieve message size
33
+ while len(data) < payload_size:
34
+ data += conn.recv(4096)
35
+ packed_msg_size = data[:payload_size]
36
+ data = data[payload_size:]
37
+ msg_size = struct.unpack("L", packed_msg_size)[0]
38
+
39
+ # Retrieve all data based on message size
40
+ while len(data) < msg_size:
41
+ data += conn.recv(4096)
42
+ frame_data = data[:msg_size]
43
+ data = data[msg_size:]
44
+
45
+ # Extract frame
46
+ frame = pickle.loads(frame_data)
47
+
48
+ # Run YOLO on frame
49
+ blob = cv2.dnn.blobFromImage(frame, 1/255.0, (416, 416), swapRB=True, crop=False)
50
+ net.setInput(blob)
51
+ outputs = net.forward(net.getUnconnectedOutLayersNames())
52
+ boxes = []
53
+ confidences = []
54
+ class_ids = []
55
+ for output in outputs:
56
+ for detection in output:
57
+ scores = detection[5:]
58
+ class_id = np.argmax(scores)
59
+ confidence = scores[class_id]
60
+ if confidence > 0.5:
61
+ center_x = int(detection[0] * frame.shape[1])
62
+ center_y = int(detection[1] * frame.shape[0])
63
+ w = int(detection[2] * frame.shape[1])
64
+ h = int(detection[3] * frame.shape[0])
65
+ x = int(center_x - w/2)
66
+ y = int(center_y - h/2)
67
+ boxes.append([x, y, w, h])
68
+ confidences.append(float(confidence))
69
+ class_ids.append(class_id)
70
+ indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
71
+ if len(indexes) > 0:
72
+ for i in indexes.flatten():
73
+ resolved_label = classes[class_ids[i]]
74
+ print(resolved_label)
75
+
76
+ # Display frame
77
+ cv2.imshow('frame', frame)
78
+ cv2.waitKey(1)
79
+
80
+ # Send response to client
81
+ try:
82
+ if len(indexes) > 0:
83
+ response = "[Scarecrow]: " + resolved_label
84
+ else:
85
+ response = "[Scarecrow]: NONE"
86
+ except IndexError:
87
+ response = "[Scarecrow]: ERROR"
88
+ conn.sendall(response.encode())
original_app/coco.names ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ person
2
+ bicycle
3
+ car
4
+ motorbike
5
+ aeroplane
6
+ bus
7
+ train
8
+ truck
9
+ boat
10
+ traffic light
11
+ fire hydrant
12
+ stop sign
13
+ parking meter
14
+ bench
15
+ bird
16
+ cat
17
+ dog
18
+ horse
19
+ sheep
20
+ cow
21
+ elephant
22
+ bear
23
+ zebra
24
+ giraffe
25
+ backpack
26
+ umbrella
27
+ handbag
28
+ tie
29
+ suitcase
30
+ frisbee
31
+ skis
32
+ snowboard
33
+ sports ball
34
+ kite
35
+ baseball bat
36
+ baseball glove
37
+ skateboard
38
+ surfboard
39
+ tennis racket
40
+ bottle
41
+ wine glass
42
+ cup
43
+ fork
44
+ knife
45
+ spoon
46
+ bowl
47
+ banana
48
+ apple
49
+ sandwich
50
+ orange
51
+ broccoli
52
+ carrot
53
+ hot dog
54
+ pizza
55
+ donut
56
+ cake
57
+ chair
58
+ sofa
59
+ pottedplant
60
+ bed
61
+ diningtable
62
+ toilet
63
+ tvmonitor
64
+ laptop
65
+ mouse
66
+ remote
67
+ keyboard
68
+ cell_phone
69
+ microwave
70
+ oven
71
+ toaster
72
+ sink
73
+ refrigerator
74
+ book
75
+ clock
76
+ vase
77
+ scissors
78
+ teddy bear
79
+ hair drier
80
+ toothbrush
original_app/scarecrow.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ import socket
4
+ import sys
5
+ import pickle
6
+ import struct
7
+ import pygame
8
+
9
+ # Initialize pygame mixer
10
+ pygame.mixer.init()
11
+
12
+ # Set up dictionary of label-sound pairs
13
+ label_sound_dict = {
14
+ "person": "a.mp3",
15
+ "cell_phone": "b.mp3",
16
+ }
17
+
18
+ cap = cv2.VideoCapture(0)
19
+ clientsocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
20
+ clientsocket.connect(('localhost',8089))
21
+
22
+ # Initialize variables for label detection
23
+ label_count = 0
24
+ current_label = None
25
+
26
+ while True:
27
+ ret, frame = cap.read()
28
+ # Serialize frame
29
+ data = pickle.dumps(frame)
30
+
31
+ # Send message length first
32
+ message_size = struct.pack("L", len(data)) ### CHANGED
33
+
34
+ # Then data
35
+ clientsocket.sendall(message_size + data)
36
+
37
+ # Receive response from server
38
+ response = clientsocket.recv(1024)
39
+ decoded_response = response.decode()
40
+ print(decoded_response)
41
+
42
+ # Check if response is a label we care about
43
+ if "[Scarecrow]: " in decoded_response:
44
+ label = decoded_response.split("[Scarecrow]: ")[1]
45
+ if label in label_sound_dict:
46
+ if label != current_label:
47
+ # Reset label count if new label detected
48
+ current_label = label
49
+ label_count = 1
50
+ else:
51
+ # Increment label count if same label detected
52
+ label_count += 1
53
+ if label_count >= 5: # play sound if label detected 5 times in a row
54
+ sound_file = label_sound_dict[label]
55
+ sound = pygame.mixer.Sound(sound_file)
56
+ sound.play()
57
+ label_count = 0
58
+ else:
59
+ current_label = None
60
+ label_count = 0