文件组织
|
|
一个好的项目要从文件开始设计(虽然咱是蒟蒻,也要有成为牛犇的理想哇!)
core是主推理环节,同时实现了预处理,推理,后处理三部分,是核心部分utils是对解析出的数据进行下一步解析,比如画框,打标签等,后续也是可以拓展的
代码相关
这里不会展示所有代码,完整代码可以去仓库查看
预处理
在这个环节,我使用了tch库中封装好的函数。
但这个环节会对原图像进行拉伸,归一化,建议输入正方形图片
本来写了蒙灰色底版,但是
DynamicImage转Tensor没有解决,后续再说吧
整体代码类似,这里只展示一个:
|
|
YOLO的输入张量形状:[X,3,640,640],其中X是图片数量
模型引入&推理
由于libtorch的封装相当好,我们直接调用torchscript模型就可以
但是注意之前torch_cuda.dll的坑。
因为是自用的原因,我们直接调用在编写的时候,为了尽可能避免报错,允许在用户设置为Gpu时仍然调用Cpu,这点后续会删除,避免误导。
模型加载
|
|
YOLO导出的torchscript模型中是有元信息的,但是我没有在torch-rs中找到有关接口,因此:
二进制,启动!!!
这部分代码比较多,我不在这里展示,不过大概阐述一下原理,
我看了两个导出的模型,元信息是包在开始的九个0x5A和结尾的0x504B中,因此我们可以直接读入,然后进行解析
事实上,这个
torchscript文件是一个.zip的文件,因此你可以用zip进行解压,但是通过字节读取,我们可以得到更快的速度。只是我没有见识,因此在下一版,我会把后识别符修改成
0x504B2025/02/06T23:12在刷B站时发现的
模型推理反倒是最简单的了,因为接口一步到位,只要注意张量设备转移就好。
模型推理
|
|
后处理 之 core
这部分是将YOLO推理出的矩阵进行变换,得到一个格式化数据的过程。
这里的代码编写时,对Tensor切分的逻辑放在了mod.rs中,后续会进行修改。
YOLO本身的输出张量形状时这样的:[X,Y,8400],其中X是图片数量,Y是xywh+分类类型
为了得到好看的框,我们在下面引入两个参量:confidence和threshold
confidence控制物品可信度筛选threshold控制NMS筛选
我们就有以下逻辑;
- 通过
conf筛去置信度低的框 - 通过
threshold筛去重复的框
偷懒(✿◡‿◡),代码黏在下面了:
置信度筛选
|
|
NMS筛选
|
|
核心逻辑都是一些简单的循环,主要是协调各个API,使程序正常工作。
后处理 之 utils
这部分主要实现画框的逻辑
主要依赖于Rust的imageproc库
首先是将xywh转成合适的xyxy形式的坐标
|
|
之后是画框
|
|
最后是画字
|
|
至此,我们就用Rust实现了基本的yolo-detection封装。
最后修改于 2025-02-07