#创作灵感#
最近在实习了,主要工作是进行计算机视觉的调优。同时负责在嵌入式平台的部署。公司拿出的方案是在RK3588上面部署,但是不用RKNN的方案,而是安卓平台!对于基本上不接触安卓平台的我来说还是挺有意思的。但是安卓的ncnn可以方便后续代码的通用,好吧…所以这一期就分享一下我在安卓平台部署yolov8+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的源代码和头文件。最后从头编译即可。以下为效果图。
平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_58365805/article/details/146897522