文件组织
|
|
一个好的项目要从文件开始设计(虽然咱是蒟蒻,也要有成为牛犇的理想哇!)
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
进行解压,但是通过字节读取,我们可以得到更快的速度。只是我没有见识,因此在下一版,我会把后识别符修改成
0x504B
2025/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