-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdeveloperLayer.py
150 lines (117 loc) · 5.96 KB
/
developerLayer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import os
import sys
import cv2
# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")
import coreLayer
class Checker:
def __init__(self, checklist):
self.checklist = checklist
def on_isci_detection(self, detections):
th = 0.7
for i in range(detections['meta']['isci']):
if detections['objects']['isci'][i][0] >= th:
return True
return False
def is_in_boundary(self, boxes, coords, frame_height, frame_width):
# box[0] -> y0, box[1] -> x0, box[2] -> y1, box[3] -> x1
buffer = 10
# print("boxes: ", boxes[0]*frame_height, boxes[1]*frame_width, boxes[2]*frame_height, boxes[3]*frame_width)
# print("coords: ", coords[0]*frame_height, coords[1]*frame_width, coords[2]*frame_height,
# coords[3]*frame_width)
return \
boxes[0]*frame_height - buffer <= coords[0]*frame_height and \
boxes[1]*frame_width - buffer <= coords[1]*frame_width and \
boxes[2]*frame_height + buffer >= coords[2]*frame_height and \
boxes[3]*frame_width + buffer >= coords[3]*frame_width
def is_in_checklist(self, detections, checklist, boxes, frame_height, frame_width):
th = 0.6
liste = []
for element in checklist:
i = 0
flag = False
while i < detections['meta'][element] and flag is False:
if detections['objects'][element][i][0] >= th:
# print("Element: ", element, "Threshold: ", detections['objects'][element][i][0])
if self.is_in_boundary(boxes, detections['objects'][element][i][1], frame_height, frame_width):
liste.append(element)
print("{} element detected".format(element))
flag = True
i += 1
# benzer elemanlari siler
checklist = list(set(checklist) ^ set(liste))
return checklist
def output_reader(self, outputs):
print("Outputs : ")
print(outputs)
def detect_and_crop(self, detections):
th = 0.7
coords = []
for i in range(detections['meta']['isci']):
if detections['objects']['isci'][i][0] >= th:
# print(detections['objects']['isci'][i][1])
coords.append(detections['objects']['isci'][i][1])
return coords
def on_kask_detection(detections):
th = 0.7
for i in range(detections['meta']['kask']):
if detections['objects']['kask'][i][0] >= th:
return True
return False
def callback(frame):
cv2.imshow("KASKLI_FRAME", frame)
if cv2.waitKey(1) == ord('q'):
cv2.destroyAllWindows()
def on_no_gozluk(detections):
th = 0.95
for i in range(detections['meta']['gozluk']):
if detections['objects']['gozluk'][i][0] < th:
return True
return False
def callback2(frame):
cv2.imshow("GOZLUKSUZ", frame)
if cv2.waitKey(1) == ord('q'):
cv2.destroyAllWindows()
def main():
# 1- Icinde bulundugumuz dizini alir.
CWD_PATH = os.getcwd()
# 2- Agirliklari kaydedilmis modelin pathi kaydedilir.
PATH_TO_CKPT = os.path.join(CWD_PATH, 'inference_graph', 'frozen_inference_graph.pb')
# 3- Label dosyasının pathi kaydedilir.
PATH_TO_LABELS = os.path.join(CWD_PATH, 'training', 'labelmap.pbtxt')
# 4- Label dosyasındaki label sayisi
NUM_CLASSES = 9
f_model_path = "/home/zehra/PycharmProjects/object_detection/trained_knn_model.clf"
# 5- Kontrol edilmek istenen esyalar burada verilmelidir.
checker = Checker({'yelek', 'kask', 'gozluk', 'eldiven'}) # guncellee!!!!!!!!!!!!!!1 frame e gerek yok'
# 7- Core'daki Detection classına modelin agirliklari, label dosyasi, sinif sayisi parametre olarak verilir.
detectObj = coreLayer.Detection(PATH_TO_CKPT, PATH_TO_LABELS, NUM_CLASSES, f_model_path)
# 8- Video dosyasının full pathi set_video methoduna parametre olarak verilir.
detectObj.set_video("/home/zehra/PycharmProjects/object_detection/input15.mp4")
# 9- Conditionlar ve callback methodları add_conditional_capture
# isimli methoda verilerek condition ve callback tupleları olusturulur.
# detectObj.add_conditional_capture(on_kask_detection, callback)
# detectObj.add_conditional_capture(on_no_gozluk, callback2)
# 10- Checklist burada coreLayer'a gonderilir.
detectObj.checklist_controller(checker)
# 11- Thread calistirilir, developera main threadde calisma olanagi taninir
detectObj.start()
print("Main thread doing something else")
return
if __name__ == '__main__':
main()
'''
***Agirliklar ve modelin pathi main fonksiyonunda iki numarali adimda verilmelidir.
***Labelmap dosyası ve bu dosyanın pathi 3 numaralı adimda verilmelidir.
***Labelmap dosyasinin icerdigi label sayisi 4 numarali adimda verilmelidir.
***Kontrol edilmek istenen nesneleri iceren checklist 5 numarali adimda verilmelidir.
***İsci tespit edildikten sonra kac frame icinde arama yapilmak istedigi 6 numarali adimda verilmelidir.
***Video dosyasinin full pathi 8 numarali adimda verilmelidir.
(Not: Windows kullanicilari icin dosya pathinin direkt kopyalanmasi durumunda Python hata vermektedir.
Kopyalanan adres uzerindeki \ isareti "/" ile degistirilmelidir.)
***Developer eklemek istedigi condition ve callback fonksiyonlarini main fonksiyonunun uzerinde tanimlanmalidir.
***Eklenen fonksiyonlar adim 9'daki gibi add_conditional_capture metoduna parametre olarak verilmelidir.
***10 numarali adimda checklist coreLayer'a gonderilir. Arama islemi icin bu adim gereklidir.
***11 numarali adim developer tarafindan degistirilmemelidir.
***Developer main fonksiyonunun devamina eklemeler yapabilir, core'daki fonksiyonlarin calismasi maini etkilemeyecektir.
'''