基于PaddlePaddle开发智能车自动巡线驾驶模型

  本项目是基于PaddlePaddle深度学习框架来开发自动巡线模型框架,开发思路是通过手柄驱动小车巡线的来读取手柄偏移值配合图像来生成数据集内容,借用AlexNet神经网络模型

import paddle.fluid as fluid
from paddle.fluid.dygraph.nn import Conv2D, Linear, Pool2D
import cv2
import json
import numpy as np
import os
import re
import random


datafile = json.load(open("result.json"))     # file是一个字典类型


def transform_img(img):
    # 将图片归一化保证图片最后为-1到1的数组
    img = cv2.resize(img, (224, 224))
    img = np.transpose(img, (2, 0, 1))
    img = img.astype("float32")
    img = img / 255
    img = img * 2.0 - 1.0

    return img

def data_loader(datadir, batch_size = 10, mode = "train"):
    filenames = os.listdir(datadir)
    def reader():
        random.shuffle(filenames)           # 随机打乱训练集
        batch_imgs = []
        batch_labels = []
        for name in filenames:

            # 读取数据集
            filepath = os.path.join(datadir, name)
            img = cv2.imread(filepath)
            img = transform_img(img)
            index = re.findall(r"\d+", name)
            label = datafile[index[0]]

            batch_imgs.append(img)
            batch_labels.append(label)

            # 打包成mini-batch
            if len(batch_imgs) == batch_size:
                # 设置mini-batch
                imgs_array = np.array(batch_imgs).astype("float32")
                labels_array = np.array(batch_labels).astype("float32").reshape(-1, 1)
                yield imgs_array, labels_array              # 设置迭代器
                batch_imgs = []
                batch_labels = []

            if len(batch_imgs) > 0:
                # 剩余样本数量不足一个batch_size的数据,一起打包成一个mini_batch
                imgs_array = np.array(batch_imgs).astype("float32")
                labels_array = np.array(batch_labels).astype("float32").reshape(-1, 1)
                yield imgs_array, labels_array


    return reader

data_dir = "train"
train_loader = data_loader(data_dir, batch_size = 10, mode = "train")
data_reader = train_loader()
data = next(data_reader)        # 返回迭代器下一个项目

def train(model):
    with fluid.dygraph.guard():
        print("start training......")
        model.train()
        epoch_num = 5
        opt = fluid.optimizer.Momentum(learning_rate = 0.001, momentum = 0.9, parameter_list = model.parameters())
        train_loader = data_loader(data_dir, batch_size = 10, mode = "train")
        for epoch in range(epoch_num):

            for batch_id, data in enumerate(train_loader()):
                x_data, y_data = data
                img = fluid.dygraph.to_variable(x_data)
                label = fluid.dygraph.to_variable(y_data)
                # 模型前向运算
                logits = model(img)
                # loss运算
                # 使用mean均方差函数求loss
                loss = fluid.layers.mse_loss(logits, label)
                avg_loss = fluid.layers.mean(loss)

                if batch_id % 10 == 0:
                    print("epoch:{},batch_id:{},loss is {}".format(epoch, batch_id, avg_loss.numpy()))

                #  反向传播,更新权重,清除梯度
                avg_loss.backward()
                opt.minimize(avg_loss)
                model.clear_gradients()


            model.eval()
            model.train()

        # 保存权重值
        fluid.save_dygraph(model.state_dict(), "CNN")
        fluid.save_dygraph(opt.state_dict(), "CNN")


def evaluation(model, params_file_path):
    with fluid.dygraph.guard():
        print("start evaluation.......")
        model_state_dict, _ = fluid.load_dygraph(params_file_path)
        model.load_dict(model_state_dict)

        model.eval()
        eval_loader = data_loader(data_dir, batch_size = 10, mode = "eval")
        acc_set = []
        avg_loss_set = []
        for batch_id, data in enumerate(eval_loader()):
            x_data, y_data = data
            img = fluid.dygraph.to_variable(x_data)
            label = fluid.dygraph.to_variable(y_data)
            y_data = y_data.astype(np.float32)
            label_64 = fluid.dygraph.to_variable(y_data)
            # 计算预测和精度
            prediction, acc = model(img, label)
            # 计算损失函数值
            loss = fluid.layers.mse_loss(input = prediction, label = label)     # 这里改过
            avg_loss = fluid.layers.mean(loss)
            acc_set.append(float(acc.numpy()))
            avg_loss_set.append(float(avg_loss.numpy()))
        # 求平均精度
        acc_val_mean = np.array(acc_set).mean()
        avg_loss_val_mean = np.array(avg_loss_set).mean()

        print("loss = {},acc = {}".format(avg_loss_val_mean, acc_val_mean))


class AlexNet(fluid.dygraph.Layer):

    def __init__(self, num_classes = 1):
        super(AlexNet, self).__init__()

        self.conv1 = Conv2D(num_channels = 3, num_filters = 96, filter_size = 11, stride = 4, padding = 5, act = "relu")
        self.pool1 = Pool2D(pool_size = 2, pool_stride = 2, pool_type = "max")
        self.conv2 = Conv2D(num_channels = 96, num_filters = 256, filter_size = 5, stride = 1, padding = 2, act = "relu")
        self.pool2 = Pool2D(pool_size = 2, pool_stride = 2, pool_type = "max")
        self.conv3 = Conv2D(num_channels = 256, num_filters = 384, filter_size = 3, stride = 1, padding = 1, act = "relu")
        self.conv4 = Conv2D(num_channels = 384, num_filters = 384, filter_size = 3, stride = 1, padding = 1, act = "relu")
        self.conv5 = Conv2D(num_channels = 384, num_filters = 256, filter_size = 3, stride = 1, padding = 1, act = "relu")
        self.pool5 = Pool2D(pool_size = 2, pool_stride = 2, pool_type = "max")

        self.fc1 = Linear(input_dim = 12544, output_dim = 4096, act = "relu")
        self.drop_ratio1 = 0.5
        self.fc2 = Linear(input_dim = 4096, output_dim = 4096, act = "relu")
        self.drop_ratio2 = 0.5
        self.fc3 = Linear(input_dim = 4096, output_dim = num_classes)
    def forward(self, x):
        x = self.conv1(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = self.pool2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.conv5(x)
        x = self.pool5(x)
        x = fluid.layers.reshape(x, [x.shape[0], -1])
        x = self.fc1(x)
        x = fluid.layers.dropout(x, self.drop_ratio1)
        x = self.fc2(x)
        x = fluid.layers.dropout(x, self.drop_ratio2)
        x = self.fc3(x)
        predict = fluid.layers.tanh(x)


        return predict

if __name__ == "__main__":
    with fluid.dygraph.guard():
        model = AlexNet()

    train(model)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
编写自动巡线智能小车程序可以分为以下几个步骤: 1. 硬件初始化:包括电机、传感器等硬件模块的初始化,需要根据具体硬件进行初始化设置。 2. 传感器数据获取:通过传感器获取小车当前位置信息,例如巡线传感器可以用来检测小车是否偏离了巡线路径。 3. 控制策略设计:根据传感器获取的数据,设计控制策略使小车能够自动巡线,例如当巡线传感器检测到小车偏离巡线路径时,通过电机控制使小车调整方向回到巡线路径。 4. 控制指令发送:将控制策略转化为具体的控制指令,例如通过PWM信号控制电机转速,从而实现小车移动。 下面是一个简单的自动巡线小车程序示例(以Arduino为例): ```c #define LEFT_SENSOR_PIN A0 #define RIGHT_SENSOR_PIN A1 #define LEFT_MOTOR_PIN 3 #define RIGHT_MOTOR_PIN 5 void setup() { pinMode(LEFT_SENSOR_PIN, INPUT); pinMode(RIGHT_SENSOR_PIN, INPUT); pinMode(LEFT_MOTOR_PIN, OUTPUT); pinMode(RIGHT_MOTOR_PIN, OUTPUT); } void loop() { int left_sensor = analogRead(LEFT_SENSOR_PIN); int right_sensor = analogRead(RIGHT_SENSOR_PIN); if (left_sensor > 500 && right_sensor > 500) { // 巡线传感器未检测到线 digitalWrite(LEFT_MOTOR_PIN, LOW); digitalWrite(RIGHT_MOTOR_PIN, LOW); } else if (left_sensor < 500 && right_sensor > 500) { // 左边检测到线 digitalWrite(LEFT_MOTOR_PIN, HIGH); digitalWrite(RIGHT_MOTOR_PIN, LOW); } else if (left_sensor > 500 && right_sensor < 500) { // 右边检测到线 digitalWrite(LEFT_MOTOR_PIN, LOW); digitalWrite(RIGHT_MOTOR_PIN, HIGH); } else { // 左右都检测到线 digitalWrite(LEFT_MOTOR_PIN, HIGH); digitalWrite(RIGHT_MOTOR_PIN, HIGH); } } ``` 该程序通过巡线传感器检测小车当前位置信息,根据位置信息控制电机转速从而实现自动巡线。具体来说,当左边检测到线时,使左边电机转速快于右边电机,从而使小车向右偏转;当右边检测到线时则反之。当左右都检测到线时,使两个电机转速相同,从而使小车沿着巡线路径直行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ice Programmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值