现在以YOLOV8 为例,进行演示
文章目录
- 1. YOLOV8浮点模型训练
- 1.1 准备数据集
- 1.1.1 下载业务数据集
- 1.1.2 下载开源数据集
- 1.1.3 自定义数据集
- 1.1.4 将数据转换为yolo训练数据格式
- 1.2 yolov8项目准备
- 1.3 训练模型
- 2. YOLOV8浮点模型推理
- 2.1 模型推理
- 2.2 模型val.py评估精度mAp
- 2.3 pt模型转换成onnx
- 2.4 图像前处理
- 2.5 模型推理后处理
- 3. YOLOV8模型部署资源开发
- 3.1 资源准备
- 3.1.1 模型的裁剪
- 3.1.2 准备量化数据集
- 3.1.2.1 使用自定义数据集
- 3.1.2.2 使用coco128开源数据集
- 3.1.3 准备推理函数
- 3.1.4 编写config配置文件
- 3.2 量化编译
- 3.2.1 执行量化命令
- 3.2.2 浮点模型单张图像推理
- 3.2.3 量化后单张图像推理
- 3.2.4 编译得到模型部署资源
- 3.3 仿真运行
- 3.3.1 仿真单张图片
- 3.3.2 Profiling工具评估模型性能
- 4. YOLOV8应用程序开发及部署
- 5. YOLOV8板端推理部署
1. YOLOV8浮点模型训练
1.1 准备数据集
以下几种数据集获取方式,选择一个符合需求的即可。
1.1.1 下载业务数据集
1)以安全帽检测应用场景为例,下载地址
数据格式示例如下
--HelmetDetection
--annotations
--hard_hat_workers0.xml
--hard_hat_workers1.xml
--hard_hat_workers2.xml
--... ...
--images
--hard_hat_workers0.png
--hard_hat_workers1.png
--hard_hat_workers2.png
--... ...
每张图片对应一个标注的xml文件。
2)将数据格式转换为yolo txt训练数据格式
1.1.2 下载开源数据集
可下载imageNet数据集
1.1.3 自定义数据集
1)准备图片
建议不少于200张
2)使用LableImg标注工具
对目标进行标注
标注结果保存为VOC格式, 同1.1.1格式相同。
1.1.4 将数据转换为yolo训练数据格式
1)将VOC 数据格式转换为yolo txt数据格式
参考链接
python step1_voc_to_yolo.py --voc-dir data/HelmetDetection/annotations --save data/HelmetDetection/yolo
2)划分数据集
参考链接
python step2_cut_data.py
3)新增yaml配置文件
最终数据格式,参考coco128, 示例如下
path: /tmp/coco128 # dataset_val10_org root dir
train: /tmp/coco128/images/train2017 # train images (relative to 'path') 128 images
val: /tmp/coco128/images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes
names:
0: person
1: bicycle
2: car
3: motorcycle
4: airplane
5: bus
6: train
7: truck
8: boat
9: traffic light
10: fire hydrant
11: stop sign
12: parking meter
13: bench
14: bird
15: cat
16: dog
17: horse
18: sheep
19: cow
20: elephant
21: bear
22: zebra
23: giraffe
24: backpack
25: umbrella
26: handbag
27: tie
28: suitcase
29: frisbee
30: skis
31: snowboard
32: sports ball
33: kite
34: baseball bat
35: baseball glove
36: skateboard
37: surfboard
38: tennis racket
39: bottle
40: wine glass
41: cup
42: fork
43: knife
44: spoon
45: bowl
46: banana
47: apple
48: sandwich
49: orange
50: broccoli
51: carrot
52: hot dog
53: pizza
54: donut
55: cake
56: chair
57: couch
58: potted plant
59: bed
60: dining table
61: toilet
62: tv
63: laptop
64: mouse
65: remote
66: keyboard
67: cell phone
68: microwave
69: oven
70: toaster
71: sink
72: refrigerator
73: book
74: clock
75: vase
76: scissors
77: teddy bear
78: hair drier
79: toothbrush
# Download script/URL (optional)
download: https://ultralytics.com/assets/coco128.zip
1.2 yolov8项目准备
1)安装方式,或者采用方式2)
# Install the ultralytics package from PyPI
pip install ultralytics
2)下载yolov8 源码
下载地址
3)下载yolov8 模型
下载地址
1.3 训练模型
不同训练方式参考
1)准备配置文件
yolo copy-cfg
执行命令后会自动生成一个 default_copy.yaml ,修改相关的内容即可
model: yolov8s.pt # path to model file, i.e. yolov8n.pt, yolov8n.yaml
data: data/config.yaml # path to data file, i.e. coco128.yaml
2)启动模型训练
yolo cfg=default_copy.yaml
训练完成,页面会输出保存的训练模型路径。
2. YOLOV8浮点模型推理
2.1 模型推理
from ultralytics import YOLO
# ---------- 加载模型 ----------
model = YOLO('runs/detect/train19/weights/best.pt')
# ---------- 模型评估 ----------
model.predict(
source='data/HelmetDetection/doneData/val/images/hard_hat_workers1000.png',
save=True
)
单张模型推理,自定义代码 参考代码
默认参数值
conf_thres = 0.25
iou_thres = 0.7
2.2 模型val.py评估精度mAp
from ultralytics import YOLO
# ---------- 加载模型 ----------
model = YOLO('runs/detect/train19/weights/best.pt')
# ---------- 模型评估 ----------
model.val(data="data/HelmetDetection/config.yaml")
2.3 pt模型转换成onnx
yolo export model=runs/detect/train19/weights/best.pt format=onnx opset=14
2.4 图像前处理
# ultralytics/engine/predictor.py
def preprocess(self, im):
"""
Prepares input image before inference.
Args:
im (torch.Tensor | List(np.ndarray)): BCHW for tensor, [(HWC) x B] for list.
"""
not_tensor = not isinstance(im, torch.Tensor)
if not_tensor:
im = np.stack(self.pre_transform(im))
im = im[..., ::-1].transpose((0, 3, 1, 2)) # BGR to RGB, BHWC to BCHW, (n, 3, h, w)
im = np.ascontiguousarray(im) # contiguous
im = torch.from_numpy(im)
im = im.to(self.device)
im = im.half() if self.model.fp16 else im.float() # uint8 to fp16/32
if not_tensor:
im /= 255 # 0 - 255 to 0.0 - 1.0
return im
def pre_transform(self, im):
"""
Pre-transform input image before inference.
Args:
im (List(np.ndarray)): (N, 3, h, w) for tensor, [(h, w, 3) x N] for list.
Returns:
(list): A list of transformed images.
"""
same_shapes = len({x.shape for x in im}) == 1
letterbox = LetterBox(self.imgsz, auto=same_shapes and self.model.pt, stride=self.model.stride)
return [letterbox(image=x) for x in im]
它包含以下步骤:
- self.pre_transform:即 letterbox 添加灰条
- im[…,::-1]:BGR → RGB
- transpose((0, 3, 1, 2)):添加 batch 维度,HWC → CHW
- torch.from_numpy:to Tensor
- im /= 255:除以 255,归一化
2.5 模型推理后处理
#ultralytics/models/yolo/detect/predict.py
def postprocess(self, preds, img, orig_imgs):
"""Post-processes predictions and returns a list of Results objects."""
preds = ops.non_max_suppression(
preds,
self.args.conf,
self.args.iou,
agnostic=self.args.agnostic_nms,
max_det=self.args.max_det,
classes=self.args.classes,
)
if not isinstance(orig_imgs, list): # input images are a torch.Tensor, not a list
orig_imgs = ops.convert_torch2numpy_batch(orig_imgs)
results = []
for i, pred in enumerate(preds):
orig_img = orig_imgs[i]
pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape)
img_path = self.batch[0][i]
results.append(Results(orig_img, path=img_path, names=self.model.names, boxes=pred))
return results
后处理部分一共有两个部分,分别为 nms 处理 和 坐标绘图 处理这两步。
3. YOLOV8模型部署资源开发
3.1 资源准备
3.1.1 模型的裁剪
若在量化工具中进行裁剪,此步骤可跳过,参见3.4
import onnx
input_path = "yolov8.onnx"
output_path = "yolov8_sub.onnx"
input_names = ["images"]
output_names = ["/model.22/dfl/Reshape_1_output_0","/model.22/Sigmoid_output_0"]
onnx.utils.extract_model(input_path, output_path, input_names, output_names)
3.1.2 准备量化数据集
3.1.2.1 使用自定义数据集
使用验证数据集中选取100~200张图片,进行量化。
3.1.2.2 使用coco128开源数据集
COCO数据集是一个可用于图像检测(image detection),语义分割(semantic segmentation)和图像标题生成(image captioning)的大规模数据集。这里需要下载coco128数据集。下载请前往COCO官网。
数据集(COCO):https://cocodataset.org/
3.1.3 准备推理函数
git clone https://github.com/tsingmicro-toolchain/ts.knight-modelzoo.git
组织文件结构如下所示
修改src/yolov8s.py代码
3.1.4 编写config配置文件
{
"chip": "TX5336AV200",
"quant": {
"model": "yolov8s.onnx",
"framework": "onnx",
"user-defined-script": "src/yolov8.py",
"infer-func": "yolov8s",
"save-dir": "/tmp/quant_output",
"data": "coco128.yaml",
"batch-size": "1",
"iteration": 128,
"output-name": "/model.22/dfl/Reshape_1_output_0 /model.22/Sigmoid_output_0"
},
"rne-compile": {
"onnx": "/tmp/quant_output/yolov8s_quantize.onnx",
"outpath": "/tmp/npu"
},
"rne-sim": {
"input": "model_input.bin",
"weight": "/tmp/npu/yolov8s_quantize_r.weight",
"config": "/tmp/npu/yolov8s_quantize_r.cfg",
"outpath": "/tmp/npu"
},
"rne-profiling": {
"config": "/tmp/npu/yolov8s_quantize_r.cfg",
"outpath": "/tmp/npu"
}
}
3.2 量化编译
3.2.1 执行量化命令
准备镜像 启动容器
docker load -i ts.knight-2.2.0.8.tar.gz
docker run -v ${localhost_dir}/ts.knight-modelzoo/pytorch/builtin/cv/detection/yolov8s:/tmp -it ts.knight:2.2.0.8 /bin/bash
容器中执行量化命令
cd /tmp
Knight quant -rc yolov8s_config.json -od
3.2.2 浮点模型单张图像推理
Knight quant -rc yolov8s_config.json -m /tmp/yolov8s_output/steps/yolov8s_sub.onnx --iteration 1 --run-mode infer
3.2.3 量化后单张图像推理
Knight quant -rc yolov8s_config.json -m /tmp/yolov8s_output_22/yolov8s_quantize.onnx --iteration 2 --run-mode infer
3.2.4 编译得到模型部署资源
Knight rne-compile -rc yolov8s_config.json
3.3 仿真运行
3.3.1 仿真单张图片
仅对目录中的第一张图片进行 预处理转换
python3 src/make_image_input_onnx.py --input /tmp/coco128/images/train2017 --outpath .
Knight rne-sim -rc yolov8s_config.json
3.3.2 Profiling工具评估模型性能
Knight rne-profiling -rc yolov8s_config.json
4. YOLOV8应用程序开发及部署
未完待续。。。
5. YOLOV8板端推理部署
未完待续。。。