3、自动驾驶学习笔记——目标检测算法概述

一、目标检测的几个分类

  • 无人驾驶中的检测
    图片/点云 ——>2D/3D
    bounding box
  • 基于图片的检测算法
    general idea
    two-step:RCNN SPPnet Fast-RCNN Faster-RCNN
    one-step:YOLO SSD YOLO-v2 YOLO-v3
    Tensorflow实战Faster-RCNN
  • 基于激光雷达点云的检测算法
    激光雷达点云简介
    Pixel-Based Voxel-Based Tree-Based Point-Based
    实战基于点云的目标检测

3、自动驾驶学习笔记——目标检测算法概述_第1张图片

二、基于图片的检测算法

图片检测即 detection既包含目标物体的类别,又包括目标物体的位置,因此主题思路就是先找到图像的ROI区域,然后进行类别区分,最后确定目标位置

3、自动驾驶学习笔记——目标检测算法概述_第2张图片
=============== =思路= ================

3、自动驾驶学习笔记——目标检测算法概述_第3张图片

2.1 生成ROI区域以及分类

1、生成ROI

3、自动驾驶学习笔记——目标检测算法概述_第4张图片

2、ROI分类

3、自动驾驶学习笔记——目标检测算法概述_第5张图片

3、小结

3、自动驾驶学习笔记——目标检测算法概述_第6张图片

4、几个算法模型小结

1、RCNN

  • 位置:Selective Search提取候选框
  • 类别:CNN提取特征+SVM分类
  • 位置修正:LR

2、SPPnet:
3、自动驾驶学习笔记——目标检测算法概述_第7张图片
3、Fast-CNN
3、自动驾驶学习笔记——目标检测算法概述_第8张图片
4、Faster-CNN
3、自动驾驶学习笔记——目标检测算法概述_第9张图片
5、YOLO
3、自动驾驶学习笔记——目标检测算法概述_第10张图片
6、SSD
3、自动驾驶学习笔记——目标检测算法概述_第11张图片
7、YOLO-v2
3、自动驾驶学习笔记——目标检测算法概述_第12张图片
8、YOLO-v3
3、自动驾驶学习笔记——目标检测算法概述_第13张图片

5、简单代码实现

1)基础opencv-python库使用——手动图像提取

--------------------python代码实现-------------------------

import cv2
import matplotlib.pyplot as plt
# 展示图像,封装成函数
def cv_show_image(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止
    cv2.destroyAllWindows()
# 读取彩色图像
img = cv2.imread('11.png')
part = img[0:300, 80:300]
a1=cv_show_image('naruto', part)
part = img[200:500, 280:500]
a2=cv_show_image('naruto', part)

# # 分割图像的三个通道
b, g, r = cv2.split(img)

a3=cv_show_image('gray image, only show B Channel', b)  # 单一通道,就是灰色展示出来了
a4=cv_show_image('gray image, only show G Channel', g)  # 单一通道,就是灰色展示出来了
a5=cv_show_image('gray image, only show R Channel', r)  # 单一通道,就是灰色展示出来了

# 仅仅保留R通道
curr_img = img.copy()
curr_img[:, :, 0] = 0  # 擦掉B通道
curr_img[:, :, 1] = 0  # 擦掉G通道
a6=cv_show_image('colorful image, only keep R Channel data', curr_img)  # 三个通道,显示彩色图像

# 仅仅保留G通道
curr_img = img.copy()
curr_img[:, :, 0] = 0  # 擦掉B通道
curr_img[:, :, 2] = 0  # 擦掉R通道
a7=cv_show_image('colorful image, only keep G Channel data', curr_img)  # 三个通道,显示彩色图像

# 仅仅保留R通道
curr_img = img.copy()
curr_img[:, :, 1] = 0  # 擦掉G通道
curr_img[:, :, 2] = 0  # 擦掉R通道
a8=cv_show_image('colorful image, only keep B Channel data', curr_img)  # 三个通道,显示彩色图像
img = cv2.imread('11.png')
cv2.imshow('img', img)
cv2.waitKey(0)

# 定义填充的四周的宽度
top_size, bottom_size, left_sze, right_size = (50, 50, 50, 50)

# 进行不同的边界填充
# 边界的像素值,重复填充
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_REPLICATE)
# 映射镜像,比如是 dcba|abcd|dcba
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_REFLECT)
# 映射镜像,比如是 dcb|abcd|cba
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_REFLECT101)
# 外包装法
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_WRAP)
# 常数来填充
content = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_CONSTANT, value=0)

plt.subplot(231), plt.imshow(img, 'gray'), plt.title('original image')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('replicate padding image')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('reflect padding image')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('reflect101 padding image')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('wrap padding image')
plt.subplot(236), plt.imshow(content, 'gray'), plt.title('content padding image')
plt.show()

代码二结果图:
3、自动驾驶学习笔记——目标检测算法概述_第14张图片
--------------------------- C++ -------------------------------
来源

//************头文件包含*************
#include "stdafx.h"
#include
#include//包含opencv的头文件
//***********************************


//************命名空间***************
using namespace cv;//使用opencv命名空间
using namespace std;
//***********************************


//************主函数*****************
int main()
{ 
	int c;
	Mat img1 = imread("1.jpg");
	Mat img2,img3,img4,img5;

	img4 = img1.clone();//将img1图像复制到img4中,此复制连同数据区域一起复制

	namedWindow("原图");//创建窗口
	namedWindow("ROI区域图");//创建窗口
	namedWindow("复制图");//创建窗口

	while (1)
	{
		img2 = img1(Rect(200,200,100,100));//选取img1中从(200,200)到(300,300)的ROI区域
		img5 = img1(Range(100,100+img2.rows),Range(100,100+img2.cols));//选取img1中从(100,100)开始与img2同样大小的ROI区域
		img3 = img2.clone();//将img2图像复制到img3中,此复制连同数据区域一起复制
		img3.copyTo(img5);//将img3图像复制到img5中,此时img1中相应的ROI区域数据也一起发生了变化

		imshow("原图", img4);//显示图像
		imshow("ROI区域图", img2);//ROI区域图像
		imshow("复制图", img1);//显示合并后的图像

		c = waitKey(0);//等待按键按下
		if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
			break;
	}
	
	return 0;
}

你可能感兴趣的:(目标检测,自动驾驶,算法)