车牌识别,车辆检测,车牌检测和识别,与车相关的点点滴滴

前言:

最近接到了几个单子,都是和车辆有关的,其中有车辆检测,还有车牌检测和识别等,与车相关的,这里就是总结下自己所了解到的相关技术,同时备份到自己的网盘将代码。

车辆检测

车辆检测,车辆检测是一个老话题了,目前主流的算法应该都是基于深度学习的目标检测来做的,基于深度学习的方法来说,就是用yolov3或者等方法,大量的数据,和标注进行训练,然后模型就可以知道车辆检测了。而在这之前,我们还有其他的方法,比如基于Hog特征+滑动窗口+感兴趣区域的划定,最后用SVM进行处理。这也是FasterRCNN等的前身方法。相关文章可能写了很多了,所以我们就直接看相关文章吧。

知乎参考: 参考文章1

1.参考文章来说,HOG就是和梯度相关的特征,其实梯度的出现是很有意义的,因为他可以更好的联系不同的像素,或者说空间位置上变化的数值变化关系,不仅仅是在图像处理中可以出现,甚至其他也是,在这里的话我们对一张图的特征提取,肯定是将像素联系起来提取的特征会更佳有效。

参考链接:参考文章2
参考链接2 :参考文章3

2.基本上就是提取了HOG特征,然后用模型训练出一个分类器,接着,这个分类器就知道这张图片是不是我们要的那辆车子了。但是一张图片离,怎么知道哪里是车子哪里不是车子呢,可以用滑动窗口和图像金字塔则是在原始目标检测中两个重要的概念。

那么到这里的话就差不多,代码也能跑通,具体看百度云链接

车牌检测

车牌检测,准确来说也就是车牌的检测和识别,一般流程来说就是检测到了车牌,然后通过再对车牌的数字识别,可以把这个过程换成onestage或者twostage,无论是哪一种,都可以用深度学习的方法,这里先不讲,因为这两种方法的精度和鲁棒性都很高,但是却十分的吃数据,伪造的数据都会带来低精度。

先说下低精度的吧,这里也是将检测和识别分成两个部分,而识别部分就是用了伪造数据训练,但是效果一般,最后测试的效果。

然后就是一般的方法,虽然用在特定场景效果还挺好的,怎么说就是鲁棒性一般吧。总的思路就是首先用opencv的级联分类器,进行车牌检测。然后通过分割的方法对车牌的字符进行分割,这里的话也会调用opencv的库,然后就是对每个字符进行分类了。分类他们属于什么字符。

关键还是看看如何进行分割,前者是基于机器学习的方法的车牌检测,后者的分割后的字符是卷积神经网络,并没有太多可讲的。

分割的话首先是,肯定是灰度图,然后基于灰度图进行边缘切割,那么就会得到不同的区域,接着我们寻找联通的区域,联通的区域可能会有很多,我们就需要对联通的区域进行筛选。也就是下面这部分。

    # 2. Canny边缘检测并膨胀 Cannny如何进行的可以去百度
    img3 = feature.canny(image, sigma=2)
    img4 = morphology.dilation(img3)
    #io.imshow(img4)
    #plt.show()

    # 3. 标记并筛选区域 获得标记区域 https://www.bbsmax.com/A/A7zgpN3VJ4/ 具体参考
    label_img = measure.label(img4,connectivity=2)
    regions = measure.regionprops(label_img)
    print(len(regions))
    fig, ax = plt.subplots()

    #通过下面的条件分析,对上面筛选出来的连通区域进行筛选,
    bboxes = []
    for props in regions:
        y0, x0 = props.centroid
        minr, minc, maxr, maxc = props.bbox

        if maxc - minc > img4.shape[1] / 7 or maxr - minr < img4.shape[0] / 3: #如果数字太大,或者太小,我们都会去掉
            continue

        bbox = [minr, minc, maxr, maxc]

        if in_bboxes(bbox, bboxes):#剩下的进行比较找到最合适的
            continue

        if abs(y0 - img4.shape[0] / 2) > img4.shape[0] / 4: 3 #如果中心不偏向中心的位置那么也会被跳过
            continue

        bboxes.append(bbox)

你可能感兴趣的:(深度学习,图像处理)