目标检测 YOLOv5 - 自定义的模型在使用C++推理时需要注意的问题
flyfish
关注的YOLOv5的Python代码部分
C++编写推理时需要关注的YOLOv5代码的是export.py和yolo.py
C++版本的YOLOv5推理已由nihui 在ncnn中完成,路径是ncnn/examples/yolov5.cpp,并且兼容YOLOv5:v6,还提供了移动端的使用demo。
1 注意生成新的anchor
3个stride,在原始配置yolov5s.yaml文件中分别是
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
推理时C++代码对应写
stride 8
ncnn::Mat anchors(6);
anchors[0] = 10.f;
anchors[1] = 13.f;
anchors[2] = 16.f;
anchors[3] = 30.f;
anchors[4] = 33.f;
anchors[5] = 23.f;
stride 16
ncnn::Mat anchors(6);
anchors[0] = 30.f;
anchors[1] = 61.f;
anchors[2] = 62.f;
anchors[3] = 45.f;
anchors[4] = 59.f;
anchors[5] = 119.f;
stride 32
ncnn::Mat anchors(6);
anchors[0] = 116.f;
anchors[1] = 90.f;
anchors[2] = 156.f;
anchors[3] = 198.f;
anchors[4] = 373.f;
anchors[5] = 326.f;
在使用自定义的数据集训练之后,anchor如果会有变化的,需要把在这里改anchor对应的数值。
可以看YOLOv5中anchor的设置,在训练时的开始阶段,在终端输出的内容中直接把anchor的数值拷贝出来填写到这里。
2. 目标的种类
static void draw_objects(const cv::Mat& bgr, const std::vector<Object>& objects)
{
static const char* class_names[] = {
"person", "bicycle", ...
};
...
}
这里改成自己要检测的物体
3. 可调整的参数
const int target_size = 640;
const float prob_threshold = 0.25f;
const float nms_threshold = 0.45f;
其他部分nihui已经写好,例如YoloV5Focus,代码写到了送佛都已经送到西天的完整。