mmdeploy/demo/csharp/image_classification/FormDemo.cs

205 lines
6.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MMDeploy;
using OpenCvSharp.Extensions;
using ImreadModes = OpenCvSharp.ImreadModes;
using Cv2 = OpenCvSharp.Cv2;
using CvMat = OpenCvSharp.Mat;
#pragma warning disable IDE1006
#pragma warning disable IDE0044
namespace image_classification
{
public partial class FormDemo : Form
{
Classifier classifier;
string modelPath = "";
string device = "cuda";
int deviceId = 0;
string imgPath = "";
#region auto resize
private float x;
private float y;
private void setTag(Control cons)
{
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size;
if (con.Controls.Count > 0)
{
setTag(con);
}
}
}
private void setControls(float newx, float newy, Control cons)
{
foreach (Control con in cons.Controls)
{
if (con.Tag != null)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ';' });
con.Width = Convert.ToInt32(System.Convert.ToSingle(mytag[0]) * newx);
con.Height = Convert.ToInt32(System.Convert.ToSingle(mytag[1]) * newy);
con.Left = Convert.ToInt32(System.Convert.ToSingle(mytag[2]) * newx);
con.Top = Convert.ToInt32(System.Convert.ToSingle(mytag[3]) * newy);
Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setControls(newx, newy, con);
}
}
}
}
private void FormDemo_Resize(object sender, EventArgs e)
{
float newx = (this.Width) / x;
float newy = (this.Height) / y;
setControls(newx, newy, this);
}
#endregion
static void CvMatToMat(CvMat[] cvMats, out Mat[] mats)
{
mats = new Mat[cvMats.Length];
unsafe
{
for (int i = 0; i < cvMats.Length; i++)
{
mats[i].Data = cvMats[i].DataPointer;
mats[i].Height = cvMats[i].Height;
mats[i].Width = cvMats[i].Width;
mats[i].Channel = cvMats[i].Dims;
mats[i].Format = PixelFormat.BGR;
mats[i].Type = DataType.Int8;
}
}
}
public FormDemo()
{
InitializeComponent();
x = this.Width;
y = this.Height;
setTag(this);
}
private void radioButtonDeviceCpu_CheckedChanged(object sender, EventArgs e)
{
device = "cpu";
}
private void radioButtonDeviceCuda_CheckedChanged(object sender, EventArgs e)
{
device = "cuda";
}
private void buttonSelectModelPath_Click(object sender, EventArgs e)
{
FolderBrowserDialog dilog = new FolderBrowserDialog();
if (dilog.ShowDialog() == DialogResult.OK)
{
textBoxModelPath.Text = dilog.SelectedPath;
}
}
private void buttonInitModel_Click(object sender, EventArgs e)
{
if (classifier != null)
{
classifier.Close();
}
classifier = null;
textBoxStatus.Text = "init model ...";
try
{
modelPath = textBoxModelPath.Text;
classifier = new Classifier(modelPath, device, deviceId);
textBoxStatus.ForeColor = Color.Green;
textBoxStatus.Text = "init model success.";
} catch
{
textBoxStatus.ForeColor = Color.Red;
textBoxStatus.Text = "init model failed.";
}
}
private void buttonLoadImage_Click(object sender, EventArgs e)
{
OpenFileDialog dilog = new OpenFileDialog
{
Filter = "(*.jpg;*.bmp;*.png;*.JPEG)|*.jpg;*.bmp;*.png;*.JPEG"
};
if (dilog.ShowDialog() == DialogResult.OK)
{
imgPath = dilog.FileName;
CvMat img = Cv2.ImRead(dilog.FileName);
Bitmap bitmap = BitmapConverter.ToBitmap(img);
pictureBoxPicture.Image = bitmap;
}
}
private void buttonInference_Click(object sender, EventArgs e)
{
textBoxResult.Clear();
if (classifier == null)
{
MessageBox.Show("init model first");
return;
}
CvMat[] imgs = new CvMat[1] { Cv2.ImRead(imgPath, ImreadModes.Color) };
CvMatToMat(imgs, out var mats);
try
{
List<ClassifierOutput> output = classifier.Apply(mats);
int idx = 1;
foreach (var obj in output[0].Results)
{
if (obj.Score < 1e-7)
{
break;
}
string res = string.Format("Top-{0}-label: {1}, score: {2:f3}", idx, obj.Id, obj.Score);
if (idx == 1)
{
textBoxResult.Text = res;
}
else
{
textBoxResult.AppendText("\r\n" + res);
}
idx++;
}
} catch
{
MessageBox.Show("inference error");
}
}
private void FormDemo_Load(object sender, EventArgs e)
{
textBoxUsage.Text = "1) select model dir" +
"\r\n" + "2) choose device" +
"\r\n" + "3) init model" +
"\r\n" + "4) select image" +
"\r\n" + "5) do inference";
textBoxStatus.ForeColor = Color.Gray;
textBoxStatus.Text = "model not init";
}
}
}