ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [오픈소스소프트웨어 - AutoDrive] 좋구만
    카테고리 없음 2020. 2. 20. 12:42

    #라즈베리파이 #케라스 #딥러닝 자율주행 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를 사용했습니다.


    각 코드를 저희가 쓰기 편하게 수정했고, 아래와 함께 코드를 만들었습니다.일. stream_client.py -> pi_client.py (라즈베리파이에서 쓰는 코드)


    >


    >


    >


    stream_client.py로 클래스를 만들어 코드를 구성했습니다. 1)MySocketClient라는 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로 초기화합니다.​ 1)load_data:train을 수행하기 위해서 수집된 data를 load 합니다. 2)normalize_meanstd:키위, 정규화를 통해서 초기에 낮은 acc를 유지한 현상을 해결했습니다.3)prepare_data:수집된 데이터를 모두 섞습니다. 3-1)data를 shuffle 합니다.3-2)train_data는 80%, test_data를 20%에 자신 무엇을 보존하고 줍니다.4)create_model:keras api를 사용하고 네트워크를 설계하고 줍니다. 5)train:train된 데이터를 저장할 변수로 저장하는 경로 등을 설정합니다. 실제 train프로세스로 생각하세요.5-1)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와 라즈베리파이를 연결하여 키보드로 주행하고 데이터를 수집하고, 그 데이터를 트레이너시키는 단계까지 완성시켰습니다!! 그럼 지금 해야 할 일은 트레이너를 사용해서 자율주행을 해보는 것! 코드는 m 을 만들었습니다.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.