要使用K230 AI Demo中的object_detect_yolov8n模型并替换为您自己的数据集和训练模型,请按以下步骤操作:
1. 准备工作
① 获取源码
从嘉楠官方仓库克隆代码:
git clone https://github.com/kendryte/k230_sdk.git
cd k230_sdk/src/ai_demo/object_detect_yolov8n
② 环境配置
确保已安装:
- K230 SDK(包含交叉编译工具链)
- Python 3.8+
- PyTorch >=1.8, ONNX
- 模型转换工具
ncc(K230的NN编译器)
2. 训练自定义模型
① 数据集准备
使用YOLOv8格式的数据集:
custom_dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
② 训练模型
用Ultralytics YOLOv8训练:
from ultralytics import YOLO
model = YOLO("yolov8n.pt") # 加载预训练模型
results = model.train(
data="custom_dataset.yaml", # 数据集配置文件
epochs=100,
imgsz=640,
batch=16
)
3. 模型转换
① 导出ONNX格式
model.export(format="onnx") # 生成yolov8n_custom.onnx
② 转为K230格式(.kmodel)
使用ncc工具转换:
ncc compile yolov8n_custom.onnx yolov8n_custom.kmodel
--input-layout NHWC
--output-layout NCHW
--input-shape "1 3 640 640"
--dataset quant_images/ # 量化校准图像
4. 修改K230源码
① 替换模型文件
将生成的yolov8n_custom.kmodel复制到K230板子的/root目录
② 修改C++代码
- 模型加载路径(
main.cc):
std::string model_path = "/root/yolov8n_custom.kmodel"; // 改为新模型路径
- 调整后处理参数(
postprocess.cc):
int num_classes = 10; // 修改为您的类别数
float conf_threshold = 0.3; // 置信度阈值
float nms_threshold = 0.5; // NMS阈值
- 更新类别标签(
labels.cc):
std::vector class_names = {"cat", "dog", ...}; // 您的类别
③ 输入图像尺寸
在预处理中匹配模型输入尺寸(如640x640):
cv::resize(img, resized_img, cv::Size(640, 640)); // 在preprocess.cc中
5. 编译与部署
① 交叉编译
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/k230_toolchain.cmake ..
make -j4
② 推送到K230
scp object_detect root@192.168.x.x:/root/
ssh root@192.168.x.x
③ 运行
cd /root
./object_detect yolov8n_custom.kmodel test.jpg # 测试图像
6. 关键注意事项
模型兼容性
- 确保输入尺寸(如640x640)与训练一致
- 使用
ncc量化时需提供约100张校准图片
后处理适配
- 如果自定义模型改动结构(如检测头),需重写
postprocess.cc中的解码逻辑
性能优化
数据精度
- FP32模型转为INT8时在量化校准阶段需覆盖全部场景数据
调试技巧
日志输出
在代码中添加Tensor信息打印:
auto* data = interpreter->input_tensor(0)->data();
printf("Input tensor shape: %d x %d x %dn", height, width, channel);
PC端仿真
使用ncc的模拟器验证输出:
ncc run yolov8n_custom.kmodel input.bin --simulate
性能分析
添加时间戳计算推理耗时:
auto start = std::chrono::high_resolution_clock::now();
// 推理代码
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Inference time: "
<< std::chrono::duration_cast(end-start).count()
<< "ms" << std::endl;
完成以上步骤后,您的自定义YOLOv8模型即可在K230上运行。遇到问题时可优先检查:
- 模型转换是否成功(使用ncc version验证兼容性)
- 输入/输出张量维度是否匹配
- 后处理代码中的锚点/步长参数与模型对齐
官方资源参考:
要使用K230 AI Demo中的object_detect_yolov8n模型并替换为您自己的数据集和训练模型,请按以下步骤操作:
1. 准备工作
① 获取源码
从嘉楠官方仓库克隆代码:
git clone https://github.com/kendryte/k230_sdk.git
cd k230_sdk/src/ai_demo/object_detect_yolov8n
② 环境配置
确保已安装:
- K230 SDK(包含交叉编译工具链)
- Python 3.8+
- PyTorch >=1.8, ONNX
- 模型转换工具
ncc(K230的NN编译器)
2. 训练自定义模型
① 数据集准备
使用YOLOv8格式的数据集:
custom_dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
② 训练模型
用Ultralytics YOLOv8训练:
from ultralytics import YOLO
model = YOLO("yolov8n.pt") # 加载预训练模型
results = model.train(
data="custom_dataset.yaml", # 数据集配置文件
epochs=100,
imgsz=640,
batch=16
)
3. 模型转换
① 导出ONNX格式
model.export(format="onnx") # 生成yolov8n_custom.onnx
② 转为K230格式(.kmodel)
使用ncc工具转换:
ncc compile yolov8n_custom.onnx yolov8n_custom.kmodel
--input-layout NHWC
--output-layout NCHW
--input-shape "1 3 640 640"
--dataset quant_images/ # 量化校准图像
4. 修改K230源码
① 替换模型文件
将生成的yolov8n_custom.kmodel复制到K230板子的/root目录
② 修改C++代码
- 模型加载路径(
main.cc):
std::string model_path = "/root/yolov8n_custom.kmodel"; // 改为新模型路径
- 调整后处理参数(
postprocess.cc):
int num_classes = 10; // 修改为您的类别数
float conf_threshold = 0.3; // 置信度阈值
float nms_threshold = 0.5; // NMS阈值
- 更新类别标签(
labels.cc):
std::vector class_names = {"cat", "dog", ...}; // 您的类别
③ 输入图像尺寸
在预处理中匹配模型输入尺寸(如640x640):
cv::resize(img, resized_img, cv::Size(640, 640)); // 在preprocess.cc中
5. 编译与部署
① 交叉编译
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/k230_toolchain.cmake ..
make -j4
② 推送到K230
scp object_detect root@192.168.x.x:/root/
ssh root@192.168.x.x
③ 运行
cd /root
./object_detect yolov8n_custom.kmodel test.jpg # 测试图像
6. 关键注意事项
模型兼容性
- 确保输入尺寸(如640x640)与训练一致
- 使用
ncc量化时需提供约100张校准图片
后处理适配
- 如果自定义模型改动结构(如检测头),需重写
postprocess.cc中的解码逻辑
性能优化
数据精度
- FP32模型转为INT8时在量化校准阶段需覆盖全部场景数据
调试技巧
日志输出
在代码中添加Tensor信息打印:
auto* data = interpreter->input_tensor(0)->data();
printf("Input tensor shape: %d x %d x %dn", height, width, channel);
PC端仿真
使用ncc的模拟器验证输出:
ncc run yolov8n_custom.kmodel input.bin --simulate
性能分析
添加时间戳计算推理耗时:
auto start = std::chrono::high_resolution_clock::now();
// 推理代码
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Inference time: "
<< std::chrono::duration_cast(end-start).count()
<< "ms" << std::endl;
完成以上步骤后,您的自定义YOLOv8模型即可在K230上运行。遇到问题时可优先检查:
- 模型转换是否成功(使用ncc version验证兼容性)
- 输入/输出张量维度是否匹配
- 后处理代码中的锚点/步长参数与模型对齐
官方资源参考:
举报