东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 7504|回复: 4
打印 上一主题 下一主题

[课堂笔记] 01、项目介绍与图片预处理的大概流程(代码实操)

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
跳转到指定楼层
楼主
发表于 2019-11-2 16:39:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
01、项目介绍与图片预处理的大概流程(代码实操)


项目介绍:
用传统的计算机视觉方法,主要使用OpenCV,识别道路上的车道线。先在一系列单独的图像上开发测试,
然后应用于视频流(实际上只是一系列图像的集合)
需要安装额外的库: pip3 install moviepy
步骤包括:变为灰度图像、高斯核卷积(滤波器)、Canny边缘检测、感兴趣区域选择、Hough Tranform线检测、外推后的车道线、VideoFileClip等

刚开始用基于OpenCV传统的计算机视觉技术,后来尝试用神经网络MaskRCNN图像实例分割的方法
所用到的技术:
1、RGB2GRAY变灰度、GaussianBlur降噪、Canny或Sobel边缘检测、fillPoly图像蒙版得到感兴趣区域、HoughLinesP线检测
2、计算相机校正矩阵和失真系数来校正图片
3、使用梯度阈值(gradient threshold),颜色阈值(color threshold)等处理图片得到清晰捕捉车道线的二进制图
4、使用透视变换(perspective transform)得到二进制图(binary image)的鸟瞰图
5、检测属于车道线的像素并用它来测出车道边界
6、MaskRCNN图像实例分割:VIA图像标注工具训练自己的数据集,效果不错
技术难点:
1、定位车道线的基点:把图片一分为二,左右两边的在x轴上的像素分布峰值非常有可能就是车道线基点
2、定位基点后,再使用使用滑动窗口多项式拟合来获取车道边界(使用9个200px宽的滑动窗口来定位一条车道线像素)
3、MaskRCNN网络结构复杂,backbone为resnet50或101,rpn网络、ProposalLayer、ROIAlign、FPN特征金字塔网络需要进一步细致研究



测试图片压缩包在附件test_images.zip ,可提供免费下载!

东方老师AI官网:http://www.ai111.vip
有任何问题可联系东方老师微信:dfy_88888
【微信二维码图片】


  1. # -*- coding: utf-8 -*-
  2. __author__ = u'东方耀 微信:dfy_88888'
  3. __date__ = '2019/11/2 11:19'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'LandLinesDetection_for_Image'


  6. # 导入工具库
  7. import numpy as np
  8. import cv2
  9. import math
  10. import os

  11. print(os.listdir("test_images/"))
  12. # solidWhiteRight.jpg solidWhiteCurve.jpg
  13. img_original = cv2.imread('test_images/solidWhiteCurve.jpg')
  14. # img_original = cv2.imread('dfy_88888.jpg')
  15. img_shape_original = img_original.shape
  16. print('0、原始图像shape(HWC):', img_shape_original)
  17. # 如果用cv2读图片并且用cv2显示图片 则不需要考虑颜色空间变换
  18. cv2.imshow('0 step:original image', img_original)
  19. cv2.waitKey()


  20. def grayscale(img):
  21.     """灰度变换"""
  22.     # return cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
  23.     # Or use BGR2GRAY if you read an image with cv2.imread()
  24.     return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


  25. img_gray = grayscale(img_original)
  26. print('1、gray图像shape(HWC):', img_gray.shape)
  27. cv2.imshow('1 step:gray image', img_gray)
  28. cv2.waitKey()


  29. def gaussian_blur(img, kernel_size):
  30.     """高斯去燥"""
  31.     return cv2.GaussianBlur(img, (kernel_size, kernel_size), sigmaX=0)


  32. def median_blur(img, kernel_size):
  33.     """中值去燥"""
  34.     return cv2.medianBlur(img, kernel_size)


  35. img_blur = gaussian_blur(img_gray, kernel_size=5)
  36. print('2、高斯降噪后图像shape(HWC):', img_blur.shape)
  37. cv2.imshow('2 step:gaussian Blur', img_blur)
  38. cv2.waitKey()


  39. def canny(img, low_threshold, high_threshold):
  40.     """边缘检测"""
  41.     return cv2.Canny(img, low_threshold, high_threshold)


  42. def sobel(img):
  43.     """边缘检测 效果不行"""
  44.     return cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)


  45. img_edge = canny(img_blur, low_threshold=50, high_threshold=150)
  46. # img_edge = sobel(img_blur)
  47. print('3、边缘检测后图像shape(HWC):', img_edge.shape)
  48. cv2.imshow('3 step:canny detector', img_edge)
  49. cv2.waitKey()


  50. def region_of_interest(img, vertices):
  51.     """
  52.     图像蒙版.
  53.     """
  54.     # 定义一个蒙版, 所有值都为0 黑色图像
  55.     mask = np.zeros_like(img)

  56.     # 根据输入图像的通道数, 设置色彩
  57.     if len(img.shape) > 2:
  58.         channel_count = img.shape[2]
  59.         ignore_mask_color = (255,) * channel_count
  60.     else:
  61.         print('提取gray图片的_感兴趣区域')
  62.         ignore_mask_color = 255

  63.     # 使用白彩填充vertices构成的多边形在mask全黑的图像上
  64.     mask = cv2.fillPoly(mask, vertices, ignore_mask_color)
  65.     # mask 的像素 不是0 就是255 在多边形区域是255 其他都是0

  66.     # 执行蒙版操作
  67.     masked_image = cv2.bitwise_and(img, mask)
  68.     return masked_image


  69. # 顺时针方向:左下  左上 右上  右下
  70. vertices = np.array([[(0, img_shape_original[0]),
  71.                       (425, 315),
  72.                       (540, 315),
  73.                       (img_shape_original[1], img_shape_original[0])]], dtype=np.int32)
  74. img_masked_edges = region_of_interest(img_edge, vertices)
  75. print('4、感兴趣区域后图像shape(HWC):', img_masked_edges.shape)
  76. cv2.imshow('4 step:region_of_interest', img_masked_edges)
  77. cv2.waitKey()


  78. def draw_lines(img, lines, color=[0, 0, 255], thickness=2):
  79.     """
  80.     画线段
  81.     """
  82.     for line in lines:
  83.         for x1, y1, x2, y2 in line:
  84.             print('画线的点:(x1=%d, y1=%d), (x2=%d, y2=%d)' % (x1, y1, x2, y2))
  85.             # color=[0, 0, 255] opencv bgr 这是红色
  86.             cv2.line(img, (x1, y1), (x2, y2), color, thickness)


  87. def hough_lines(img, rho, theta, threshold, min_line_len, max_line_gap, extrapolate=False):
  88.     """
  89.     `img` Canny边缘检测的输出.
  90.     `rho` = Hough Grid中像素的距离
  91.     `theta` = Hough grid中角度的距离
  92.     `threshold` = 最小的voting数值
  93.     `min_line_len` = 构成一条线的最小像素个数
  94.     `max_line_gap` = 可以相连的线段之间的最大距离
  95.     extrapolate = 外推
  96.     返回黑背景上面有白线的图.
  97.     """
  98.     lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]), minLineLength=min_line_len,
  99.                             maxLineGap=max_line_gap)
  100.     # 3通道的黑色图像
  101.     line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
  102.     print('要画的线:', lines)
  103.     # 8*1*4
  104.     print('要画的线shape:', lines.shape)
  105.     if not extrapolate:
  106.         draw_lines(line_img, lines)
  107.     elif extrapolate:
  108.         draw_lines_extrapolated(line_img, lines)

  109.     return line_img


  110. def weighted_img(img, initial_img, a=0.8, b=1.):
  111.     """
  112.     `img` hough_lines()的输出, 黑背景上面有红线的图.

  113.     `initial_img` 原始图像.

  114.     加权相加:

  115.     initial_img * a + img * b
  116.     """
  117.     return cv2.addWeighted(initial_img, a, img, b, 0)


  118. img_hough_lines = hough_lines(img_masked_edges, rho=1, theta=np.pi/180, threshold=40,
  119.                               min_line_len=60, max_line_gap=20, extrapolate=False)
  120. print('5、霍夫线检测后图像shape(HWC):', img_hough_lines.shape)
  121. cv2.imshow('5 step:Hough Tranform line', img_hough_lines)
  122. cv2.waitKey()

  123. img_lanes = weighted_img(img=img_hough_lines, initial_img=img_original, a=0.8, b=1.)

  124. print('6、在原图上画出检测出来的线 展示效果shape(HWC):', img_lanes.shape)
  125. cv2.imshow('6 step:addWeighted show', img_lanes)
  126. cv2.waitKey()
复制代码




0、原始图像shape(HWC): (540, 960, 3)
1、gray图像shape(HWC): (540, 960)
2、高斯降噪后图像shape(HWC): (540, 960)
3、边缘检测后图像shape(HWC): (540, 960)
提取gray图片的_感兴趣区域
4、感兴趣区域后图像shape(HWC): (540, 960)
要画的线: [[[689 430 876 538]]


[[534 340 877 538]]


[[496 316 897 539]]


[[629 389 898 538]]


[[293 462 353 412]]


[[281 461 344 410]]


[[389 382 459 325]]


[[498 320 873 536]]]
要画的线shape: (8, 1, 4)
画线的点:(x1=689, y1=430), (x2=876, y2=538)
画线的点:(x1=534, y1=340), (x2=877, y2=538)
画线的点:(x1=496, y1=316), (x2=897, y2=539)
画线的点:(x1=629, y1=389), (x2=898, y2=538)
画线的点:(x1=293, y1=462), (x2=353, y2=412)
画线的点:(x1=281, y1=461), (x2=344, y2=410)
画线的点:(x1=389, y1=382), (x2=459, y2=325)
画线的点:(x1=498, y1=320), (x2=873, y2=536)
5、霍夫线检测后图像shape(HWC): (540, 960, 3)
6、在原图上画出检测出来的线 展示效果shape(HWC): (540, 960, 3)






01.png (461.81 KB, 下载次数: 603)

01.png

02.png (306.02 KB, 下载次数: 585)

02.png

03.png (17.62 KB, 下载次数: 601)

03.png

04.png (17.05 KB, 下载次数: 589)

04.png

0_step.png (297.78 KB, 下载次数: 607)

0_step.png

1_step.png (203.06 KB, 下载次数: 591)

1_step.png

2_step.png (163.04 KB, 下载次数: 584)

2_step.png

3_step.png (12.65 KB, 下载次数: 588)

3_step.png

4_step.png (5.29 KB, 下载次数: 583)

4_step.png

5_step.png (5.26 KB, 下载次数: 594)

5_step.png

6_step.png (309.22 KB, 下载次数: 589)

6_step.png

test_images.zip

2.67 MB, 阅读权限: 10, 下载次数: 31

让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

117

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
QQ
沙发
发表于 2020-2-3 15:39:15 | 只看该作者
谢谢老师提供的资料。
回复

使用道具 举报

0

主题

13

帖子

33

积分

新手上路

Rank: 1

积分
33
板凳
发表于 2020-3-27 16:09:50 | 只看该作者
这个是只可以识别图片吗
回复

使用道具 举报

0

主题

13

帖子

33

积分

新手上路

Rank: 1

积分
33
地板
发表于 2020-3-27 17:26:03 | 只看该作者
感谢老师分享代码
回复

使用道具 举报

0

主题

13

帖子

33

积分

新手上路

Rank: 1

积分
33
5#
发表于 2020-3-27 17:26:29 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-25 03:00 , Processed in 0.210524 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表