大多数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();
	}

样例图

在这里插入图片描述

Logo

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

更多推荐