yolov3和yolov4检测效果对比
时间:2022-07-23
本文章向大家介绍yolov3和yolov4检测效果对比,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private const string YoloLibraryName = "yolo_cpp_dll.dll";
private const int MaxObjects = 1000;
object ThreadLock = new object();
[DllImport(YoloLibraryName, EntryPoint = "init")]
private static extern int InitializeYolo(string configurationFilename, string weightsFilename, int gpu);
[DllImport(YoloLibraryName, EntryPoint = "detect_image")]
private static extern int DetectImage(string filename, ref BboxContainer container);
[DllImport(YoloLibraryName, EntryPoint = "detect_mat")]
//private static extern int DetectImage(IntPtr pArray, int nSize, ref BboxContainer container);
private static extern int DetectImage(uint width, uint height, IntPtr pArray, int nSize, ref BboxContainer container);
[DllImport(YoloLibraryName, EntryPoint = "dispose")]
private static extern int DisposeYolo();
[StructLayout(LayoutKind.Sequential)]
public struct BboxContainer
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxObjects)]
public bbox_t[] candidates;
}
[StructLayout(LayoutKind.Sequential)]
public struct bbox_t
{
public UInt32 x, y, w, h; // (x,y) - top-left corner, (w, h) - width & height of bounded box
public float prob; // confidence - probability that the object was found correctly
public UInt32 obj_id; // class of object - from range [0, classes-1]
public UInt32 track_id; // tracking id for video (0 - untracked, 1 - inf - tracked object)
public UInt32 frames_counter;
float x_3d, y_3d, z_3d; // center of object (in Meters) if ZED 3D Camera is used 必须和yolo_cpp_dll.dll中的定义一一对应
};
public Form1()
{
InitializeComponent();
//CheckForIllegalCrossThreadCalls = false;
}
private void Form1_Load(object sender, EventArgs e)
{
//Task.Run(() => InitYolo());
InitYolo();
}
public static void InitYolo()
{
InitializeYolo(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "yolov3.cfg"),
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "yolov3.weights"),
0);
}
[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
public List<bbox_t> Detect(int Width, int Height, byte[] imageData)
{
var container = new BboxContainer();
var size = Marshal.SizeOf(imageData[0]) * imageData.Length;
var pnt = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(imageData, 0, pnt, imageData.Length);
var count = DetectImage((uint)Width, (uint)Height, pnt, imageData.Length, ref container);
if (count == -1)
{
throw new NotSupportedException(" has no OpenCV support");
}
List<bbox_t> result = new List<bbox_t>();
for (int i = 0; i < count; i++)
{
result.Add(container.candidates[i]);
}
return result;
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
return new List<bbox_t>();
}
finally
{
// Free the unmanaged memory.
Marshal.FreeHGlobal(pnt); //不释放内存会报错
}
}
private void button1_Click(object sender, EventArgs e)
{
string[] str = new string[10] { "Camera20200312154951725.jpg" , "Camera20200312155912410.jpg", "Camera20200312155923659.jpg",
"Camera20200312162258694.jpg","Camera20200313100654338.jpg","Camera20200313155526143.jpg",
"Camera20200313161231227.jpg","Camera20200319102951733.jpg","Camera20200319111317754.jpg",
"Camera20200320135659163.jpg"};
long timeCount = 0;
object locker = new object();
for (int i = 0; i < 10; i++)
{
//Image<Bgr, byte> img = new Image<Bgr, byte>(@"C:UsersadminsourcereposWindowsFormsApp1WindowsFormsApp1binx64DebugCamera20200421194241118.jpg");
Image<Bgr, byte> img1 = new Image<Bgr, byte>(@"C:UsersadminDesktop 512" + str[i]);
//Image<Gray, byte> img1 = new Image<Gray, byte>(@"C:UsersadminsourcereposWindowsFormsApp1WindowsFormsApp1binx64DebugDevice20200426191227506.jpg");
//Mat img2 = CvInvoke.Imread(@"C:UsersadminsourcereposWindowsFormsApp1WindowsFormsApp1binx64DebugCamera20200421194241118.jpg", Emgu.CV.CvEnum.LoadImageType.Grayscale);
int Width, Height;
Width = img1.Width;
Height = img1.Height;
while (Width % 4 != 0)
{
Width++;
}
CvInvoke.Resize(img1, img1, new Size(Width, Height), 0, 0, Inter.Lanczos4);
//Matrix<byte> showImage = new Matrix<byte>(img1.Height, img1.Width, 3);
//Matrix<byte> showImage = new Matrix<byte>(img1.Height, img1.Width, img1.Bytes[img1.Height* img1.Width*]);
//CvInvoke.CvtColor(img1, showImage, ColorConversion.Gray2Bgr);
List<bbox_t> bboxes = new List<bbox_t>();
lock (ThreadLock) //锁线程
{
Stopwatch sw = new Stopwatch();
sw.Start();
bboxes = Detect(img1.Height, img1.Width, img1.Bytes);
sw.Stop();
//MessageBox.Show(sw.ElapsedMilliseconds.ToString() + "毫秒");
timeCount += sw.ElapsedMilliseconds;
}
if (bboxes.ToArray().Length != 0)
{
//MessageBox.Show("1111");
}
foreach (var bbox in bboxes)
{
//detectobject newobj = new detectobject();
var color_red = new MCvScalar(0, 0, 255); // BGR
var color_green = new MCvScalar(0, 255, 0);
var color_yellow = new MCvScalar(0, 255, 255);
Rectangle rect = new Rectangle((int)bbox.x, (int)bbox.y, (int)bbox.w, (int)bbox.h);
if (bbox.obj_id == 0)
{
// IsWarning = true;
CvInvoke.Rectangle(img1, rect, color_yellow);
//string hiddenMsg = labels[(int)bbox.obj_id] + "," + bbox.prob.ToString("0.00");
//CvInvoke.PutText(showImage, hiddenMsg, rect.Location, FontFace.HersheyComplex, 0.8, color_red);
}
else if (bbox.obj_id == 1)
{
//IsWarning = true;
CvInvoke.Rectangle(img1, rect, color_green);
//string hiddenMsg = labels[(int)bbox.obj_id] + "," + bbox.prob.ToString("0.00");
//CvInvoke.PutText(showImage, hiddenMsg, rect.Location, FontFace.HersheyComplex, 0.8, color_green);
}
else
{
//IsWarning = true;
CvInvoke.Rectangle(img1, rect, color_red);
//string hiddenMsg = labels[(int)bbox.obj_id] + "," + bbox.prob.ToString("0.00");
//CvInvoke.PutText(showImage, hiddenMsg, rect.Location, FontFace.HersheyComplex, 0.8, color_green);
}
}
Task.Run(() =>
{
lock (locker)
{
Thread.Sleep(1000);
pictureBox1.Image = img1.Mat.Bitmap;
//this.BeginInvoke(new Action(() => { pictureBox1.Image = showImage.Mat.Bitmap; }));
}
});
}
label1.Text = (timeCount / 10).ToString() + "毫秒";
}
}
}
结果:
结论:
测试10张图片,计算平均耗时: yolo_cpp_dll.dll 自己编译生成的 yolov3 18ms 100% yolov3-tiny 5ms 检出率60% 比较节省gup资源 yolov4 35ms 检出率90%
yolo_cpp_dll_gpu.dll--旧版的dll,以前同事留下的 yolov3 19ms 70% yolov3-tiny 6ms 检出率40% yolov4 34ms 检出率0%
结论:dll对测试效果也有影响,yolov3-tiny检出速度快但是检出率不高,yolov4虽然做了优化,但是在耗时和检出率上反而下降了 ,原因不详!
- 揭秘深度强化学习
- Swoole-2.0.1-Alpha 已发布,提供PHP原生协程支持
- Google核心技术之——PageRank算法scala实现
- 代码审查拯救世界?
- Kafka实战:从RDBMS到Hadoop,七步实现实时传输
- Apache NiFi 1.0.0测试版:邮件路由应用新型ListenSMTP
- 为什么我坚持使用 JavaScript 函数声明
- NewSQL数据库大对象块存储原理与应用
- 使用xUnit为.net core程序进行单元测试(下2)
- MongoDB + Spark: 完整的大数据解决方案
- 如何实现自然语言处理的集束搜索解码器
- PostgreSQL 使用advisory lock或skip locked消除行锁冲突, 提高几十倍并发更新效率
- 流动的数据——使用 RxJS 构造复杂单页应用的数据逻辑
- 内存泄漏的检测、解决、防止
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ansible模块command、shell、raw、script
- systemd - CentOS 7进程守护&监控
- Java 8的新特性还不了解?快进来!
- 【Vulnhub】Play XML Entities
- 一切皆是映射:詳解 Kotlin Map 集合類
- 10大高性能开发宝石,我要消灭一半程序员!
- 面试官:你说你会RabbitMQ,那聊聊它的交换机(Exchange)吧
- Kubeadm 1.9 HA 高可用集群本地离线镜像部署【已验证】
- kubernetes(k8s)集群安装calico
- kubernetes(k8s) Prometheus+grafana监控告警安装部署
- 基于OpencvCV的情绪检测
- 设计模式 之 抽象工厂模式
- Angular应用里HTTP请求的错误处理
- 使用npm安装TypeScript
- TypeScript的interface关键字