package cn.ck;
import ai.onnxruntime.OnnxTensor;
import ai.onnxruntime.OrtEnvironment;
import ai.onnxruntime.OrtException;
import ai.onnxruntime.OrtSession;
import cn.ck.config.ODConfig;
import cn.ck.domain.ODResult;
import cn.ck.utils.ImageUtil;
import cn.ck.utils.Letterbox;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
import java.nio.FloatBuffer;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 摄像头识别,告警判断示例
*/
public class CameraDetectionWarnDemo {
// 标准的对象去重或者判断是否为同一个对象避免重复告警应该使用目标跟踪,但是这里使用数量来简易判断,不是标准用法
static Map<String,Integer> last = new ConcurrentHashMap<>();
static Map<String,Integer> current = new ConcurrentHashMap<>();
static Map<String,Integer> count = new ConcurrentHashMap<>();
public static void main(String[] args) throws OrtException {
//System.load(ClassLoader.getSystemResource("lib/opencv_java470-无用.dll").getPath());
nu.pattern.OpenCV.loadLocally();
//linux和苹果系统需要注释这一行,如果仅打开摄像头预览,这一行没有用,可以删除,如果rtmp或者rtsp等等这一样有用,也可以用pom依赖代替
String OS = System.getProperty("os.name").toLowerCase();
if (OS.contains("win")) {
System.load(ClassLoader.getSystemResource("lib/opencv_videoio_ffmpeg470_64.dll").getPath());
}
String model_path = "src\\main\\resources\\model\\yolov7-tiny.onnx";
String[] labels = {
"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train",
"truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter",
"bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear",
"zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase",
"frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat",
"baseball glove", "skateboard", "surfboard", "tennis racket", "bottle",
"wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
"sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut",
"cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet",
"tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave",
"oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors",
"teddy bear", "hair drier", "toothbrush"};
// 加载ONNX模型
OrtEnvironment environment = OrtEnvironment.getEnvironment();
OrtSession.SessionOptions sessionOptions = new OrtSession.SessionOptions();
// 使用gpu,需要本机按钻过cuda,并修改pom.xml,不安装也能运行本程序
// sessionOptions.addCUDA(0);
// 实际项目中,视频识别必须开启GPU,并且要防止队列堆积
OrtSession session = environment.createSession(model_path, sessionOptions);
// 输出基本信息
session.getInputInfo().keySet().forEach(x -> {
try {
System.out.println("input name = " + x);
System.out.println(session.getInputInfo().get(x).getInfo().toString());
} catch (OrtException e) {
throw new RuntimeException(e);
}
});
// 加载标签及颜色
ODConfig odConfig = new ODConfig();
VideoCapture video = new VideoCapture();
// 也可以设置为rtmp或者rtsp视频流:video.open("rtmp://192.168.1.100/live/test"), 海康,大华,乐橙,宇视,录像机等等
// video.open("rtsp://192.168.1.100/live/test")
// 也可以静态视频文件:video.open("video/car3.mp4"); flv 等
// 不持支h265视频编码,如果无法播放或者程序卡住,请修改视频编码格式
video.open(0); //获取电脑上第0个摄像头
//video.open("images/car2.mp4"); //不开启gpu比较卡
//可以把识别后的视频在通过rtmp转发到其他流媒体服务器,就可以远程预览视频后视频,需要使用ffmpeg将连续图片合成flv 等等,很简单。
if (!video.isOpened()) {
System.err.println("打开视频流失败,未检测到监控,请先用vlc软件测试链接是否可以播放!,下面试用默认测试视频进行预览效果!");
video.open("video/car3.mp4");
}
// 在这里先定义下框的粗细、字的大小、字的类型、字的颜色(按比例设置大小粗细比较好一些)
int minDwDh = Math.min((int)video.get(Videoio.CAP_PROP_FRAME_WIDTH), (int)video.get(Videoio.CAP_PROP_FRAME_HEIGHT));
int thickness = minDwDh / ODConfig.lineThicknessRatio;
double fontSize = minDwDh / ODConfig.fontSizeRatio;
int fontFace = Imgproc.FONT_HERSHEY_SIMPLEX;
Mat img = new Mat();
// 跳帧检测,一般设置为3,毫秒内视频画面变化是不大的,快了无意义,反而浪费性能
int detect_skip = 4;
// 跳帧计数
int detect_skip_index = 1;
// 最新一帧也就是上一帧推理结果
float[][] outputData = null;
//当前最新一帧。上一帧也可以暂存一下
Mat image;
Letterbox letterbox = new Letterbox();
OnnxTensor tensor;
// 使用多线程和GPU可以提升帧率,一个线程拉流,一个线程模型推理,中间通过变量或者队列交换数据,代码示例仅仅使用单线程
while (video.read(img)) {
if ((detect_skip_index % detect_skip == 0) || outputData == null){
image = img.clone();
image = letterbox.letterbox(image);
Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2RGB);
image.convertTo(image, CvType.CV_32FC1, 1. / 255);
float[] whc = new float[3 * 640 * 640];
image.get(0, 0, whc);
float[] chw = ImageUtil.whc2cwh(whc);
detect_skip_index = 1;
FloatBuffer inputBuffer = FloatBuffer.wrap(chw);
tensor = OnnxTensor.createTensor(environment, inputBuffer, new long[]{1, 3, 640, 640});
HashMap<String, OnnxTensor> stringOnnxTensorHashMap = new HashMap<>();
stringOnnxTensorHashMap.put(session.getInputInfo().keySet().iterator().next(), tensor);
// 运行推理
// 模型推理本质是多维矩阵运算,而GPU是专门用于矩阵运算,占用率低,如果使用cpu也可以运行,可能占用率100%属于正常现象,不必纠结。
OrtSession.Result output = session.run(stringOnnxTensorHashMap);
// 得到结果,缓存结果
outputData = (float[][]) output.get(0).getValue();
}else{
detect_skip_index = detect_skip_index + 1;
}
current.clear();
for(float[] x : outputData){
ODResult odResult = new ODResult(x);
String boxName = labels[odResult.getClsId()];
// 业务逻辑写在这里,注释下面代码,增加自己的代码,根据返回识别到的目标类型,编写告警逻辑。等等
if(current.containsKey(boxName)){
current.put(boxName,current.get(boxName)+1);
}else{
current.put(boxName,1);
}
// 画框
Point topLeft = new Point((odResu
没有合适的资源?快使用搜索试试~ 我知道了~
java调用python yolo onnx模型AI视频识别 支持yolov5 yolov8 yolov7,包含预处理和后处理
共75个文件
png:31个
java:17个
jpg:6个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 89 浏览量
2024-07-06
09:36:00
上传
评论 1
收藏 282.06MB ZIP 举报
温馨提示
java调用python yolo onnx模型AI视频识别 支持yolov5 yolov8 yolov7,包含预处理和后处理。java目标检测目标识别,可集成rtsp rtmp
资源推荐
资源详情
资源评论
收起资源包目录
yolo-onnx-java-master.zip (75个子文件)
yolo-onnx-java-master
微信截图_20240628141905.png 360KB
pom.xml 2KB
src
main
resources
lib
opencv_videoio_ffmpeg470_64.dll 25.02MB
model
helmet_n_7.onnx 23.05MB
helmet_1_25200_n.onnx 23.03MB
yolov7-tiny.onnx 23.82MB
yolov8s.onnx 42.76MB
yolov9c.onnx 97.11MB
java
cn
ck
CameraDetectionWarnDemo.java 11KB
ObjectDetection_1_n_8400.java 10KB
ObjectDetection_1_25200_n.java 10KB
utils
9457f0e295d0a8a5c9fd0e28cdf7ea0.png 46KB
export.py 127B
Test2.java 4KB
ReadRtspFlow.ava 3KB
Letterbox.java 2KB
RTSPStreamer.ava 8KB
ImageUtil.java 4KB
Test1.java 4KB
CameraDetection.java 10KB
PoseEstimation.java 8KB
ObjectDetection_n_7.java 6KB
ObjectDetection_8_600.java 10KB
domain
Detection.java 1KB
PEResult.java 2KB
KeyPoint.java 760B
ODResult.java 2KB
config
PEConfig.java 3KB
ODConfig.java 2KB
LICENSE 11KB
demo
微信图片_20240303133238.jpg 230KB
20240510113015.png 236KB
20240510112726.png 285KB
微信截图_20240302145028.png 247KB
3.png 694KB
跳绳计数Y8NPOSE.mp4 13.52MB
微信截图_20240302144535.png 322KB
微信截图_20240302144556.png 142KB
image-20231221191740601.png 521KB
20240229172018.gif 8.53MB
微信截图_20240628141810.png 529KB
1.png 2.79MB
5.gif 18.29MB
640.gif 2.09MB
微信图片_20240303133256.jpg 212KB
下载.jpg 1.69MB
2.gif 19.33MB
6.png 369KB
image-20231129214334426.png 625KB
微信截图_20240302144728.png 192KB
4.png 516KB
8.png 155KB
20240516104943.png 585KB
20240516104918.png 210KB
20240302144451.png 268KB
7.png 320KB
微信截图_20240302144623.png 188KB
2.png 330KB
20240510113230.png 311KB
微信截图_20240628141552.png 208KB
.gitignore 395B
images
20230731102545.png 1.9MB
20230731211649.png 2.24MB
20230731211708.png 1.07MB
pose.jpg 210KB
hard_hat_workers33.png 151KB
bus.jpg 476KB
pose2.jpg 53KB
20230810214652.png 2.32MB
hard_hat_workers4603.png 270KB
10230731212230.png 3.79MB
video
test4.mp4 1.47MB
test.mp4 3.31MB
car3.mp4 6.9MB
test2.mp4 2.6MB
共 75 条
- 1
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 7361
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功