# vehicle-detection **Repository Path**: dqedda_admin/vehicle-detection ## Basic Information - **Project Name**: vehicle-detection - **Description**: Vehicle detection using machine learning and computer vision techniques for Udacity's Self-Driving Car Engineer Nanodegree. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-10-28 - **Last Updated**: 2023-02-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Vehicle Detection [Video demo](https://www.youtube.com/watch?v=I71cHXfSWxw&feature=youtu.be) ![png](./output/top.png) ## Overview Vehicle detection using these machine learning and computer vision techniques. * Linear SVM * HOG(Histogram of Oriented Gradients) feature extraction * Color space conversion * Space binning * Histogram of color extraction * Sliding Window ## Note First, you need to get training data(cars and not-cars). You can get car images from [GTI vehicle image database](http://www.gti.ssr.upm.es/data/Vehicle_database.html), [KITTI vision benchmark](http://www.cvlibs.net/datasets/kitti/)). And over 1500 images per each is good for this project. ## Dependencies * Python >= 3.4 ## Set up environment ``` pip install -r requirements.txt ``` ## Run jupyter notebook ``` jupyter notebook ``` ## Defining utility functions ```python import glob import time import cv2 import numpy as np import matplotlib.image as mpimg import matplotlib.pyplot as plt from skimage.feature import hog from sklearn.model_selection import train_test_split from sklearn.svm import LinearSVC from sklearn.preprocessing import StandardScaler from skimage.feature import hog %matplotlib inline ``` ```python # a function to extract features from a list of images def extract_features(imgs, color_space='RGB', spatial_size=(32, 32), hist_bins=32, orient=9, pix_per_cell=8, cell_per_block=2, hog_channel=0, spatial_feat=True, hist_feat=True, hog_feat=True): # Create a list to append feature vectors to features = [] # Iterate through the list of images for file in imgs: file_features = [] # Read in each one by one image = mpimg.imread(file) # apply color conversion if other than 'RGB' if color_space != 'RGB': if color_space == 'HSV': feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2HSV) elif color_space == 'LUV': feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2LUV) elif color_space == 'HLS': feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2HLS) elif color_space == 'YUV': feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2YUV) elif color_space == 'YCrCb': feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2YCrCb) else: feature_image = np.copy(image) if spatial_feat == True: spatial_features = bin_spatial(feature_image, size=spatial_size) file_features.append(spatial_features) if hist_feat == True: # Apply color_hist() hist_features = color_hist(feature_image, nbins=hist_bins) file_features.append(hist_features) if hog_feat == True: # Call get_hog_features() with vis=False, feature_vec=True if hog_channel == 'ALL': hog_features = [] for channel in range(feature_image.shape[2]): hog_features.append(get_hog_features(feature_image[:,:,channel], orient, pix_per_cell, cell_per_block, vis=False, feature_vec=True)) hog_features = np.ravel(hog_features) else: hog_features = get_hog_features(feature_image[:,:,hog_channel], orient, pix_per_cell, cell_per_block, vis=False, feature_vec=True) # Append the new feature vector to the features list file_features.append(hog_features) features.append(np.concatenate(file_features)) # Return list of feature vectors return features def get_hog_features(img, orient, pix_per_cell, cell_per_block, vis=False, feature_vec=True): # Call with two outputs if vis==True if vis == True: features, hog_image = hog(img, orientations=orient, pixels_per_cell=(pix_per_cell, pix_per_cell), cells_per_block=(cell_per_block, cell_per_block), transform_sqrt=False, visualise=vis, feature_vector=feature_vec) return features, hog_image # Otherwise call with one output else: features = hog(img, orientations=orient, pixels_per_cell=(pix_per_cell, pix_per_cell), cells_per_block=(cell_per_block, cell_per_block), transform_sqrt=False, visualise=vis, feature_vector=feature_vec) return features def bin_spatial(img, size=(32, 32)): color1 = cv2.resize(img[:,:,0], size).ravel() color2 = cv2.resize(img[:,:,1], size).ravel() color3 = cv2.resize(img[:,:,2], size).ravel() return np.hstack((color1, color2, color3)) def color_hist(img, nbins=32): #bins_range=(0, 256) # Compute the histogram of the color channels separately channel1_hist = np.histogram(img[:,:,0], bins=nbins) channel2_hist = np.histogram(img[:,:,1], bins=nbins) channel3_hist = np.histogram(img[:,:,2], bins=nbins) # Concatenate the histograms into a single feature vector hist_features = np.concatenate((channel1_hist[0], channel2_hist[0], channel3_hist[0])) # Return the individual histograms, bin_centers and feature vector return hist_features ``` ## Collecting data ```python # Get image file names images = glob.glob('./training-data/*/*/*.png') cars = [] notcars = [] all_cars = [] all_notcars = [] for image in images: if 'nonvehicle' in image: all_notcars.append(image) else: all_cars.append(image) # Get only 1/5 of the training data to avoid overfitting for ix, notcar in enumerate(all_notcars): if ix % 5 == 0: notcars.append(notcar) for ix, car in enumerate(all_cars): if ix % 5 == 0: cars.append(car) car_image = mpimg.imread(cars[5]) notcar_image = mpimg.imread(notcars[0]) def compare_images(image1, image2, image1_exp="Image 1", image2_exp="Image 2"): f, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 3)) f.tight_layout() ax1.imshow(image1) ax1.set_title(image1_exp, fontsize=20) ax2.imshow(image2) ax2.set_title(image2_exp, fontsize=20) plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.) compare_images(car_image, notcar_image, "Car", "Not Car") ``` ![png](./output/output_7_0.png) ## Extracting features ```python color_space = 'YUV' # Can be RGB, HSV, LUV, HLS, YUV, YCrCb orient = 15 # HOG orientations pix_per_cell = 8 # HOG pixels per cell cell_per_block = 2 # HOG cells per block hog_channel = "ALL" # Can be 0, 1, 2, or "ALL" spatial_size = (32, 32) # Spatial binning dimensions hist_bins = 32 # Number of histogram bins spatial_feat = True # Spatial features on or off hist_feat = True # Histogram features on or off hog_feat = True # HOG features on or off converted_car_image = cv2.cvtColor(car_image, cv2.COLOR_RGB2YUV) car_ch1 = converted_car_image[:,:,0] car_ch2 = converted_car_image[:,:,1] car_ch3 = converted_car_image[:,:,2] converted_notcar_image = cv2.cvtColor(notcar_image, cv2.COLOR_RGB2YUV) notcar_ch1 = converted_notcar_image[:,:,0] notcar_ch2 = converted_notcar_image[:,:,1] notcar_ch3 = converted_notcar_image[:,:,2] car_hog_feature, car_hog_image = get_hog_features(car_ch1, orient, pix_per_cell, cell_per_block, vis=True, feature_vec=True) notcar_hog_feature, notcar_hog_image = get_hog_features(notcar_ch1, orient, pix_per_cell, cell_per_block, vis=True, feature_vec=True) car_ch1_features = cv2.resize(car_ch1, spatial_size) car_ch2_features = cv2.resize(car_ch2, spatial_size) car_ch3_features = cv2.resize(car_ch3, spatial_size) notcar_ch1_features = cv2.resize(notcar_ch1, spatial_size) notcar_ch2_features = cv2.resize(notcar_ch2, spatial_size) notcar_ch3_features = cv2.resize(notcar_ch3, spatial_size) def show_images(image1, image2, image3, image4, image1_exp="Image 1", image2_exp="Image 2", image3_exp="Image 3", image4_exp="Image 4"): f, (ax1, ax2, ax3, ax4) = plt.subplots(1, 4, figsize=(24, 9)) f.tight_layout() ax1.imshow(image1) ax1.set_title(image1_exp, fontsize=20) ax2.imshow(image2) ax2.set_title(image2_exp, fontsize=20) ax3.imshow(image3) ax3.set_title(image3_exp, fontsize=20) ax4.imshow(image4) ax4.set_title(image4_exp, fontsize=20) plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.) show_images(car_ch1, car_hog_image, notcar_ch1, notcar_hog_image, "Car ch 1", "Car ch 1 HOG", "Not Car ch 1", "Not Car ch 1 HOG") show_images(car_ch1, car_ch1_features, notcar_ch1, notcar_ch1_features, "Car ch 1", "Car ch 1 features", "Not Car ch 1", "Not Car ch 1 features") show_images(car_ch2, car_ch2_features, notcar_ch2, notcar_ch2_features, "Car ch 2", "Car ch 2 features", "Not Car ch 2", "Not Car ch 2 features") show_images(car_ch3, car_ch3_features, notcar_ch3, notcar_ch3_features, "Car ch 3", "Car ch 3 features", "Not Car ch 3", "Not Car ch 3 features") ``` /Users/hatanaka/anaconda3/envs/carnd-term1/lib/python3.5/site-packages/skimage/feature/_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15 'be changed to `L2-Hys` in v0.15', skimage_deprecation) ![png](./output/output_9_1.png) ![png](./output/output_9_2.png) ![png](./output/output_9_3.png) ![png](./output/output_9_4.png) ## Training classifier ```python car_features = extract_features(cars, color_space=color_space, spatial_size=spatial_size, hist_bins=hist_bins, orient=orient, pix_per_cell=pix_per_cell, cell_per_block=cell_per_block, hog_channel=hog_channel, spatial_feat=spatial_feat, hist_feat=hist_feat, hog_feat=hog_feat) notcar_features = extract_features(notcars, color_space=color_space, spatial_size=spatial_size, hist_bins=hist_bins, orient=orient, pix_per_cell=pix_per_cell, cell_per_block=cell_per_block, hog_channel=hog_channel, spatial_feat=spatial_feat, hist_feat=hist_feat, hog_feat=hog_feat) X = np.vstack((car_features, notcar_features)).astype(np.float64) # Fit a per-column scaler X_scaler = StandardScaler().fit(X) # Apply the scaler to X scaled_X = X_scaler.transform(X) # Define the labels vector y = np.hstack((np.ones(len(car_features)), np.zeros(len(notcar_features)))) # Split up data into randomized training and test sets rand_state = np.random.randint(0, 100) X_train, X_test, y_train, y_test = train_test_split( scaled_X, y, test_size=0.2, random_state=rand_state) print('Using:',orient,'orientations',pix_per_cell, 'pixels per cell and', cell_per_block,'cells per block') print('Feature vector length:', len(X_train[0])) # Use a linear SVC svc = LinearSVC() # Check the training time for the SVC t=time.time() svc.fit(X_train, y_train) t2 = time.time() print(round(t2-t, 2), 'Seconds to train SVC...') # Check the score of the SVC print('Test Accuracy of SVC = ', round(svc.score(X_test, y_test), 4)) # Check the prediction time for a single sample t=time.time() ``` /Users/hatanaka/anaconda3/envs/carnd-term1/lib/python3.5/site-packages/skimage/feature/_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15 'be changed to `L2-Hys` in v0.15', skimage_deprecation) Using: 15 orientations 8 pixels per cell and 2 cells per block Feature vector length: 11988 2.56 Seconds to train SVC... Test Accuracy of SVC = 0.9789 ## Sliding window ```python def convert_color(img, conv='RGB2YCrCb'): if conv == 'RGB2YCrCb': return cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb) if conv == 'BGR2YCrCb': return cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) if conv == 'RGB2LUV': return cv2.cvtColor(img, cv2.COLOR_RGB2LUV) if conv == 'RGB2YUV': return cv2.cvtColor(img, cv2.COLOR_RGB2YUV) def find_cars(img, ystart, ystop, scale, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins): draw_img = np.copy(img) img = img.astype(np.float32)/255 img_tosearch = img[ystart:ystop,:,:] # sub-sampling ctrans_tosearch = convert_color(img_tosearch, conv='RGB2YUV') if scale != 1: imshape = ctrans_tosearch.shape ctrans_tosearch = cv2.resize(ctrans_tosearch, (np.int(imshape[1]/scale), np.int(imshape[0]/scale))) ch1 = ctrans_tosearch[:,:,0] ch2 = ctrans_tosearch[:,:,1] ch3 = ctrans_tosearch[:,:,2] # Define blocks and steps as above nxblocks = (ch1.shape[1] // pix_per_cell) - cell_per_block + 1 nyblocks = (ch1.shape[0] // pix_per_cell) - cell_per_block + 1 nfeat_per_block = orient*cell_per_block**2 # 64 was the orginal sampling rate, with 8 cells and 8 pix per cell window = 64 nblocks_per_window = (window // pix_per_cell) - cell_per_block + 1 #nblocks_per_window = (window // pix_per_cell)-1 cells_per_step = 2 # Instead of overlap, define how many cells to step nxsteps = (nxblocks - nblocks_per_window) // cells_per_step nysteps = (nyblocks - nblocks_per_window) // cells_per_step # Compute individual channel HOG features for the entire image hog1 = get_hog_features(ch1, orient, pix_per_cell, cell_per_block, vis=False, feature_vec=False) hog2 = get_hog_features(ch2, orient, pix_per_cell, cell_per_block, vis=False, feature_vec=False) hog3 = get_hog_features(ch3, orient, pix_per_cell, cell_per_block, vis=False, feature_vec=False) bboxes = [] for xb in range(nxsteps): for yb in range(nysteps): ypos = yb*cells_per_step xpos = xb*cells_per_step # Extract HOG for this patch hog_feat1 = hog1[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() hog_feat2 = hog2[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() hog_feat3 = hog3[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() hog_features = np.hstack((hog_feat1, hog_feat2, hog_feat3)) xleft = xpos*pix_per_cell ytop = ypos*pix_per_cell # Extract the image patch subimg = cv2.resize(ctrans_tosearch[ytop:ytop+window, xleft:xleft+window], (64,64)) # Get color features spatial_features = bin_spatial(subimg, size=spatial_size) hist_features = color_hist(subimg, nbins=hist_bins) # Scale features and make a prediction test_stacked = np.hstack((spatial_features, hist_features, hog_features)).reshape(1, -1) test_features = X_scaler.transform(test_stacked) #test_features = scaler.transform(np.array(features).reshape(1, -1)) #test_features = X_scaler.transform(np.hstack((shape_feat, hist_feat)).reshape(1, -1)) test_prediction = svc.predict(test_features) if test_prediction == 1: xbox_left = np.int(xleft*scale) ytop_draw = np.int(ytop*scale) win_draw = np.int(window*scale) cv2.rectangle(draw_img,(xbox_left, ytop_draw+ystart),(xbox_left+win_draw,ytop_draw+win_draw+ystart),(0,0,255),6) bboxes.append(((int(xbox_left), int(ytop_draw+ystart)),(int(xbox_left+win_draw),int(ytop_draw+win_draw+ystart)))) return draw_img, bboxes def apply_sliding_window(image, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins): bboxes = [] ystart = 400 ystop = 500 out_img, bboxes1 = find_cars(image, ystart, ystop, 1.0, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 400 ystop = 500 out_img, bboxes2 = find_cars(out_img, ystart, ystop, 1.3, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 410 ystop = 500 out_img, bboxes3 = find_cars(out_img, ystart, ystop, 1.4, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 420 ystop = 556 out_img, bboxes4 = find_cars(out_img, ystart, ystop, 1.6, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 430 ystop = 556 out_img, bboxes5 = find_cars (out_img, ystart, ystop, 1.8, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 430 ystop = 556 out_img, bboxes6 = find_cars (out_img, ystart, ystop, 2.0, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 440 ystop = 556 out_img, bboxes7 = find_cars (out_img, ystart, ystop, 1.9, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 400 ystop = 556 out_img, bboxes8 = find_cars (out_img, ystart, ystop, 1.3, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 400 ystop = 556 out_img, bboxes9 = find_cars (out_img, ystart, ystop, 2.2, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 500 ystop = 656 out_img, bboxes10 = find_cars (out_img, ystart, ystop, 3.0, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) bboxes.extend(bboxes1) bboxes.extend(bboxes2) bboxes.extend(bboxes3) bboxes.extend(bboxes4) bboxes.extend(bboxes5) bboxes.extend(bboxes6) bboxes.extend(bboxes7) bboxes.extend(bboxes8) bboxes.extend(bboxes9) bboxes.extend(bboxes10) return out_img, bboxes image1 = mpimg.imread('./test_series/series1.jpg') image2 = mpimg.imread('./test_series/series2.jpg') image3 = mpimg.imread('./test_series/series3.jpg') image4 = mpimg.imread('./test_series/series4.jpg') image5 = mpimg.imread('./test_series/series5.jpg') image6 = mpimg.imread('./test_series/series6.jpg') output_image1, bboxes1 = apply_sliding_window(image1, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins) output_image2, bboxes2 = apply_sliding_window(image2, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins) output_image3, bboxes3 = apply_sliding_window(image3, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins) output_image4, bboxes4 = apply_sliding_window(image4, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins) output_image5, bboxes5 = apply_sliding_window(image5, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins) output_image6, bboxes6 = apply_sliding_window(image6, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins) image = mpimg.imread('./test_images/test4.jpg') draw_image = np.copy(image) output_image, bboxes = apply_sliding_window(image, svc, X_scaler, pix_per_cell, cell_per_block, spatial_size, hist_bins) def show_images(image1, image2, image3, image1_exp="Image 1", image2_exp="Image 2", image3_exp="Image 3"): f, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(24, 9)) f.tight_layout() ax1.imshow(image1) ax1.set_title(image1_exp, fontsize=20) ax2.imshow(image2) ax2.set_title(image2_exp, fontsize=20) ax3.imshow(image3) ax3.set_title(image3_exp, fontsize=20) plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.) show_images(output_image1, output_image2, output_image3) show_images(output_image4, output_image5, output_image6) ``` /Users/hatanaka/anaconda3/envs/carnd-term1/lib/python3.5/site-packages/skimage/feature/_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15 'be changed to `L2-Hys` in v0.15', skimage_deprecation) ![png](./output/output_13_1.png) ![png](./output/output_13_2.png) ## Creating heatmap ```python from scipy.ndimage.measurements import label def add_heat(heatmap, bbox_list): # Iterate through list of bboxes for box in bbox_list: # Add += 1 for all pixels inside each bbox # Assuming each "box" takes the form ((x1, y1), (x2, y2)) heatmap[box[0][1]:box[1][1], box[0][0]:box[1][0]] += 1 # Return updated heatmap return heatmap# Iterate through list of bboxes def apply_threshold(heatmap, threshold): # Zero out pixels below the threshold heatmap[heatmap <= threshold] = 0 # Return thresholded map return heatmap def draw_labeled_bboxes(img, labels): # Iterate through all detected cars for car_number in range(1, labels[1]+1): # Find pixels with each car_number label value nonzero = (labels[0] == car_number).nonzero() # Identify x and y values of those pixels nonzeroy = np.array(nonzero[0]) nonzerox = np.array(nonzero[1]) # Define a bounding box based on min/max x and y bbox = ((np.min(nonzerox), np.min(nonzeroy)), (np.max(nonzerox), np.max(nonzeroy))) # Draw the box on the image cv2.rectangle(img, bbox[0], bbox[1], (0,0,255), 6) # Return the image return img heat = np.zeros_like(output_image[:,:,0]).astype(np.float) # Add heat to each box in box list heat = add_heat(heat, bboxes) # Apply threshold to help remove false positives threshold = 1 heat = apply_threshold(heat, threshold) # Visualize the heatmap when displaying heatmap = np.clip(heat, 0, 255) # Find final boxes from heatmap using label function labels = label(heatmap) draw_img = draw_labeled_bboxes(np.copy(image), labels) def show_images(image1, image2, image1_exp="Image 1", image2_exp="Image 2"): f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9)) f.tight_layout() ax1.imshow(image1) ax1.set_title(image1_exp, fontsize=20) ax2.imshow(image2, cmap='hot') ax2.set_title(image2_exp, fontsize=20) plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.) show_images(output_image, heatmap, "Car Positions", "Result") ``` ![png](./output/output_15_0.png) ## More heatmaps ```python def get_heatmap(bboxes): threshold = 1 heat = np.zeros_like(output_image[:,:,0]).astype(np.float) heat = add_heat(heat, bboxes) heat = apply_threshold(heat, threshold) heatmap = np.clip(heat, 0, 255) return heatmap def show_images(image1, image2, image1_exp="Image 1", image2_exp="Image 2"): f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9)) f.tight_layout() ax1.imshow(image1) ax1.set_title(image1_exp, fontsize=20) ax2.imshow(image2, cmap='hot') ax2.set_title(image2_exp, fontsize=20) plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.) heatmap1 = get_heatmap(bboxes1) heatmap2 = get_heatmap(bboxes2) heatmap3 = get_heatmap(bboxes3) heatmap4 = get_heatmap(bboxes4) heatmap5 = get_heatmap(bboxes5) heatmap6 = get_heatmap(bboxes6) show_images(output_image1, heatmap1) show_images(output_image2, heatmap2) show_images(output_image3, heatmap3) show_images(output_image4, heatmap4) show_images(output_image5, heatmap5) show_images(output_image6, heatmap6) ``` ![png](./output/output_17_0.png) ![png](./output/output_17_1.png) ![png](./output/output_17_2.png) ![png](./output/output_17_3.png) ![png](./output/output_17_4.png) ![png](./output/output_17_5.png) ## Labeled image ```python plt.imshow(labels[0], cmap='gray') ``` ![png](./output/output_19_1.png) ## Resulting bonding boxes ```python plt.imshow(draw_img) ``` ![png](./output/output_21_1.png) ## Applying to video ```python from collections import deque history = deque(maxlen = 8) def detect_cars(image): bboxes = [] ystart = 400 ystop = 500 out_img, bboxes1 = find_cars(image, ystart, ystop, 1.0, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 400 ystop = 500 out_img, bboxes2 = find_cars(image, ystart, ystop, 1.3, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 410 ystop = 500 out_img, bboxes3 = find_cars(out_img, ystart, ystop, 1.4, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 420 ystop = 556 out_img, bboxes4 = find_cars(out_img, ystart, ystop, 1.6, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 430 ystop = 556 out_img, bboxes5 = find_cars (out_img, ystart, ystop, 1.8, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 430 ystop = 556 out_img, bboxes6 = find_cars (out_img, ystart, ystop, 2.0, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 440 ystop = 556 out_img, bboxes7 = find_cars (out_img, ystart, ystop, 1.9, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 400 ystop = 556 out_img, bboxes8 = find_cars (out_img, ystart, ystop, 1.3, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 400 ystop = 556 out_img, bboxes9 = find_cars (out_img, ystart, ystop, 2.2, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) ystart = 500 ystop = 656 out_img, bboxes10 = find_cars (out_img, ystart, ystop, 3.0, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins) bboxes.extend(bboxes1) bboxes.extend(bboxes2) bboxes.extend(bboxes3) bboxes.extend(bboxes4) bboxes.extend(bboxes5) bboxes.extend(bboxes6) bboxes.extend(bboxes7) bboxes.extend(bboxes8) bboxes.extend(bboxes9) bboxes.extend(bboxes10) heat = np.zeros_like(out_img[:,:,0]).astype(np.float) # Add heat to each box in box list heat = add_heat(heat, bboxes) # Apply threshold to help remove false positives threshold = 1 heat = apply_threshold(heat, threshold) # Visualize the heatmap when displaying current_heatmap = np.clip(heat, 0, 255) history.append(current_heatmap) heatmap = np.zeros_like(current_heatmap).astype(np.float) for heat in history: heatmap = heatmap + heat # Find final boxes from heatmap using label function labels = label(heatmap) draw_img = draw_labeled_bboxes(np.copy(image), labels) return draw_img img = detect_cars(image) plt.imshow(img) ``` ```python import imageio imageio.plugins.ffmpeg.download() from moviepy.editor import VideoFileClip from IPython.display import HTML ``` ```python history = deque(maxlen = 8) output = 'test_result.mp4' clip = VideoFileClip("test_video.mp4") video_clip = clip.fl_image(detect_cars) %time video_clip.write_videofile(output, audio=False) ``` [MoviePy] >>>> Building video test_result.mp4 [MoviePy] Writing video test_result.mp4 97%|█████████▋| 38/39 [00:42<00:01, 1.14s/it] [MoviePy] Done. [MoviePy] >>>> Video ready: test_result.mp4 CPU times: user 38.7 s, sys: 3.22 s, total: 41.9 s Wall time: 44.6 s ```python history = deque(maxlen = 8) output = 'result.mp4' clip = VideoFileClip("project_video.mp4") video_clip = clip.fl_image(detect_cars) %time video_clip.write_videofile(output, audio=False) ```