现在以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: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant11: stop sign12: parking meter13: bench14: bird15: cat16: dog17: horse18: sheep19: cow20: elephant21: bear22: zebra23: giraffe24: backpack25: umbrella26: handbag27: tie28: suitcase29: frisbee30: skis31: snowboard32: sports ball33: kite34: baseball bat35: baseball glove36: skateboard37: surfboard38: tennis racket39: bottle40: wine glass41: cup42: fork43: knife44: spoon45: bowl46: banana47: apple48: sandwich49: orange50: broccoli51: carrot52: hot dog53: pizza54: donut55: cake56: chair57: couch58: potted plant59: bed60: dining table61: toilet62: tv63: laptop64: mouse65: remote66: keyboard67: cell phone68: microwave69: oven70: toaster71: sink72: refrigerator73: book74: clock75: vase76: scissors77: teddy bear78: hair drier79: 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) # contiguousim = torch.from_numpy(im)im = im.to(self.device)im = im.half() if self.model.fp16 else im.float() # uint8 to fp16/32if not_tensor:im /= 255 # 0 - 255 to 0.0 - 1.0return imdef 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}) == 1letterbox = 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 listorig_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 onnxinput_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板端推理部署
未完待续。。。