基于安卓平台的Yolov8+Bytetrack,实现多目标跟踪。

#创作灵感#

最近在实习了,主要工作是进行计算机视觉的调优。同时负责在嵌入式平台的部署。公司拿出的方案是在RK3588上面部署,但是不用RKNN的方案,而是安卓平台!对于基本上不接触安卓平台的我来说还是挺有意思的。但是安卓的ncnn可以方便后续代码的通用,好吧...所以这一期就分享一下我在安卓平台部署yolov8+bytetrack进行多目标跟踪的过程吧。。。

目录

 1、模型的训练

2、模型的导出

3、安卓端部署

4、bytetrack的移植

 1、模型的训练

为了适配飞鸽传书大佬GitHub - FeiGeChuanShu/ncnn-android-yolov8: Real time yolov8 Android demo by ncnnhttps://bgithub.xyz/FeiGeChuanShu/ncnn-android-yolov8的工程,Ultralytics版本是有要求的。我选择的版本是8.0.197。这里说不清的东西太多了,ncnn在使用时其实很方便,但是部署的配套性感觉不是很好。Ultralytics版本不对,你进行模型转换后结构就不对,导致程序闪退。或者乱框等等。。。

然后训练之类的都一样,重点是版本的选择。

2、模型的导出

1、导出onnx。模型导出就挺方便的,但是很容易出错。由于c2f模块在ncnn端推理性能的影响,作者对这一块进行了优化。并且在检测头方面也进行了相应的优化。具体参考GitHub,这一块按照提供的来就行。应对这一块我是推荐单独创建一个环境,然后将环境Ultralytics里的c2f和Detect模块进行更改,然后用这一虚拟环境导出。这样出错率会大大降低。这个可以参考这位博主的在Android端本地部署yolov8_yolo android-CSDN博客。也可以在工程里更改,但是训练时记得改回来。要不然无法训练。

2、导出ncnn,这个就可以用现成的工具,具体的自己可以找一找(找不到的可以私聊找我获取)。这个也就是为什么比rknn那一套方便的原因。不需要你安装linux环境然后转换。

3、安卓端部署

具体的环境搭建可以参考上面提到的博客,或者其他的。这个方面我不是很熟悉,毕竟我是搞嵌入式linux端的,我也是叫搞java的同事配好的。

把工程导入到android studio,然后就可以简单的跑目标检测了。

4、bytetrack的移植

参考代码源地址为:yaoyi30/ByteTrack_ncnn_Android: This is an android app about pedestrian identification and tracking, use ByteTrackhttps://github.com/yaoyi30/ByteTrack_ncnn_Android首先bytetrack需要依赖eigen这个包。下载源码,地址为:https://drive.google.com/file/d/1rqO74CYCNrmRAg8Rra0JP3yZtJ-rfket/view or 百度网盘:百度网盘 请输入提取码 (code:ueq4)。参照提供的github,把eigen-3.3.9放入jni里面就行。然后在原来安卓目标检测app/src/main/jni/yolo.cpp里画框的位置进行代码修改,改为bytetrack逻辑就行了。

int Yolox::draw(cv::Mat& rgb, const std::vector<Object>& objects)
{

    vector<STrack> output_stracks = tracker.update(objects);
    for (int i = 0; i < output_stracks.size(); i++)
    {
        vector<float> tlwh = output_stracks[i].tlwh;
        bool vertical = tlwh[2] / tlwh[3] > 1.6;
        if (tlwh[2] * tlwh[3] > 20 && !vertical)
        {
            Scalar s = tracker.get_color(output_stracks[i].track_id);
            putText(rgb, format("%d", output_stracks[i].track_id), Point(tlwh[0], tlwh[1] - 5),
                    0, 0.5, Scalar(255, 0, 0), 2, LINE_AA);
            rectangle(rgb, Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), s, 2);
        }
    }

    return 0;
}

然后cmakelist记得改,加入eigen的头文件和源代码。INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/eigen-3.3.9),

然后在jni里面加入bytetrack的源代码和头文件。最后从头编译即可。以下为效果图。

### YOLOv8NCNN模型识别使用教程 #### 准备工作 为了能够顺利部署YOLOv8并利用NCNN进行模型识别,需先准备好必要的开发环境以及工具链。这包括但不限于安装Python、PyTorch等依赖项用于训练或下载预训练好的YOLOv8模型文件;同时也要准备支持NCNN框架运行的C++编译器及其配套库。 #### 模型转换 由于YOLOv8官方并不直接提供针对NCNN优化后的权重文件,因此需要手动完成从原始格式到`.param`和`.bin`这两种特定于NCNN结构的数据形式之间的转变过程[^1]。具体操作可以通过调用由社区贡献者维护的相关脚本实现自动化处理: ```bash python export.py --weights yolov8.pt --include ncnn ``` 上述命令会读取指定路径下的YOLOv8 PyTorch模型(`yolov8.pt`),并通过内部逻辑将其转化为适配于NCNN执行层面上所需的参数描述文档(即`.param`)和平铺二进制数组表示法(也就是`.bin`)。值得注意的是,在某些情况下可能还需要额外调整网络架构定义以确保最佳性能表现。 #### 库集成与接口设计 一旦拥有了经过适当转化之后的目标检测算法核心组件———即已经成功导出了适用于移动设备或其他嵌入式平台上的轻量化版本YOLOv8-ncnn,则可以着手构建围绕该功能展开的应用程序了。这里涉及到的主要技术要点有:如何高效加载预先计算完毕的结果集以便快速响应用户请求?怎样合理规划内存布局从而减少不必要的资源消耗? 对于这些问题的回答可以在已有案例研究中找到灵感源泉。例如,在一篇关于YOLOv5结合NCNN应用于Android端的文章里提到过一种解决方案思路,其中不仅包含了详细的C++代码片段来展示具体的API函数签名及其实现细节,还给出了有关CMakelists.txt配置方面的指导建议,使得开发者可以根据实际需求灵活定制项目属性设置[^2]。 #### 推理流程概述 当一切准备工作都已完成以后,就可以正式进入图像分析环节啦!下面给出了一段简单的伪代码用来说明整个推断过程中所经历的关键步骤: ```cpp // 初始化Net对象实例化 net.load_param("yolov8.param"); net.load_model("yolov8.bin"); Mat img = imread(image_path); // 加载待测图片至OpenCV矩阵容器内 resize(img, resized_img, Size(input_width, input_height)); // 调整尺寸匹配输入规格要求 Blob blob_from_image(resized_img); net.setInput(blob_from_image); vector<Mat> outputs; net.forward(outputs); for (auto& output : outputs){ // 解析预测框坐标位置信息... } ``` 这段示例展示了从创建神经网络实体直至获取最终分类得分之间完整的流水线作业模式。当然,根据应用场景的不同,这部分内容还可以进一步扩展延伸,比如加入数据增强机制提高泛化能力或是引入多尺度测试策略提升定位精度等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值