英伟达jetbot智能小车
一.数据采集
数据采集的时候,一定要不用的光线,不同的方向,不同的环境。
一般500-600张
二.AI训练
三.AI部署
import torch
import torchvision
3.1 加载预训练模型
'''第一步:载入模型'''
model = torchvision.models.alexnet(pretrained=False) # 构建alexnet模型
# 或取到模型的第7个线性层,然后创建一个线性层,输入特征与原来的一样的,输出特征数为2。替换掉原来的线性层
# 这个2,是让模型输出:有物体遮挡 无物体遮挡
model.classifier[6] = torch.nn.Linear(model.classifier[6].in_features,2)
# 导入已训练好的权重值
model.load_state_dict(torch.load('best_model.pth'))
# 把模型从cpu中传输到gpu中
device = torch.device('cuda')
model = model.to(device)
3.2 数据预处理
'''第二步:数据预处理。要把采集的数据格式转换为模型的输出格式:把摄像头的数据做归一化处理'''
import cv2
import numpy as np
mean = 255.0 * np.array([0.485,0.456,0.406]) # 得到数据对于某个数据在RGB上的均值,这三个数可能是imagenet的均值
stdev = 255.0 * np.array([0.229,0.224,0.225])
normalize = torchvision.transforms.Normalize(mean,stdev) # 对图片归一化
def preprocess(camera_value):
global device,normalize
x = camera_value
x = cv2.cvtColor(x,cv2.COLOR_BGR2RGB) # 把相机的BGR格式 转为 模型需要的RGB格式
x = x.transpose((2,0,1)) # 从 (高,宽,通道) 转换为 (通,高,宽)
x = torch.from_numpy(x).float()
x = normalize(x) # 数据归一化处理,变成0-1间的数据分布
x = x.to(device) # 将数据从cpu转到GPU
x = x[None] # 添加批次维度
return x
3.3 监控界面
3.4 绕过障碍物
让摄像头一直获取最新的图片
把最新的图片输入模型,让模型判断是否图中有障碍物?
如果有障碍物的概率<0.5 : 则直行
否则:左转
from jetbot import Robot
robot = Robot()
import torch.nn.functional as F
import time
def update(change):
global blocked_slider,robot
x = change['new']
x = preprocess(x) # 数据预处理
y = model(x)
y = F.softmax(y,dim=1) # 归一化,输出0-1范围,方便用于计算遮挡的概率
prob_blocked = float(y.flatten()[0])
blocked_slider.value = prob_blocked
if prob_blocked <0.5 # 阻挡概率小于50%,则直行
robot.forward(speed_slider.value)
else: # 否则原地左转
robot.left(speed_slider.value)
time.sleep(0.001) # 多长时间刷新一次
update({'new':camera.value}) # 调用一次函数来进行初始化
camera.observe(update,names='value') # 监听相机值的变化
3.5 释放资源
摄像头是内核管理资源,释放之后摄像头就不能用了。
资料链接
Jetson Nano 快速入门
https://zhuanlan.zhihu.com/p/62501901