def _optimize_best_estimators(self): x, y = self._get_data_tuples() print("Optimizing model") ai = AI() score, params = ai.optimize_best_estimators(x, y) print(score, params)
def _analyse_predictions(self): print("Analysing predictions") x, y = self._get_data_tuples() ai = AI() main, detail = ai.analyse_predictions(x, y) print(f"Main accuracy = {main}") print(detail)
def _run_predicting(self): x, y = self._get_data_tuples() print("Enter signal frequency (Hz): ") frequency = input() ai = AI() model = ai.get_best_model(x, y) predictor = Predictor(frequency, model)
def _reverse_sbs_scores(self): print("Looking for best features...") x, y = self._get_data_tuples() print(len(y)) ai = AI() features, accuracy = ai.reverse_sbs_score(x, y) labels = Preprocessing.get_labels() print(f"Max accuracy is {accuracy}") print("Features:") for f in features: print(labels[f])
def _sbs_scores(self): print("Looking for best features...") x, y = self._get_data_tuples() ai = AI() sbs = ai.sbs_score(x, y) k_feat = [len(k) for k in sbs.subsets_] plt.plot(k_feat, sbs.scores_, marker='o') plt.ylabel('Accuracy') plt.xlabel('Number of features') plt.grid() plt.show() for subset in sbs.subsets_: if len(subset) == 4: k4 = list(subset) print(k4) break
def main(): ''' 予測を実行する ''' # AI準備 ai = AI() # スコア閾値。予測結果がこれより低いスコアの時はその他と見なす。 SCORE = 0.6 STOP = 0 LEFT = 1 FORWARD = 2 RIGHT = 3 # 距離センサー準備 kerberos = Kerberos() # Lidar取得間隔(秒) LIDAR_INTERVAL = 0.05 # 距離センサー取得間隔 sec # 予測結果を文字列で保持する result = None try: # モデルの学習ステップ数を表示する learned_step = ai.get_learned_step() print("learned_step:{}".format(learned_step)) ######################################## # 予測を実行する ######################################## while run_flag: ######################################## # 距離センサー値を取得する ######################################## distance1,distance2,distance3 = kerberos.get_distance() sensors = [distance1,distance2,distance3] ######################################## # AI予測結果を取得する ######################################## # 今回の予測結果を取得する ai_value = ai.get_prediction(sensors,SCORE) ######################################## # 予測結果を文字列に変換する ######################################## if ai_value == STOP: result = 'STOP' elif ai_value == LEFT: result = 'LEFT' elif ai_value == FORWARD: result = 'FORWARD' elif ai_value == RIGHT: result = 'RIGHT' # 予測結果のスコアが低い時、予測結果の文字列にBAD SCOREを入れる if ai_value == ai.get_other_label(): result = 'BAD SCORE' ######################################## # 予測結果をコンソールに表示する ######################################## sys.stdout.write("result:"+result+" "+str(sensors)+" \r") sys.stdout.flush() # 次のセンサー値更新まで待機する time.sleep(LIDAR_INTERVAL) except: import traceback traceback.print_exc() print('error! main failed.') finally: print("") sys.stdout.flush() print("main end") pass return
def _train_model(self): print("Training model") x, y = self._get_data_tuples() ai = AI() ai.simple_test(x, y)
def _random_forest_scores(self): print("Looking for best features...") x, y = self._get_data_tuples() ai = AI() ai.random_forest_score(x, y, Preprocessing.get_labels())
def main(): ''' メイン処理を行う部分 ''' global stop_thread_running global main_thread_running print("main") # I2C Bus number BUSNUM=1 # CAR準備 STOP=0 LEFT=1 FORWARD=2 RIGHT=3 HANDLE_NEUTRAL = CarConfig.HANDLE_NEUTRAL HANDLE_ANGLE = CarConfig.HANDLE_ANGLE car = Car(busnum=BUSNUM) speed = 0 angle = HANDLE_NEUTRAL ratio = 1.0 # 角度制御率 N_BACK_FOWARD = CarConfig.N_BACK_FOWARD MAX_LOG_LENGTH = CarConfig.MAX_LOG_LENGTH log_queue = Queue.Queue(maxsize=MAX_LOG_LENGTH) # バック時に使うために行動結果を保持する copy_log_queue = Queue.Queue(maxsize=MAX_LOG_LENGTH) # 連続バック動作のためのlog_queueバックアップキュー back_queue = Queue.LifoQueue(maxsize=MAX_LOG_LENGTH) # バック方向キュー # AI準備 ai = AI("car_model_100M.pb") SCORE = 0.6 # スコア閾値 # IF準備 (学習ラベル ジェネレータ) #generator = LabelGenerator() # 近接センサー準備 kerberos = Kerberos(busnum=BUSNUM) LIDAR_INTERVAL = 0.05 # 距離センサー取得間隔 sec try: # モデルの学習ステップ数を表示する learned_step = ai.get_learned_step() print("learned_step:{}".format(learned_step)) while main_thread_running: if not stop_thread_running: break # 強制停止ならループを抜ける ######################################## # 近接センサー値を取得する ######################################## distance1,distance2,distance3 = kerberos.get_distance() sensors = [distance1,distance2,distance3] ######################################## # AI予測結果を取得する ######################################## # 今回の予測結果を取得する ai_value = ai.get_prediction(sensors,SCORE) print("ai_value:{} {}".format(ai_value,sensors)) # 予測結果のスコアが低い時は何もしない if ai_value == ai.get_other_label(): time.sleep(LIDAR_INTERVAL) continue ######################################## # IF結果を取得する ######################################## # 今回の結果を取得する #generator_result = generator.get_label(sensors) #ai_value = np.argmax(generator_result) ######################################## # 速度調整を行う ######################################## if distance2 >= 100: # 前方障害物までの距離が100cm以上ある時、速度を最大にする speed = 100 else: # 前方障害物までの距離が100cm未満の時、速度を調整する speed = int(distance2) if speed < 40: speed = 40 ######################################## # ハンドル角調整を行う ######################################## if ai_value == 1: # 左に行くけど、左右スペース比で舵角を制御する if distance1 > 100: # 左空間が非常に大きい時、ratio制御向けに最大値を設定する distance1 = 100 if distance3 > distance1: # raitoが1.0を超えないように確認する distance3 = distance1 ratio = (float(distance1)/(distance1 + distance3) -0.5) * 2 # 角度をパーセント減にする if distance2 < 100: ratio = 1.0 elif ai_value == 3: # 右に行くけど、左右スペース比で舵角を制御する if distance3 > 100: # 右空間が非常に大きい時、ratio制御向けに最大値を設定する distance3 = 100 if distance1 > distance3: # raitoが1.0を超えないように確認する distance3 = distance1 ratio = (float(distance3)/(distance1 + distance3) -0.5) * 2 # 角度をパーセント減にする if distance2 < 100: ratio = 1.0 else: ratio = 1.0 if not stop_thread_running: break # 強制停止ならループを抜ける ######################################## # ロボットカーを 前進、左右、停止 する ######################################## if ai_value == STOP: car.stop() car.set_angle(HANDLE_NEUTRAL) elif ai_value == LEFT: car.set_angle(HANDLE_NEUTRAL - (HANDLE_ANGLE * ratio)) car.forward(speed) elif ai_value == FORWARD: car.forward(speed) car.set_angle(HANDLE_NEUTRAL) elif ai_value == RIGHT: car.set_angle(HANDLE_NEUTRAL + (HANDLE_ANGLE * ratio)) car.forward(speed) ######################################## # もし停止なら、ロボットカーを後進する ######################################## ''' バック時、直前のハンドルログからN件分を真っ直ぐバックし、M件分を逆ハンドルでバックする その後、狭い方にハンドルを切ってバックする ''' if ai_value == STOP: time.sleep(1) # 停止後1秒、車体が安定するまで待つ if not stop_thread_running: break # 強制停止ならループを抜ける # バック時のハンドル操作キューを作成する copy_log_queue.queue = copy.deepcopy(log_queue.queue) # ハンドル操作キューが足りない時はバックハンドル操作を前進にする if log_queue.qsize() < MAX_LOG_LENGTH: for i in range(log_queue.qsize(),MAX_LOG_LENGTH): back_queue.put(FORWARD) while not log_queue.empty(): back_queue.put(log_queue.get(block=False)) log_queue.queue = copy.deepcopy(copy_log_queue.queue) speed = 60 car.back(speed) # バックする #################### # N件分を真っ直ぐバックする #################### for i in range(0,N_BACK_FOWARD): if not stop_thread_running: break # 強制停止ならループを抜ける car.set_angle(HANDLE_NEUTRAL) # N件分をバックハンドル操作キューから削除する back_queue.get(block=False) time.sleep(LIDAR_INTERVAL) #################### # 残りのログ分のハンドル操作の最大方向をハンドルに設定する #################### angle = 0 # 左右どちらが多いか angle_forward = 0 # 前進方向の回数 back_queue_size = back_queue.qsize() for i in range(0,back_queue_size): value = back_queue.get(block=False) if value == RIGHT: angle += 1 elif value == LEFT: angle -= 1 elif value == FORWARD: angle_forward +=1 if angle_forward >= back_queue_size/3: # ハンドルログは前進が多いので真っ直ぐバックする back = FORWARD elif angle > 0: # ハンドルログは左が多いので右にバッグする back = RIGHT else: # ハンドルログは右が多いので左にバックする back = LEFT for i in range(0,back_queue_size): if not stop_thread_running: break # 強制停止ならループを抜ける if back == LEFT: car.set_angle(HANDLE_NEUTRAL + HANDLE_ANGLE) # 直前のハンドル方向とは逆の右にハンドルを切る elif back == RIGHT: car.set_angle(HANDLE_NEUTRAL - HANDLE_ANGLE) # 直前のハンドル方向とは逆の左にハンドルを切る elif back == FORWARD: car.set_angle(HANDLE_NEUTRAL) time.sleep(LIDAR_INTERVAL) #################### # ここで左,前,右に20cm以上の空きスペースを見つけられない場合はひたすらバックする #################### speed=60 car.back(speed) # バックする while True: if not stop_thread_running: break # 強制停止ならループを抜ける distance1,distance2,distance3 = kerberos.get_distance() if distance1 > 20 and distance2 > 20 and distance3 > 20: break if distance1 >= distance3*2: # 右の方が圧倒的に狭いので右にハンドルを切る car.set_angle(HANDLE_NEUTRAL + HANDLE_ANGLE) # 右にハンドルを切る elif distance3 >= distance1*2: # 左の方が圧倒的に狭いので左にハンドルを切る car.set_angle(HANDLE_NEUTRAL - HANDLE_ANGLE) # 左にハンドルを切る elif distance1 >= distance3: # 右に少しハンドルを切る ratio = float(distance3)/(distance1 + distance3) # 角度をパーセント減にする car.set_angle(HANDLE_NEUTRAL + HANDLE_ANGLE*ratio) # 右にハンドルを切る elif distance3 >= distance1: # 左に少しハンドルを切る ratio = float(distance1)/(distance1 + distance3) # 角度をパーセント減にする car.set_angle(HANDLE_NEUTRAL - HANDLE_ANGLE*ratio) # 左にハンドルを切る time.sleep(LIDAR_INTERVAL) if not stop_thread_running: break # 強制停止ならループを抜ける car.stop() ai_value = 0 speed = 0 time.sleep(0.5) # 停止後0.5秒待つ car.set_angle(HANDLE_NEUTRAL) time.sleep(0.5) # 停止後ハンドル修正0.5秒待つ if not stop_thread_running: break # 強制停止ならループを抜ける else: if not stop_thread_running: break # 強制停止ならループを抜ける # 前進の時は直前のハンドル操作を記憶する qsize = log_queue.qsize() if qsize >= MAX_LOG_LENGTH: log_queue.get(block=False) qsize = log_queue.qsize() log_queue.put(ai_value) time.sleep(LIDAR_INTERVAL) except: import traceback traceback.print_exc() print('error! main failed.') finally: print("main end") # ボタンスレッドを停止させる stop_thread_running = False car.stop() car.set_angle(HANDLE_NEUTRAL) pass return
def main(): ''' 予測を実行する ''' # AI準備 ai = AI("car_model.pb") # スコア閾値。予測結果がこれより低いスコアの時はその他と見なす。 SCORE = 0.6 # IF準備 (AI学習データジェネレータ) generator = LabelGenerator() # 評価した回数をカウント counter = 0 # 低スコアの回数をカウント bad_score_counter = 0 # 予測結果とジェネレータ結果が異なる回数をカウント(低スコアの回数も含む) miss_counter = 0 # 評価する距離範囲 MIN_RANGE = 0 MAX_RANGE = 400 try: # モデルの学習ステップ数を表示する learned_step = ai.get_learned_step() print("learned_step:{}".format(learned_step)) ######################################## # 距離センサー値を生成する ######################################## sensors=[] for distance1 in range(MIN_RANGE,MAX_RANGE): for distance2 in range(MIN_RANGE,MAX_RANGE): for distance3 in range(MIN_RANGE,MAX_RANGE): # 学習範囲内のデータはこの検証から省く if not (distance1 < 200 and distance2 < 200 and distance3 < 200): sensors.append([distance1,distance2,distance3]) if (distance1+1) % 10 == 0: sensors=np.array(sensors) ######################################## # AI予測結果を取得する ######################################## # 今回の予測結果を取得する ai_values = ai.get_predictions(sensors,SCORE) n_rows = len(sensors) for i in range(n_rows): counter +=1 # 予測結果のスコアが低かった回数をカウントする if ai_values[i] == ai.get_other_label(): bad_score_counter += 1 ######################################## # IF結果を取得する ######################################## # 今回の結果を取得する generator_result = generator.get_label(sensors[i]) if_value = np.argmax(generator_result) # 予測結果とジェネレータ結果が異なった回数をカウントする if not if_value == ai_values[i]: miss_counter += 1 # 不一致の予測結果をコンソールに表示する print_log(sensors[i],ai,ai_values[i],if_value,counter,miss_counter,bad_score_counter) ######################################## # 定期的に予測結果をコンソールに表示する ######################################## if counter % 10000 == 0: print_log(sensors[i],ai,ai_values[i],if_value,counter,miss_counter,bad_score_counter,log=False) # sensorsを初期化する sensors=[] except: import traceback traceback.print_exc() print('error! main failed.') finally: print("accuracy:"+str((counter-miss_counter)/(counter*1.0))+" total:"+str(counter)+" miss:"+str(miss_counter)+" bad score:"+str(bad_score_counter)) print("main end") pass return