-
Notifications
You must be signed in to change notification settings - Fork 3
/
trafficSignCnn_v4.py
51 lines (38 loc) · 1.66 KB
/
trafficSignCnn_v4.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
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Input
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras.models import Sequential
# architecture inspired by https://github.com/hparik11/German-Traffic-Sign-Recognition (similar to LeNet)
# with few modifications added
# 1: use sigmoid instead of softmax and threshold probability
# or 2: add background noise class
class TrafficSignNet_v4:
@staticmethod
def build(width, height, depth, classes):
model = Sequential()
model.add(Input(shape=(width, height, depth)))
model.add(Conv2D(6, (5, 5,), padding="valid"))
model.add(MaxPooling2D((2, 2), padding="valid"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=-1)) # modification, inspired by pyimagesearch
# 66 works better than the original 16 (found out by mistake)
model.add(Conv2D(66, (5, 5,), padding="valid"))
model.add(MaxPooling2D((2, 2), padding="valid"))
model.add(Activation("relu"))
model.add(Flatten())
# some dropouts added to avoid overfitting
model.add(Dropout(0.3))
model.add(Dense(120))
model.add(Activation("relu"))
model.add(Dropout(0.3))
model.add(Dense(84))
model.add(Activation("relu"))
model.add(Dropout(0.3))
model.add(Dense(classes))
model.add(Activation("sigmoid"))
return model