diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..359bb5307e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000..105ce2da2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..25d4c9c531 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..0e01bed9d6 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/nn.iml b/.idea/nn.iml new file mode 100644 index 0000000000..a80c2ef563 --- /dev/null +++ b/.idea/nn.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/driverless_car_yb/README.md b/src/driverless_car_yb/README.md index 8c27ba2124..31c342a6a0 100644 --- a/src/driverless_car_yb/README.md +++ b/src/driverless_car_yb/README.md @@ -1 +1,23 @@ -无人车 \ No newline at end of file +# 无人车项目 + +## 项目简介 +无人车(自动驾驶汽车)是一种集成了人工智能、传感器技术、计算机视觉和机器学习等前沿技术的智能交通工具。该项目旨在开发能够在复杂道路环境中自主导航、避障、识别交通标志并安全行驶的无人驾驶系统。 + +## 核心技术 +**计算机视觉**:通过摄像头识别道路标志、车辆、行人等 +**传感器融合**:整合激光雷达、毫米波雷达等传感器数据 +**路径规划**:基于实时环境信息规划最优行驶路径 +**决策系统**:处理复杂交通场景并做出驾驶决策 +**机器学习**:通过深度学习模型提升驾驶安全性 + +## 主要功能 +自动跟车与变道 +智能避障与紧急制动 +自动泊车 +语音控制与导航 +实时路况分析 + +## 技术优势 +本项目采用模块化架构设计,支持多种传感器配置和算法策略,确保系统的可扩展性和稳定性。通过大规模数据训练和仿真测试,持续优化算法性能。 + +--- \ No newline at end of file diff --git a/src/driverless_car_yb/main.py b/src/driverless_car_yb/main.py new file mode 100644 index 0000000000..efc22d79eb --- /dev/null +++ b/src/driverless_car_yb/main.py @@ -0,0 +1,275 @@ +import os +import cv2 +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +from sklearn.model_selection import train_test_split +from tensorflow.keras.models import Sequential, load_model +from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, Lambda +from tensorflow.keras.optimizers import Adam +from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping + + +# -------------------------- +# 1. 数据生成与预处理 +# -------------------------- +def create_simulated_data(data_dir, num_samples=1000): + """ + 创建模拟的驾驶数据(图像和转向角) + """ + os.makedirs(data_dir, exist_ok=True) + os.makedirs(os.path.join(data_dir, 'images'), exist_ok=True) + + # 生成转向角(-45度到45度之间) + steering_angles = np.random.uniform(-45, 45, num_samples) + + # 创建CSV文件 + data = {'image_path': [], 'steering_angle': []} + + for i in range(num_samples): + # 生成模拟图像(道路场景) + img = np.zeros((240, 320, 3), dtype=np.uint8) + + # 绘制道路 + cv2.rectangle(img, (100, 0), (220, 240), (100, 100, 100), -1) + + # 绘制车道线 + cv2.line(img, (130, 0), (160, 240), (255, 255, 255), 2) + cv2.line(img, (190, 0), (160, 240), (255, 255, 255), 2) + + # 根据转向角调整车道线 + angle_rad = np.radians(steering_angles[i]) + offset = int(50 * np.tan(angle_rad)) + + cv2.line(img, (130 + offset, 0), (160 + offset, 240), (0, 255, 0), 2) + cv2.line(img, (190 + offset, 0), (160 + offset, 240), (0, 255, 0), 2) + + # 保存图像 + img_path = os.path.join(data_dir, 'images', f'{i:04d}.jpg') + cv2.imwrite(img_path, img) + + data['image_path'].append(img_path) + data['steering_angle'].append(steering_angles[i]) + + # 保存CSV文件 + df = pd.DataFrame(data) + df.to_csv(os.path.join(data_dir, 'driving_log.csv'), index=False) + print(f"生成 {num_samples} 个模拟样本") + return df + + +# 创建模拟数据 +data_dir = 'simulated_data' +df = create_simulated_data(data_dir, num_samples=2000) + + +# 数据增强函数 +def augment_image(img, angle): + """ + 对图像进行增强处理 + """ + # 随机水平翻转 + if np.random.rand() > 0.5: + img = cv2.flip(img, 1) + angle = -angle + + # 随机调整亮度 + hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV) + brightness = np.random.uniform(0.7, 1.3) + hsv[:, :, 2] = np.clip(hsv[:, :, 2] * brightness, 0, 255) + img = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB) + + # 随机裁剪 + img = img[50:190, :, :] # 裁剪天空和地面部分 + + # 随机平移 + tx = np.random.randint(-20, 20) + ty = np.random.randint(-10, 10) + M = np.float32([[1, 0, tx], [0, 1, ty]]) + img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0])) + + return img, angle + + +# 数据生成器 +def data_generator(df, batch_size=32, augment=True): + """ + 生成批量训练数据 + """ + while True: + batch_images = [] + batch_angles = [] + + # 随机打乱数据 + shuffled_df = df.sample(frac=1).reset_index(drop=True) + + for i in range(batch_size): + # 获取图像路径和转向角 + img_path = shuffled_df.iloc[i]['image_path'] + angle = shuffled_df.iloc[i]['steering_angle'] + + # 读取图像 + img = cv2.imread(img_path) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + + # 数据增强 + if augment: + img, angle = augment_image(img, angle) + + # 图像预处理 + img = cv2.resize(img, (200, 66)) # 适应NVIDIA模型输入 + img = img / 255.0 # 归一化 + + batch_images.append(img) + batch_angles.append(angle) + + yield np.array(batch_images), np.array(batch_angles) + + +# 划分训练集和验证集 +train_df, val_df = train_test_split(df, test_size=0.2, random_state=42) + +# 创建数据生成器 +train_generator = data_generator(train_df, batch_size=32, augment=True) +val_generator = data_generator(val_df, batch_size=32, augment=False) + + +# -------------------------- +# 2. 构建深度学习模型 +# -------------------------- +def build_model(): + """ + 构建基于CNN的转向角预测模型(参考NVIDIA架构) + """ + model = Sequential() + + # 图像预处理层 + model.add(Lambda(lambda x: x / 255.0 - 0.5, input_shape=(66, 200, 3))) + + # 卷积层 + model.add(Conv2D(24, (5, 5), strides=(2, 2), activation='relu')) + model.add(Conv2D(36, (5, 5), strides=(2, 2), activation='relu')) + model.add(Conv2D(48, (5, 5), strides=(2, 2), activation='relu')) + model.add(Conv2D(64, (3, 3), activation='relu')) + model.add(Conv2D(64, (3, 3), activation='relu')) + + # 全连接层 + model.add(Flatten()) + model.add(Dense(100, activation='relu')) + model.add(Dropout(0.5)) + model.add(Dense(50, activation='relu')) + model.add(Dropout(0.5)) + model.add(Dense(10, activation='relu')) + model.add(Dense(1)) # 输出转向角 + + # 编译模型 + model.compile(optimizer=Adam(learning_rate=0.001), loss='mse') + + return model + + +# 构建模型 +model = build_model() +model.summary() + +# -------------------------- +# 3. 训练模型 +# -------------------------- +# 定义回调函数 +checkpoint = ModelCheckpoint( + 'best_model.h5', + monitor='val_loss', + save_best_only=True, + mode='min', + verbose=1 +) + +early_stop = EarlyStopping( + monitor='val_loss', + patience=5, + mode='min', + verbose=1, + restore_best_weights=True +) + +# 训练模型 +history = model.fit( + train_generator, + steps_per_epoch=len(train_df) // 32, + epochs=30, + validation_data=val_generator, + validation_steps=len(val_df) // 32, + callbacks=[checkpoint, early_stop], + verbose=1 +) + +# 绘制训练曲线 +plt.figure(figsize=(10, 5)) +plt.plot(history.history['loss'], label='训练损失') +plt.plot(history.history['val_loss'], label='验证损失') +plt.xlabel('Epoch') +plt.ylabel('MSE损失') +plt.legend() +plt.title('训练过程') +plt.show() + +# -------------------------- +# 4. 模型评估与实时预测 +# -------------------------- +# 加载最佳模型 +best_model = load_model('best_model.h5') + +# 在验证集上评估 +val_loss = best_model.evaluate(val_generator, steps=len(val_df) // 32, verbose=1) +print(f"验证集损失: {val_loss:.4f}") + + +# 实时预测演示 +def real_time_prediction(model): + """ + 使用摄像头进行实时转向角预测 + """ + cap = cv2.VideoCapture(0) + cap.set(3, 320) # 设置宽度 + cap.set(4, 240) # 设置高度 + + while True: + ret, frame = cap.read() + if not ret: + break + + # 图像预处理 + img = frame[50:190, :, :] # 裁剪 + img = cv2.resize(img, (200, 66)) # 调整尺寸 + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换颜色空间 + img = img / 255.0 # 归一化 + img = np.expand_dims(img, axis=0) # 增加批次维度 + + # 预测转向角 + steering_angle = model.predict(img)[0][0] + + # 在图像上显示转向角 + cv2.putText( + frame, + f"Steering Angle: {steering_angle:.2f} deg", + (10, 30), + cv2.FONT_HERSHEY_SIMPLEX, + 1, + (0, 255, 0), + 2 + ) + + # 显示图像 + cv2.imshow('Autonomous Driving', frame) + + # 按'q'退出 + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + cap.release() + cv2.destroyAllWindows() + + +# 运行实时预测 +print("开始实时预测... 按'q'退出") +real_time_prediction(best_model) \ No newline at end of file