利用樹(shù)莓派和神經(jīng)網(wǎng)絡(luò)违寞,實(shí)現(xiàn)智能小車(chē)

大眾實(shí)習(xí)任務(wù)
修改英偉達(dá)的端對(duì)端神經(jīng)網(wǎng)絡(luò)蛔琅,在樹(shù)莓派上實(shí)現(xiàn)智能小車(chē)
1.圖像處理

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 17 13:38:23 2018

@author: 51207
"""

import os
from PIL import Image
import numpy as np
import xlrd
import pickle

def loadimg_infile(imgdir):
    imgname=[]
    imgname_sorted=[]
    filename=os.listdir(imgdir)
    for file in filename:
        if 'jpg' in file:
            imgname.append(imgdir+file)
    s=len(imgname)
    for i in range(s):
        imgname_sorted.append(imgdir+'/img_'+str(i)+'.jpg')
    return imgname_sorted


def imglist_to_nparray(imglist):
    result=np.zeros((len(imglist),90,160,3),dtype=np.uint8)
    i=0
    for img in imglist:
        image=np.array(Image.open(img))
        result[i]=image
        i+=1
    return result

imgdir='D:/mywork/aidrive/intern/smallcar/data/shoudong/image3'
x=loadimg_infile(imgdir)
X=imglist_to_nparray(x)
ydata=imgdir+'/ydata.xlsx'
workbook=xlrd.open_workbook(ydata)
sheet=workbook.sheet_by_name('Sheet1')
Y=np.array(sheet.col_values(0),dtype=np.uint8)

with open('datashoudong3.pkl','wb') as fp:
    pickle.dump([X,Y],fp)      

2.模型訓(xùn)練

# -*- coding: utf-8 -*-
"""
Created on Tue Jul  3 10:43:21 2018

@author: 51207
"""

import os
import pickle
import matplotlib
from matplotlib.pyplot import imshow

file_path="D:/mywork/aidrive/intern/smallcar/data/alldata.pkl"

#提取數(shù)據(jù)
with open(file_path,'rb') as f:
    X,Y=pickle.load(f)

#劃分?jǐn)?shù)據(jù)集
import numpy as np

def unison_shuffled_copies(X,Y):
    assert len(X)==len(Y)
    p=np.random.permutation(len(X))
    return X[p], Y[p]

shuffled_X,shuffled_Y=unison_shuffled_copies(X,Y)

test_cutoff=int(len(X)* .8)
val_cutoff=test_cutoff+int(len(X)* .1)
train_X,train_Y=shuffled_X[:test_cutoff],shuffled_Y[:test_cutoff]
val_X, val_Y = shuffled_X[test_cutoff:val_cutoff], shuffled_Y[test_cutoff:val_cutoff]
test_X, test_Y = shuffled_X[val_cutoff:], shuffled_Y[val_cutoff:]

'''
#增強(qiáng)訓(xùn)練集
X_flipped = np.array([np.fliplr(i) for i in train_X])
Y_flipped = np.array([-i for i in train_Y])
train_X = np.concatenate([train_X, X_flipped])
train_Y = np.concatenate([train_Y, Y_flipped])
'''

#建模型
from keras.models import Model, load_model
from keras.layers import Input, Convolution2D, MaxPooling2D, Activation, Dropout, Flatten, Dense
img_in=Input(shape=(90,160,3),name='img_in')
angle_in=Input(shape=(1,),name='angle_in')

x=Convolution2D(8,3,3)(img_in)
x=Activation('relu')(x)
x=MaxPooling2D(pool_size=(2,2))(x)

x=Convolution2D(16,3,3)(x)
x=Activation('relu')(x)
x=MaxPooling2D(pool_size=(2,2))(x)

x=Convolution2D(32,3,3)(x)
x=Activation('relu')(x)
x=MaxPooling2D(pool_size=(2,2))(x)

merged=Flatten()(x)

x=Dense(256)(merged)
x=Activation('linear')(x)
x=Dropout(.2)(x)

angle_out=Dense(1,name='angle_out')(x)

model=Model(input=[img_in],output=[angle_out])
model.compile(optimizer='adam',loss='mean_squared_error')
model.summary()

from keras import callbacks

model_path = os.path.expanduser('~/best_autopilot.hdf5')
save_best = callbacks.ModelCheckpoint(model_path, monitor='val_loss', verbose=1,save_best_only=True, mode='min')
early_stop = callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=5,verbose=0, mode='auto')
callbacks_list = [save_best, early_stop]
model.fit(train_X, train_Y, batch_size=50, nb_epoch=20, validation_data=(val_X, val_Y), callbacks=callbacks_list)

import pandas as pd

model = load_model(model_path)
test_P = model.predict(test_X)
test_P = test_P.reshape((test_P.shape[0],)) 

df = pd.DataFrame({'predicted':test_P, 'actual':test_Y})
ax = df.plot.scatter('predicted', 'actual')

P = model.predict(X[:150])
#predict outputs nested arrays so we need to reshape to plot.
P = P.reshape((P.shape[0],)) 

ax = pd.DataFrame({'predicted':P, 'actual':Y[:150]}).plot()
ax.set_ylabel("steering angle")

3.樹(shù)莓派上運(yùn)行

# -*- coding: utf-8 -*  
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32, GPIO.IN)                          # right US Echo
GPIO.setup(36, GPIO.OUT)                         # right US Trig
GPIO.setup(15, GPIO.IN)                          # front US Echo
GPIO.setup(38, GPIO.OUT)                         # front US Trig
GPIO.setup(37, GPIO.OUT,initial = GPIO.HIGH)     # red1
GPIO.setup(35, GPIO.OUT,initial = GPIO.HIGH)     # red2
GPIO.setup(33, GPIO.OUT,initial = GPIO.LOW)      # yellow_right
GPIO.setup(31, GPIO.OUT,initial = GPIO.LOW)      # yellow_left
GPIO.setup(11, GPIO.OUT,initial = GPIO.HIGH)     # Beep
from picamera.array import PiRGBArray
from picamera import PiCamera
import serial  
import time
import cv2
import numpy as np
from keras.models import load_model

ser = serial.Serial("/dev/ttyUSB0", 9600)

def set_picamera():
    camera = PiCamera()
    camera.resolution = (640,360)
    camera.framerate = 30
    camera.brightness=60
    camera.shutter_speed = 10000
    camera.exposure_mode = 'night'
    camera.iso=800
    time.sleep(5)
    g = camera.awb_gains
    camera.awb_mode='off'
    camera.awb_gains = g
    rawCapture = PiRGBArray(camera,size=(640,360))
    
    return camera,rawCapture

def start_Beep():
    for i in range(0,5):
        GPIO.output(11,GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(11,GPIO.HIGH)
        time.sleep(0.1)

def get_angle(imageCap):
    result=np.zeros((1,90,160,3),dtype=np.uint8)
    image=np.array(imageCap)
    result[0]=image
    return int(model.predict(result)[0])

def normalize_angle(angle):
    return (int(angle/5.0+0.5))*5

if __name__ == '__main__':
    try:
        model_path='ml_model_retrain.hdf5'
        #model_path='ml_model_pbs.hdf5'
        model = load_model(model_path)
        #start_Beep()
        camera,raw = set_picamera()
        for frame in camera.capture_continuous(raw,format = "bgr",use_video_port=True):
            img = frame.array
            imageCap = cv2.resize(img,(160,90))
            angle=get_angle(imageCap)
            #angle=normalize_angle(get_angle(imageCap))
            ser.write("1,13,"+str(angle))

    except KeyboardInterrupt:  
        if ser != None:
            str1 = "1,0,90"
            n = ser.write(str1)
            time.sleep(0.2)
            print ("\nfinish")
            ser.close()

未附上圖像采集等其他程序
最終效果:
https://pan.baidu.com/s/1dZfu7dOQvmXW-ESvyUX0tQ

d1420180907_165649.gif

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仪糖,一起剝皮案震驚了整個(gè)濱河市鹤竭,隨后出現(xiàn)的幾起案子挂脑,更是在濱河造成了極大的恐慌藕漱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崭闲,死亡現(xiàn)場(chǎng)離奇詭異谴分,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)镀脂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)牺蹄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人薄翅,你說(shuō)我怎么就攤上這事沙兰。” “怎么了翘魄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鼎天,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我暑竟,道長(zhǎng)斋射,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任但荤,我火速辦了婚禮罗岖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腹躁。我一直安慰自己桑包,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布纺非。 她就那樣靜靜地躺著哑了,像睡著了一般赘方。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弱左,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天窄陡,我揣著相機(jī)與錄音,去河邊找鬼拆火。 笑死跳夭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的榜掌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼乘综,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼憎账!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卡辰,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胞皱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后九妈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體反砌,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年萌朱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宴树。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晶疼,死狀恐怖酒贬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翠霍,我是刑警寧澤锭吨,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寒匙,受9級(jí)特大地震影響零如,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锄弱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一考蕾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧会宪,春花似錦辕翰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沟沙。三九已至,卻和暖如春壁榕,著一層夾襖步出監(jiān)牢的瞬間矛紫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工牌里, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颊咬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓牡辽,卻偏偏與公主長(zhǎng)得像喳篇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子态辛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容