ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [오픈소스소프트웨어 좋구만
    카테고리 없음 2020. 1. 30. 22:17

    #라즈베리파이 #케라스 #딥러닝 자율주행 RC자동차를 만들어 보고 싶은 Github에서 좋은 오픈소스 프로그램을 찾아봤습니다.우선, 저희가 사용하는 RC자동차판매소가 공급하는 소스를 사용하였습니다.https://github.com/sunfounder/Sunfounder_Smart_Video_Car_Kit_for_RaspberryPi


    라즈베리 파이에서 이 소스를 다운로드해서 저장해 두겠습니다.


    거기서 RC자동차의 라즈베리파이와 PC를 소켓 통신으로 접속하기 위한 소스를 아래 링크에서 사용했습니다.https://github.com/hamuchiwa/AutoRCCar


    그 중 PC는 AutoRCCar/computer/collect_training_data.py를 사용했고 라즈베리파이는 AutoRCCar/raspberryPi/stream_client.py를 사용했습니다.


    각 코드를 저희가 쓰기 쉽게 수정해서 이 강과 함께 코드를 만들었어요.1개.stream_client.py->pi_client.py(라즈베리 화이에서 사용 코드)


    >


    >


    >


    (코드설명) stream_client.py로 클래스를 만들어 코드를 구성했습니다. 첫) My Socket Client라는 class를 만들고 PC와 통신을 위한 쌍방향 소켓을 발발하여 연결했습니다.라즈베리 파이->pc:파이 카메라의 영상을 전송 pc->라즈베리 파이:전송 받은 영상을 보고사용자가 찍힌 key를 전송 2)streaming:라즈베리 파이에 부착된 picamera를 통해서 키위 지의 입력을 받고 PC로 전송하는 함수 3)listen:PC가 전송하는 command를 받아 실제로 RC자동차를 구동하는 함수 5)PC ip의 주소를 통해서 소켓 연결하여 주고 steaming합니다.


    2.collect_training_data.py->my_collect_training_data_with dir.py(PC에서 사용하는 코드)


    >


    >


    >


    >


    >


    collect_training_data.py코드로 class를 입니다.자로 사용하였고, 몇 가지 수정하였습니다.1)CollectTrainingData라는 class를 만들어 산딸기 파이와 통신을 위한 소켓을 생성하고 연결했습니다.2)산딸기 파이로에서 받은 현재 image그 때 찍힌 key, 그 때의 자동차 핸들 각도를 보존할 변수를 만들어 주십니다.X:image, y:key, z:handle_dir 여기서 핸들 각도를 같이 저장하는 이유! 핸들에 의해서 카메라가 움직이도록 한 것이 아니고, 현재 이미지나 키를 눌렀을 때 차의 상황을 알 수 없습니다.따라서 핸들의 각도도 함께 저장해 주었습니다.​ 3)send_to_pi:현재의 이미지로 밀렸다 key를 pi로 보내는 함수 4)collect 4-1)pi에서 영감을 받고, 이미지의 아랫부분만 사용하므로 끊어 줍니다(도로 상황을 인식하면 되기 때문)4-2)현재의 이미지로 등을 떠밀고 오면, 이미지, 키 핸들 각도가 함께 보존됩니다.4-3)collect를 종료하면 파이와 연결을 내고 프로그램을 종료합니다. 위의 코드로 RC자동차를 주행하면서 데이터를 수집합니다.


    지금 RC자동차를 교육해 볼까요? 먼저 train 시키기 위해서 사용할 api를 선택해야 합니다. 저는 keras를 사용해 보았습니다. https://github.com/keras-team/keras/blob/master/tests/test_loss_weighting.py


    위의 링크에서 참고로 class를 만들어 수정해 보았습니다.my_cnn.py (train시켜 자율주행을 위한 코드)


    >


    >


    >


    코드설명) test_loss_weighting.py 코드를 참고하여 AutoR CarCNN() 클래스를 만들었습니다.발발자를 통해 트레이너하는 수집 데이터를 가져올 디렉토리 경로와 추후 자율주행을 위해 트레이너를 불러오는 과정을 위한 디렉토리 경로를 선언하고 model=None, data_loaded=False로 초기화합니다.한)load_data:train을 실행하기 위해서 수집된 데이터를 load한다. 2)normalize_meanstd:이미지의 정규화를 통해서 초기에 낮은 acc를 유지한 현상을 해결했습니다.3)prepare_data:수집된 데이터를 모두 섞습니다. 3하나)data를 shuffle 합니다.3-2)train_data는 80Percent, test_data를 20Percent에서 난 뭘 저장합니다.4)create_model:keras api를 사용하고 네트워크를 설계하고 줍니다. 5)train:train된 데이터를 저장할 변수로 저장하는 경로 등을 설정합니다. 실제 train프로세스라고 생각하세요.5하나)cp_callback에 데이터를 저장하는 변수를 만들어 줍니다. 설계된 네트워크를 가진 모델로 트레인시킵니다.5-2)model.fit함수를 통해서 한 epoch당 train과정의 acc(성공율)와 loss(오차)을 출력한다.6)evaluate_with_reloading_weights:evaluate를 통해서 현재 epoch의 평균 accuracy를 요구하고 출력합니다.7)predict:앞으로 자율 주행을 할 때 사용하기 때문에 test_image(현재의 이미지), cur_dri(현재 핸들 방향)을 매개 변수로 전송한 key를 예측하고 줍니다.AutoRCCarCNN()클래스를 발발하여 prepare_data메시지로 데이터를 로드한 후 shuffle을 통해 데이터를 prepare해줍니다.그 후, train 메서드를 통해서 train을 개시한다.​


    PC와 라즈베리파이를 연결하여 키보드로 주행하고 데이터를 수집하고, 그 데이터를 트레이너시키는 단계까지 완성시켰습니다!! 그럼 아까 해야할 일은 트레이너를 사용해서 자율주행을 해보는 것! 코드는 my_collect_training_data_with_dir.py를 수정하여 하을 만들었습니다.AutoDriveImageWiteDir.py


    >


    >


    >


    >


    >


    Auto Drive 클래스를 만들어 코드를 완성시켰습니다.1)자율주행을 위해 우선 PC와 라즈베리파이를 양방향 소켓통신으로 연결해야 합니다.라즈베리 파이 -> PC:파이 카메라의 영상을 전송하고, pc -> 라즈베리 파이: 송신된 영상을 test_image로 만들어 predict 한 결과에 따라 맞는 결과를 라즈베리 파이로 송신합니다. 2)send_to_pi:train된 데이터로 predict한 결과 key를 산딸기 파이로 전송합니다.3)collect:사양 collect함수는 산딸기 파이로에서 받은 영상을 test_data에서 사용하고 predict의 결과 값을 받고 send_to_pi함수를 통해서 결과를 산딸기 파이로 전송합니다.마지막 단계인 collect에서 실시간으로 전송해주는 predict의 반환값인 predicted_move_choice에서 RC자동차가 자율주행 할 수 있게 됩니다.


    >


    이상 양방향 소켓 통신과 케라스 api를 사용하여 Auto Drive 자율주행 자동차를 만들었습니다.


    빤디후레!!



    댓글

Designed by Tistory.