java基于Omega-ai实现的车辆目标追踪识别及流量统计yolo-car-tracker-4j
摘要:Omega-ai是一个为Java开发者打造的AI框架,旨在成为Java版的PyTorch。基于该框架开发的yolo-car-tracker-4j项目实现了车辆目标追踪及流量统计功能,采用YOLO+DeepSORT+Kalman算法组合,基于4万张图片训练模型。项目使用JavaCV处理视频流,CUDA加速计算,并包含GUI界面。核心代码展示了视频解码、YOLO检测和SORT跟踪的实现过程,最终
·
大多数ai都是基于pytorch开发,为了方便java程序员接触AI,有个大佬创建了Omega-ai项目,这是个java的ai框架,目前已经支持多种市面上的主流模型,包括最近流行的大模型,目标成为java上的“pytorch”,我在这写了个基于Omega-ai实现的车辆目标追踪识别及流量统计yolo-car-tracker-4j,模型已上传,基于四万多张图的开源数据集训练的。
技术栈
- 视频解码 javacv
- AI框架 Omega-ai
- GPU计算 cuda
- 算法 yolo deepsort kalman 匈牙利
- GUI JFrame
- UI flatlaf(Idea主题)
- 打包 maven-easypackage-plugin
代码片段
private void run(File videoFile) throws Exception {
running = true;
if (null == tracker) {
tracker = new SORTTracker();
}
FFmpegFrameGrabber grabber = null;
grabber = new FFmpegFrameGrabber(videoFile);
grabber.setFrameRate(15);
grabber.start();
Frame frame = null;
Frame grabImage = grabber.grabImage();
if (null == grabber || null == grabImage) {
throw new RuntimeException("视频解码失败");
}
// 初始化
BufferedImage firstFrame = createBufferedImage(grabImage);
initYoloNet(firstFrame);
while (running) {
// 由于是本地视频,并且需要看视频,按照帧率处理
frame = grabber.grabAtFrameRate();
if (null == frame) {
break;
}
if (frame.type != Frame.Type.VIDEO || null == frame.image) {
frame.close();
continue;
}
BufferedImage bufferedImage = createBufferedImage(frame);
List<Detection> detections = runYOLODetection(bufferedImage);
List<Track> activeTracks = tracker.update(detections);
BufferedImage newBufferedImage = ImageTools.letterbox(bufferedImage, input.width, input.height);
int sec = (int) (grabber.getTimestamp() / 1000f / 1000f);
String formatTime = formatTime(sec);
Set<Integer> set = new HashSet<>();
for (Track track : activeTracks) {
set.add(track.trackId);
}
for (Track track : activeTracks) {
ImageTools.drawRect(newBufferedImage, track.bbox.x, track.bbox.y, track.bbox.width, track.bbox.height,
Color.RED);
ImageTools.drawText(newBufferedImage, track.trackId + "_" + track.label, track.bbox.x, track.bbox.y - 4,
Color.RED);
}
ImageTools.drawText(newBufferedImage, "时间" + formatTime, 20, 20, Color.WHITE);
// 由于帧率设置为15,SORTTracker maxAge也为15,这里是初步估计的结果
ImageTools.drawText(newBufferedImage, "每秒" + set.size() + "辆", 150, 20, Color.WHITE);
showFrame(newBufferedImage);
}
grabber.close();
}
样例图

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)