0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过利用深度学习对道路损坏进行检测分析

新机器视觉 来源:小白学视觉 作者:小白学视觉 2022-07-06 09:35 次阅读

1.简介

道路基础设施是一项重要的公共资产,因为它有助于经济发展和增长,同时带来重要的社会效益。路面检查主要基于人类的视觉观察和使用昂贵机器的定量分析。这些方法的最佳替代方案是智能探测器,它使用记录的图像或视频检测损坏情况。除了道路INFR一个结构,道路破损检测器也将在自主驾驶汽车,以检测他们的方式有些坑洼或其他干扰,尽量避免他们有用。

2.数据集

本项目中使用的数据集是从这里收集的。该数据集包含不同国家的道路图像,它们是日本、印度、捷克。对于图像,标签的注释是在 xml 文件中,即标签是 PASCAL VOC 格式。由于数据集包含来自日本的大部分图像(在以前的版本中,它仅包含来自日本的图像),因此根据数据来源,根据日本道路指南确定了标签。

但是最新的数据集现在包含其他国家的图像,因此为了概括我们只考虑以下标签的损害。D00:垂直裂缝,D10:水平裂缝,D20:鳄鱼裂缝,D40:坑洼

3.基于深度学习得目标检测

CNN 或卷积神经网络是所有计算机视觉任务的基石。即使在物体检测的情况下,从图像中提取物体的模式到特征图(基本上是一个比图像尺寸小的矩阵)卷积操作也被使用。现在从过去几年开始,已经对对象检测任务进行了大量研究,我们得到了大量最先进的算法或方法,其中一些简而言之,我们在下面进行了解释。

4.EDA

数据集中的图像总数:26620

标签分布

每个班级的计数D00 : 6592 D10 : 4446 D20 : 8381 D40 : 5627

各国标签分布(全数据分析)

捷克数据分析0 图像数量 2829 1 D00 988 2 D10 399 3 D20 161 4 D40 197 5 标签数量 1745 ************************ **********************************************印度数据分析 类别计数6 图像数量 7706 7 D00 1555 8 D10 68 9 D20 2021 10 D40 3187 11 标签数量 6831 **************************** ******************************************日本数据分析12 图像数量 10506 13 D00 404914 D10 3979 15 D20 6199 16 D40 2243 17 标签数量 16470 ************************************ ************************************

图像中标签大小的分布

标签最小尺寸:0x1 标签最大尺寸:704x492

5.关键技术

对象检测现在是一个庞大的主题,相当于一个学期的主题。它由许多算法组成。因此,为了使其简短,目标检测算法被分为各种类别,例如基于区域的算法(RCNN、Fast-RCNN、Faster-RCNN)、两级检测器、一级检测器,其中基于区域的算法本身是两级检测器的一部分,但我们将在下面简要地解释它们,因此我们明确地提到了它们。让我们从RCNN(基于区域的卷积神经网络)开始。

目标检测算法的基本架构由两部分组成。该部分由一个 CNN 组成,它将原始图像信息转换为特征图,在下一部分中,不同的算法有不同的技术。因此,在 RCNN 的情况下,它使用选择性搜索来获得 ROI(感兴趣区域),即在那个地方有可能有不同的对象。从每个图像中提取大约 2000 个区域。它使用这些 ROI 对标签进行分类并使用两种不同的模型预测对象位置。因此这些模型被称为两级检测器。

RCNN 有一些限制,为了克服这些限制,他们提出了 Fast RCNN。RCNN 具有很高的计算时间,因为每个区域都分别传递给 CNN,并且它使用三种不同的模型进行预测。因此,在 Fast RCNN 中,每个图像只传递一次到 CNN 并提取特征图。在这些地图上使用选择性搜索来生成预测。将 RCNN 中使用的所有三个模型组合在一起。

但是 Fast RCNN 仍然使用缓慢的选择性搜索,因此计算时间仍然很长。猜猜他们想出了另一个名字有意义的版本,即更快的 RCNN。Faster RCNN 用区域提议网络代替了选择性搜索方法,使算法更快。现在让我们转向一些一次性检测器。YOLO 和 SSD 是非常著名的物体检测模型,因为它们在速度和准确性之间提供了非常好的权衡

YOLO:单个神经网络在一次评估中直接从完整图像中预测边界框和类别概率。由于整个检测管道是一个单一的网络,因此可以直接在检测性能上进行端到端的优化

SSD(Single Shot Detector):SSD 方法将边界框的输出空间离散为一组不同纵横比的默认框。离散化后,该方法按特征图位置进行缩放。Single Shot Detector 网络结合了来自具有不同分辨率的多个特征图的预测,以自然地处理各种大小的对象。

6.型号

作为深度学习的新手,或者准确地说是计算机视觉,为了学习基础知识,我们尝试了一些基本且快速的算法来实现如下数据集:

Efficientdet_d0SSD_mobilenet_v2YOLOv3

对于第一个和第二个模型,我们使用了tensorflow 模型 zoo并且为了训练 yolov3 引用了this。用于评估 mAP(平均平均精度),使用 Effectivedet_d0 和 ssd_mobilenet_v2 得到的 mAP 非常低,可能是因为没有更改学习率、优化器和数据增强的一些默认配置。

7.结果

使用 efficicentdet_d0 进行推导

import tensorflow as tffrom object_detection.utils import label_map_utilfrom object_detection.utils import config_utilfrom object_detection.utils import visualization_utils as viz_utilsfrom object_detection.builders import model_builder# Load pipeline config and build a detection modelconfigs = config_util.get_configs_from_pipeline_file('/content/efficientdet_d0_coco17_tpu-32/pipeline.config')model_config = configs['model']detection_model = model_builder.build(model_config=model_config, is_training=False)# Restore checkpointckpt = tf.compat.v2.train.Checkpoint(model=detection_model)ckpt.restore('/content/drive/MyDrive/efficientdet/checkpoints/ckpt-104').expect_partial()@tf.functiondef detect_fn(image):"""Detect objects in image."""    image, shapes = detection_model.preprocess(image)    prediction_dict = detection_model.predict(image, shapes)    detections = detection_model.postprocess(prediction_dict, shapes)return detectionscategory_index = label_map_util.create_category_index_from_labelmap('/content/data/label_map.pbtxt',                                                                    use_display_name=True)for image_path in IMAGE_PATHS:    print('Running inference for {}... '.format(image_path), end='')    image_np = load_image_into_numpy_array(image_path)    input_tensor = tf.convert_to_tensor(np.expand_dims(image_np, 0), dtype=tf.float32)    detections = detect_fn(input_tensor)    num_detections = int(detections.pop('num_detections'))    detections = {key: value[0, :num_detections].numpy()for key, value in detections.items()}    detections['num_detections'] = num_detections# detection_classes should be ints.    detections['detection_classes'] = detections['detection_classes'].astype(np.int64)    label_id_offset = 1    image_np_with_detections = image_np.copy()    viz_utils.visualize_boxes_and_labels_on_image_array(            image_np_with_detections,            detections['detection_boxes'],            detections['detection_classes']+label_id_offset,            detections['detection_scores'],            category_index,            use_normalized_coordinates=True,            max_boxes_to_draw=200,            min_score_thresh=.30,            agnostic_mode=False)    %matplotlib inline    fig = plt.figure(figsize = (10,10))    plt.imshow(image_np_with_detections)    print('Done')    plt.show()

使用 SSD_mobilenet_v2 进行推导

(与efficientdet 相同的代码)

YOLOv3 的推导

def func(input_file):classes = ['D00', 'D10', 'D20', 'D40']alt_names = {'D00': 'lateral_crack', 'D10': 'linear_cracks', 'D20': 'aligator_crakcs', 'D40': 'potholes'}  # initialize a list of colors to represent each possible class labelnp.random.seed(42)COLORS = np.random.randint(0, 255, size=(len(classes), 3),dtype="uint8")  # derive the paths to the YOLO weights and model configurationweightsPath = "/content/drive/MyDrive/yolo/yolo-obj_final.weights"configPath = "/content/yolov3.cfg"  # load our YOLO object detector trained on COCO dataset (80 classes)  # and determine only the *output* layer names that we need from YOLO  #print("[INFO] loading YOLO from disk...")net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)ln = net.getLayerNames()ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]  # read the next frame from the fileframe = cv2.imread(input_file)(H, W) = frame.shape[:2]  # construct a blob from the input frame and then perform a forward  # pass of the YOLO object detector, giving us our bounding boxes  # and associated probabilitiesblob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416),swapRB=True, crop=False)net.setInput(blob)start = time.time()layerOutputs = net.forward(ln)end = time.time()  # initialize our lists of detected bounding boxes, confidences,  # and class IDs, respectivelyboxes = []confidences = []classIDs = []  # loop over each of the layer outputsfor output in layerOutputs:    # loop over each of the detectionsfor detection in output:      # extract the class ID and confidence (i.e., probability)      # of the current object detectionscores = detection[5:]classID = np.argmax(scores)confidence = scores[classID]      # filter out weak predictions by ensuring the detected      # probability is greater than the minimum probabilityif confidence > 0.3:        # scale the bounding box coordinates back relative to        # the size of the image, keeping in mind that YOLO        # actually returns the center (x, y)-coordinates of        # the bounding box followed by the boxes' width and        # heightbox = detection[0:4] * np.array([W, H, W, H])(centerX, centerY, width, height) = box.astype("int")        # use the center (x, y)-coordinates to derive the top        # and and left corner of the bounding boxx = int(centerX - (width / 2))y = int(centerY - (height / 2))        # update our list of bounding box coordinates,        # confidences, and class IDsboxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)  # apply non-maxima suppression to suppress weak, overlapping  # bounding boxesidxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.3,0.25)  # ensure at least one detection existsif len(idxs) > 0:    # loop over the indexes we are keepingfor i in idxs.flatten():      # extract the bounding box coordinates(x, y) = (boxes[i][0], boxes[i][1])(w, h) = (boxes[i][2], boxes[i][3])      # draw a bounding box rectangle and label on the framecolor = [int(c) for c in COLORS[classIDs[i]]]cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)label = classes[classIDs[i]]text = "{}: {:.4f}".format(alt_names[label],confidences[i])cv2.putText(frame, text, (x, y - 5),cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)  cv2_imshow(frame)
审核编辑:郭婷
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 检测器
    +关注

    关注

    1

    文章

    811

    浏览量

    47291
  • 计算机
    +关注

    关注

    19

    文章

    6649

    浏览量

    84522
  • 深度学习
    +关注

    关注

    73

    文章

    5237

    浏览量

    119908

原文标题:实战:基于深度学习的道路损坏检测

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何使用示波器探头对被测电路进行检测

    对电路信号进行检测之前首先要知道被测电路是什么电路,被测信号是什么信号。盲目地测试或者使用不正确的测量方法,有可能得到错误的波形甚至损坏仪器危及安全。1什么是差分信号?什么是单端信号?差分传输是一种
    的头像 发表于 12-08 16:14 451次阅读
    如何使用示波器探头对被测电路<b class='flag-5'>进行检测</b>

    AD8495能对E型和J型热电偶进行检测吗?

    升高,AD8494(针对J型)的2℃精度对应的测温范围不能满足项目的要求,所以想利用AD8495对K、J、E的热电偶进行检测。 想问一下: (1)对于K型热电偶,AD8495的输入输出
    发表于 11-21 07:21

    基于深度学习道路小目标检测优化方法

    在使用卷积神经网络进行特征提取时,不同的网络深度对应不同层次的特征。低层特征的分辨率更高,像素更丰富,包含更多的细节信息和位置信息,对于目标的定位有极大帮助,但包含的语义信息较少。
    发表于 11-07 12:33 387次阅读
    基于<b class='flag-5'>深度</b><b class='flag-5'>学习</b>的<b class='flag-5'>道路</b>小目标<b class='flag-5'>检测</b>优化方法

    深度学习在工业缺陷检测中的应用

    工业制造领域中,产品质量的保证是至关重要的任务之一。然而,人工的检测方法不仅费时费力,而且容易受到主观因素的影响,从而降低了检测的准确性和一致性。近年来,基于深度学习的技术在工业缺陷
    的头像 发表于 10-24 09:29 608次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>在工业缺陷<b class='flag-5'>检测</b>中的应用

    瑞萨电子深度学习算法在缺陷检测领域的应用

    浪费大量的人力成本。因此,越来越多的工程师开始将深度学习算法引入缺陷检测领域,因为深度学习在特征提取和定位方面取得了非常好的效果。
    的头像 发表于 09-22 12:19 502次阅读
    瑞萨电子<b class='flag-5'>深度</b><b class='flag-5'>学习</b>算法在缺陷<b class='flag-5'>检测</b>领域的应用

    软件漏洞检测场景中的深度学习模型实证研究

    近年来,深度学习模型(DLM)在软件漏洞检测领域的应用探索引起了行业广泛关注,在某些情况下,利用DLM模型能够获得超越传统静态分析工具的
    的头像 发表于 08-24 10:25 387次阅读
    软件漏洞<b class='flag-5'>检测</b>场景中的<b class='flag-5'>深度</b><b class='flag-5'>学习</b>模型实证研究

    如何正确使用气密检漏仪进行检测

    正确使用气密检漏仪进行检测需要按照以下步骤进行: 准备工作:首先,检查气密检漏仪的状态,确保仪器正常工作。检查仪器的电源、气源等是否正常连接。确认被测产品或系统已经准备好,没有明显的损坏或杂质
    的头像 发表于 08-24 09:43 517次阅读
    如何正确使用气密检漏仪<b class='flag-5'>进行检测</b>

    深度学习框架连接技术

    深度学习框架能够很好的为应用程序提供预测、检测等功能。因此本文旨在介绍深度学习框架连接技术的基本原理及其应用。 基本原理
    的头像 发表于 08-17 16:11 479次阅读

    深度学习框架的作用是什么

    深度学习框架的作用是什么 深度学习是一种计算机技术,它利用人工神经网络来模拟人类的学习过程。由于
    的头像 发表于 08-17 16:10 1167次阅读

    什么是深度学习算法?深度学习算法的应用

    什么是深度学习算法?深度学习算法的应用 深度学习算法被认为是人工智能的核心,它是一种模仿人类大脑
    的头像 发表于 08-17 16:03 1478次阅读

    利用深度学习模型最大限度地提高外显子组测序分析的准确性

    使用 NVIDIA Parabricks ,通过深度学习加速整个外显子组分析,降低 70% 的成本
    的头像 发表于 07-05 16:30 311次阅读
    <b class='flag-5'>利用</b><b class='flag-5'>深度</b><b class='flag-5'>学习</b>模型最大限度地提高外显子组测序<b class='flag-5'>分析</b>的准确性

    无法让MCU Boot实用程序进行检测是什么原因导致的?

    的 UART 引脚 (J19) 并避免使用单独的 USB-UART 电缆。但在这种情况下,我无法让 NXP MCU Boot 实用程序进行检测。是否有任何具体原因导致失败,是否有其他人尝试过?
    发表于 06-08 06:17

    康耐视深度学习实现高效血清质量检测

    本期就为大家详细介绍一则康耐视深度学习技术,在样品前处理以及血液检测仪器上所涉及到的血清质量检测应用案例。当异常血液样本(黄疸、溶血、脂血)等不良血液误入到正常样本测试中,可能会出现污
    的头像 发表于 05-26 16:21 609次阅读
    康耐视<b class='flag-5'>深度</b><b class='flag-5'>学习</b>实现高效血清质量<b class='flag-5'>检测</b>

    如何在OpenCV中使用基于深度学习的边缘检测

    在这篇文章中,我们将学习如何在OpenCV中使用基于深度学习的边缘检测,它比目前流行的canny边缘检测器更精确。
    的头像 发表于 05-19 09:52 1675次阅读
    如何在OpenCV中使用基于<b class='flag-5'>深度</b><b class='flag-5'>学习</b>的边缘<b class='flag-5'>检测</b>?

    2023年使用树莓派和替代品进行深度学习

    此页面可帮助您在Raspberry Pi或Google Coral或Jetson Nano等替代品上构建深度学习模式。有关深度学习及其限制的更多一般信息,请参阅
    的头像 发表于 05-05 09:47 2126次阅读
    2023年使用树莓派和替代品<b class='flag-5'>进行</b><b class='flag-5'>深度</b><b class='flag-5'>学习</b>