基于OpenCV的路面质量检测

重磅干货,第一时间送达

路面分类

01.RTK数据集

02.路面类型分类

训练数据文件夹结构

classes = os.listdir('training_data')num_classes = len(classes)
batch_size = 32validation_size = 0.2img_size = 128num_channels = 3train_path='training_data'
data = dataset.read_train_sets(train_path, img_size, classes, validation_size=validation_size)
def adjust_gamma(image): gamma = 0.5 invGamma = 1.0 / gamma table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8")
return cv2.LUT(image, table)
def increase_brightness(img, value): hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv)
lim = 255 - value v[v > lim] = 255 v[v <= lim] += value
final_hsv = cv2.merge((h, s, v)) img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
return img
for fields in classes: index = classes.index(fields) print('Now going to read {} files (Index: {})'.format(fields, index)) path = os.path.join(train_path, fields, '*g') files = glob.glob(path) for fl in files: image = cv2.imread(fl)
# Region Of Interest (ROI) height, width = image.shape[:2] newHeight = int(round(height/2)) image = image[newHeight-5:height-50, 0:width]
brght_img = increase_brightness(image, value=150)
shaded_img = adjust_gamma(image)
image = cv2.resize(image, (image_size, image_size),0,0, cv2.INTER_LINEAR) image = image.astype(np.float32) image = np.multiply(image, 1.0 / 255.0)
brght_img = cv2.resize(brght_img, (image_size, image_size),0,0, cv2.INTER_LINEAR) brght_img = brght_img.astype(np.float32) brght_img = np.multiply(brght_img, 1.0 / 255.0)
shaded_img = cv2.resize(shaded_img, (image_size, image_size),0,0, cv2.INTER_LINEAR) shaded_img = shaded_img.astype(np.float32) shaded_img = np.multiply(brght_img, 1.0 / 255.0)
if index == 0: #asphalt images.append(image) images.append(brght_img) images.append(shaded_img)elif index == 1: #paved for i in range(3): images.append(image) images.append(brght_img) images.append(shaded_img)elif index == 2: #unpaved for i in range(6): images.append(image) images.append(brght_img) images.append(shaded_img)
def create_convolutional_layer(input, num_input_channels, conv_filter_size, num_filters):
weights = create_weights(shape=[conv_filter_size, conv_filter_size, num_input_channels, num_filters]) biases = create_biases(num_filters)
layer = tf.nn.conv2d(input=input, filter=weights, strides=[1, 1, 1, 1], padding='SAME')
layer += biases
layer = tf.nn.max_pool(value=layer, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
layer = tf.nn.relu(layer)
def create_flatten_layer(layer): layer_shape = layer.get_shape()
num_features = layer_shape[1:4].num_elements()
layer = tf.reshape(layer, [-1, num_features])
return layer
def create_fc_layer(input, num_inputs, num_outputs, use_relu=True):
weights = create_weights(shape=[num_inputs, num_outputs]) biases = create_biases(num_outputs)
layer = tf.matmul(input, weights) + biases if use_relu: layer = tf.nn.relu(layer)
return layer
layer_conv1 = create_convolutional_layer(input=x, num_input_channels=num_channels, conv_filter_size=filter_size_conv1, num_filters=num_filters_conv1)
layer_conv2 = create_convolutional_layer(input=layer_conv1, num_input_channels=num_filters_conv1, conv_filter_size=filter_size_conv2, num_filters=num_filters_conv2)
layer_conv3= create_convolutional_layer(input=layer_conv2, num_input_channels=num_filters_conv2, conv_filter_size=filter_size_conv3, num_filters=num_filters_conv3)
layer_flat = create_flatten_layer(layer_conv3)
layer_fc1 = create_fc_layer(input=layer_flat, num_inputs=layer_flat.get_shape()[1:4].num_elements(), num_outputs=fc_layer_size, use_relu=True)
layer_fc2 = create_fc_layer(input=layer_fc1, num_inputs=fc_layer_size, num_outputs=num_classes, use_relu=False)
y_pred = tf.nn.softmax(layer_fc2,name='y_pred')
y_pred_cls = tf.argmax(y_pred, dimension=1)session.run(tf.global_variables_initializer())cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=layer_fc2, labels=y_true)cost = tf.reduce_mean(cross_entropy)optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cost)correct_prediction = tf.equal(y_pred_cls, y_true_cls)accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
outputFile = sys.argv[2]
# Opening framescap = cv.VideoCapture(sys.argv[1])
vid_writer = cv.VideoWriter(outputFile, cv.VideoWriter_fourcc('M','J','P','G'), 15, (round(cap.get(cv.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv.CAP_PROP_FRAME_HEIGHT))))
sess = tf.Session()saver = tf.train.import_meta_graph('roadsurface-model.meta')saver.restore(sess, tf.train.latest_checkpoint('./'))
graph = tf.get_default_graph()
y_pred = graph.get_tensor_by_name("y_pred:0")
x = graph.get_tensor_by_name("x:0")y_true = graph.get_tensor_by_name("y_true:0")y_test_images = np.zeros((1, len(os.listdir('training_data'))))
width = int(round(cap.get(cv.CAP_PROP_FRAME_WIDTH)))height = int(round(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
newHeight = int(round(height/2))
while cv.waitKey(1) < 0:
hasFrame, images = cap.read()
finalimg = images
images = images[newHeight-5:height-50, 0:width] images = cv.resize(images, (image_size, image_size), 0, 0, cv.INTER_LINEAR) images = np.array(images, dtype=np.uint8) images = images.astype('float32') images = np.multiply(images, 1.0/255.0)
x_batch = images.reshape(1, image_size, image_size, num_channels)
feed_dict_testing = {x: x_batch, y_true: y_test_images}result = sess.run(y_pred, feed_dict=feed_dict_testing)
outputs = [result[0,0], result[0,1], result[0,2]]
value = max(outputs)index = np.argmax(outputs)
if index == 0: label = 'Asphalt' prob = str("{0:.2f}".format(value)) color = (0, 0, 0)elif index == 1: label = 'Paved' prob = str("{0:.2f}".format(value)) color = (153, 102, 102)elif index == 2: label = 'Unpaved' prob = str("{0:.2f}".format(value)) color = (0, 153, 255)
cv.rectangle(finalimg, (0, 0), (145, 40), (255, 255, 255), cv.FILLED)cv.putText(finalimg, 'Class: ', (5,15), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1)cv.putText(finalimg, label, (70,15), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)cv.putText(finalimg, prob, (5,35), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1)
vid_writer.write(finalimg.astype(np.uint8))

03.路面质量分类

用于质量课程的培训数据文件夹结构

python trainAsphaltQuality.py python trainPavedQuality.py python trainUnpavedQuality.py
graph = tf.Graph()graphAQ = tf.Graph()graphPQ = tf.Graph()graphUQ = tf.Graph()

04.模型恢复

with graph.as_default(): saver = tf.train.import_meta_graph('roadsurfaceType-model.meta')
y_pred = graph.get_tensor_by_name("y_pred:0")
x = graph.get_tensor_by_name("x:0") y_true = graph.get_tensor_by_name("y_true:0") y_test_images = np.zeros((1, len(os.listdir('training_data_type'))))
sess = tf.Session(graph = graph)saver.restore(sess, tf.train.latest_checkpoint('typeCheckpoint/'))
with graphAQ.as_default(): saverAQ = tf.train.import_meta_graph('roadsurfaceAsphaltQuality-model.meta')
y_predAQ = graphAQ.get_tensor_by_name("y_pred:0")
xAQ = graphAQ.get_tensor_by_name("x:0") y_trueAQ = graphAQ.get_tensor_by_name("y_true:0") y_test_imagesAQ = np.zeros((1, len(os.listdir('training_data_asphalt_quality'))))
sessAQ = tf.Session(graph = graphAQ)saverAQ.restore(sessAQ, tf.train.latest_checkpoint('asphaltCheckpoint/'))
with graphPQ.as_default(): saverPQ = tf.train.import_meta_graph('roadsurfacePavedQuality-model.meta')
y_predPQ = graphPQ.get_tensor_by_name("y_pred:0")
xPQ = graphPQ.get_tensor_by_name("x:0") y_truePQ = graphPQ.get_tensor_by_name("y_true:0") y_test_imagesPQ = np.zeros((1, len(os.listdir('training_data_paved_quality'))))
sessPQ = tf.Session(graph = graphPQ)saverPQ.restore(sessPQ, tf.train.latest_checkpoint('pavedCheckpoint/'))
with graphUQ.as_default(): saverUQ = tf.train.import_meta_graph('roadsurfaceUnpavedQuality-model.meta')
y_predUQ = graphUQ.get_tensor_by_name("y_pred:0")
xUQ = graphUQ.get_tensor_by_name("x:0") y_trueUQ = graphUQ.get_tensor_by_name("y_true:0") y_test_imagesUQ = np.zeros((1, len(os.listdir('training_data_unpaved_quality'))))
sessUQ = tf.Session(graph = graphUQ)saverUQ.restore(sessUQ, tf.train.latest_checkpoint('unpavedCheckpoint/'))
if index == 0: #Asphalt label = 'Asphalt' prob = str("{0:.2f}".format(value)) color = (0, 0, 0) x_batchAQ = images.reshape(1, image_size, image_size, num_channels)
feed_dict_testingAQ = {xAQ: x_batchAQ, y_trueAQ: y_test_imagesAQ} resultAQ = sessAQ.run(y_predAQ, feed_dict=feed_dict_testingAQ) outputsQ = [resultAQ[0,0], resultAQ[0,1], resultAQ[0,2]] valueQ = max(outputsQ) indexQ = np.argmax(outputsQ) if indexQ == 0: #Asphalt - Good quality = 'Good' colorQ = (0, 255, 0) probQ = str("{0:.2f}".format(valueQ)) elif indexQ == 1: #Asphalt - Regular quality = 'Regular' colorQ = (0, 204, 255) probQ = str("{0:.2f}".format(valueQ)) elif indexQ == 2: #Asphalt - Bad quality = 'Bad' colorQ = (0, 0, 255) probQ = str("{0:.2f}".format(valueQ)) elif index == 1: #Paved label = 'Paved' prob = str("{0:.2f}".format(value)) color = (153, 102, 102) x_batchPQ = images.reshape(1, image_size, image_size, num_channels)
feed_dict_testingPQ = {xPQ: x_batchPQ, y_truePQ: y_test_imagesPQ} resultPQ = sessPQ.run(y_predPQ, feed_dict=feed_dict_testingPQ) outputsQ = [resultPQ[0,0], resultPQ[0,1], resultPQ[0,2]] valueQ = max(outputsQ) indexQ = np.argmax(outputsQ) if indexQ == 0: #Paved - Good quality = 'Good' colorQ = (0, 255, 0) probQ = str("{0:.2f}".format(valueQ)) elif indexQ == 1: #Paved - Regular quality = 'Regular' colorQ = (0, 204, 255) probQ = str("{0:.2f}".format(valueQ)) elif indexQ == 2: #Paved - Bad quality = 'Bad' colorQ = (0, 0, 255) probQ = str("{0:.2f}".format(valueQ)) elif index == 2: #Unpaved label = 'Unpaved' prob = str("{0:.2f}".format(value)) color = (0, 153, 255) x_batchUQ = images.reshape(1, image_size, image_size, num_channels)
feed_dict_testingUQ = {xUQ: x_batchUQ, y_trueUQ: y_test_imagesUQ} resultUQ = sessUQ.run(y_predUQ, feed_dict=feed_dict_testingUQ) outputsQ = [resultUQ[0,0], resultUQ[0,1]] valueQ = max(outputsQ) indexQ = np.argmax(outputsQ) if indexQ == 0: #Unpaved - Regular quality = 'Regular' colorQ = (0, 204, 255) probQ = str("{0:.2f}".format(valueQ)) elif indexQ == 1: #Unpaved - Bad quality = 'Bad' colorQ = (0, 0, 255) probQ = str("{0:.2f}".format(valueQ))

cv.rectangle(finalimg, (0, 0), (145, 80), (255, 255, 255), cv.FILLED)cv.putText(finalimg, 'Class: ', (5,15), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))cv.putText(finalimg, label, (70,15), cv.FONT_HERSHEY_DUPLEX, 0.5, color)cv.putText(finalimg, prob, (5,35), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))cv.putText(finalimg, 'Quality: ', (5,55), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))cv.putText(finalimg, quality, (70,55), cv.FONT_HERSHEY_DUPLEX, 0.5, colorQ)cv.putText(finalimg, probQ, (5,75), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))
致谢
参考文献

交流群

(0)

相关推荐

  • 深度学习中的类别激活热图可视化

    导读 使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性的改进模型. 类别激活图(CAM)是一种用于计算机视觉分类任务的强大技术.它允许研究人员检查被分类的图像,并了解图像的哪些部分/像素 ...

  • Tensorflow实战:Discuz验证码识别

    选择"星标"公众号 重磅干货,第一时间送达! 写在最前面 验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册.灌水.发垃圾 ...

  • 浅谈语义分割任务如何给像素点上色

    通常解码器最终输出都会是(batch_size ,num_classes, h, w) num_classes对应任务的类别数 所以在预测任务中,数据经过模型得到预测结果,形状也是 (batch_si ...

  • 【caffe速成】caffe图像分类从模型自定义到测试

    这是给大家准备的caffe速成例子 言有三 毕业于中国科学院,计算机视觉方向从业者,有三工作室等创始人 作者 | 言有三(微信号Longlongtogo) 编辑 | 言有三 这一次我们讲讲 Caffe ...

  • Batch Normalization 的实战使用

    Batch Normalization 的实战使用

  • Tensorflow中卷积的padding操作

    目录 Tensorflow中padding为valid的情况 Tensorflow中padding为same的情况 和Pytorch的padding简单对比 实验对比 实验1 实验2 实验3 实验4 ...

  • 基于OpenCV实战:车牌检测

    重磅干货,第一时间送达 拥有思维导图或流程将引导我们朝着探索和寻找实现目标的正确道路的方向发展.如果要给我一张图片,我们如何找到车牌并提取文字? 一般思维步骤: 识别输入数据是图像. 扫描图像以查看由 ...

  • 基于OpenCV的面部关键点检测实战

    重磅干货,第一时间送达 这篇文章概述了用于构建面部关键点检测模型的技术,这些技术是Udacity的AI Nanodegree程序的一部分. 概述 在Udacity的AIND的最终项目中,目标是创建一个 ...

  • 基于OpenCV的实时睡意检测系统

    重磅干货,第一时间送达 该系统可以检测一个人在开车时是否困倦,如果有的话,可以通过使用语音消息实时提醒他.该系统使用网络摄像头和电话摄像头进行实时数据传输. 01.研究目的 根据国家公路交通安全管理局 ...

  • MaskRCNN 基于OpenCV DNN的目标检测与实例分割

    原文:MaskRCNN 基于OpenCV DNN的目标检测与实例分割 - AIUAI 这里主要记录基于 OpenCV 4.x DNN 模块和 TensorFlow MaskRCNN 开源模型的目标检测 ...

  • 基于OpenCV的实战:轮廓检测(附代码解析)

    重磅干货,第一时间送达 利用轮廓检测物体可以看到物体的各种颜色,在这种情况下放置在静态和动态物体上.如果是统计图像,则需要将图像加载到程序中,然后使用OpenCV库,以便跟踪对象. 每当在框架中检测到 ...

  • 基于OpenCV实战:动态物体检测

    重磅干货,第一时间送达 最近,闭路电视安全系统运行着多种算法来确保安全,例如面部识别,物体检测,盗窃检测,火灾警报等.我们在运动检测的基础上实现了许多算法,因为在空闲帧上运行所有这些进程没有任何意义. ...

  • 基于OpenCV的视障人士实时目标检测

    重磅干货,第一时间送达 一.概述 计算机视觉领域一直是一个活跃的研究领域,在本文中,我们让设备实时与其应用程序(对象检测)相结合并运行. 二.硬件 设备:程序将在其上运行,由于该设备将安装在手杖上,并 ...

  • 实战:基于OpenCV的人眼检测

    重磅干货,第一时间送达 一.背景 无论学习什么,实践都非常重要.如果打算学习OpenCV.Numpy等Python库,那么这简单的12行代码很适合实践并体验这些库的实时使用. 二.OpenCV库 Op ...

  • 基于OpenCV和YOLOv3深度学习的目标检测

    本文翻译自Deep Learning based Object Detection using YOLOv3 with OpenCV ( Python / C++ ) 基于OpenCV和YOLOv3深 ...