闭眼检测
闭眼检测准确率高达98%
网络结构转载来源 : 经典卷积网络之InceptionV3
InceptionV3模型是google系列第三代模型,Inception网络最大的特点是将神经网络层与层之间的卷积运算进行了拓展.
如VGG,AlexNet网络就是一直卷积,ResNet则是引入了残差网络,使得靠前若干层的某一层数据直接跳过多层引入到后面的数据层的输入部分,后面的特征层的内容会有一部分有前面的某一层线性提供.而Inception网络则是采用不同大小的卷积核是的存在不同大小的感受野,最后实现拼接达到不同尺度的特征融合.
存在着这样的结构,利用1x7的卷积和7x1的卷积代替7x7的卷积,这样可以只使用约(1x7 + 7x1) / (7x7) = 28.6%的计算开销;利用1x3的卷积和3x1的卷积代替3x3的卷积,这样可以只使用约(1x3 + 3x1) / (3x3) = 67%的计算开销。
下图利用1x7的卷积和7x1的卷积代替7x7的卷积(这个结构主要在代码中的block2使用)。
下图利用1x3的卷积和3x1的卷积代替3x3的卷积(这个结构主要在代码中的block3使用)。
闭眼检测功能实现思路如下:
主要是利用InceptionV3主网络结构作特征,修改网络输出层全链接部分做重新训练具体网络结构代码如下:
def V3Model(classes=2):
# 采用imagenet 作权重
# include_top=False 不采用Inception原始分类,自定义分类
base_model = InceptionV3(weights='imagenet', include_top=False)
# 输出层
x = base_model.output
# 可以使用gap全局池化代替flatten,从参数的对比可以看出,这种改进大大的减少了参数的使用量,避免了过拟合现象。
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.5)(x)
y = Dense(classes, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=y)
# 不使用之前训练参数
for layer in base_model.layers:
layer.trainable = True
model.summary()
return model
部分训练,测试代码
if os.path.exists("data/checkpoints"):
print('-------------load the model-----------------')
model.load_weights("data/checkpoints/model.006-0.040.h5")
model.compile(optimizer='Adam',
loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(train_data, steps_per_epoch=train_data.samples // batchsize,
epochs=50,
validation_data=validation_data,
validation_steps=validation_data.samples // batchsize,
verbose=1,
callbacks=callbacks)
loss, acc = model.evaluate_generator(train_data)
val_loss, val_acc = model.evaluate_generator(validation_data)
print(f"acc:{acc},loss:{loss},val_acc:{val_acc},val_loss:{val_loss}")
数据集处理
for dirpath, dirname, filename in os.walk(raw_data):
for file in tqdm([f for f in filename if f.endswith('.png')]):
if file.split('_')[4] == '0':
path = '/home/delixus/Desktop/drowsiness_detection/data/train/closed'
if not os.path.exists(path):
os.makedirs(path)
shutil.copy(src=dirpath + '/' + file, dst=path)
elif file.split('_')[4] == '1':
path = '/home/delixus/Desktop/drowsiness_detection/data/train/open'
if not os.path.exists(path): os.makedirs(path)
shutil.copy(src=dirpath + '/' + file, dst=path)
闭眼检测tensorflow源码,h5训练模型,准确率达98%.后期开放源码与模型