C# AI鉴图宝 利用OCR技术对违规图片进行判别

目录

效果

项目

代码

下载


效果

项目

代码

using Aspose.Cells;
using NLog;
using OpenCvSharp;
using OpenVINO.OCRService;
using Sdcb.OpenVINO;
using Sdcb.OpenVINO.PaddleOCR;
using Sdcb.OpenVINO.PaddleOCR.Models;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OpenVINO.OCR
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
            NLog.Windows.Forms.RichTextBoxTarget.ReInitializeAllTextboxes(this);
        }

        String startupPath;
        private string excelFileFilter = "表格|*.xlsx;*.xls;";
        private Logger log = NLog.LogManager.GetCurrentClassLogger();
        CancellationTokenSource cts;

        ConcurrentQueue<ImgInfo> ltImgInfo = new ConcurrentQueue<ImgInfo>();
        ConcurrentQueue<ImgInfo> matQueue = new ConcurrentQueue<ImgInfo>();

        bool saveImg = false;
        bool saveOcr = false;

        int ocrNum = 0;//完成OCR识别的数量
        int totalCount = 0;//图片总数量
        int downloadCount = 0;//图片下载数量
        int vioIDCount = 0;//违规ID;

        private void frmMain_Load(object sender, EventArgs e)
        {
            DateTime limitTime = new DateTime(2024, 08, 30, 00, 00, 00);
            //测试使用
            if (DateTime.Now > limitTime)
            {
                MessageBox.Show("此软件试用期已过");
                Application.Exit();
            }

            //初始化
            startupPath = System.Windows.Forms.Application.StartupPath;


            string detectionModelDir = startupPath + "\\inference\\ch_PP-OCRv3_det_infer";
            string classificationModelDir = startupPath + "\\inference\\ch_ppocr_mobile_v2.0_cls_infer";
            string recognitionModelDir = startupPath + "\\inference\\ch_PP-OCRv3_rec_infer";
            string labelFilePath = startupPath + "\\inference\\ppocr_keys.txt";

            FullOcrModel model = FullOcrModel.FromDirectory(detectionModelDir, classificationModelDir, recognitionModelDir, labelFilePath, ModelVersion.V3);

            PaddleOcrOptions paddleOcrOptions = new PaddleOcrOptions();
            paddleOcrOptions.DetectionDeviceOptions = new DeviceOptions("CPU");
            paddleOcrOptions.DetectionStaticSize = new OpenCvSharp.Size(800, 800);
            paddleOcrOptions.RecognitionStaticWidth = 512;

            Program.paddleOcr = new PaddleOcrAll(model, paddleOcrOptions);
            Program.paddleOcr.Detector.UnclipRatio = 1.5f;
            Program.paddleOcr.AllowRotateDetection = true;    /* 允许识别有角度的文字 */
            Program.paddleOcr.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */

            ServicePointManager.Expect100Continue = false;
            ServicePointManager.DefaultConnectionLimit = 512;

            //加载违禁词
            Common.ltRuleContains.Clear();
            Common.ltRuleTel.Clear();

            string ruleContainsPath = "rules\\rule_contains.txt";
            if (File.Exists(ruleContainsPath))
            {
                Common.ltRuleContains = File.ReadAllLines(ruleContainsPath).ToList();

            }
            StringBuilder sb = new StringBuilder();
            foreach (var item in Common.ltRuleContains)
            {
                sb.AppendLine(item);
            }
            log.Info("rule_contains.txt---->包含" + Common.ltRuleContains.Count() + "个违禁词,内容如下:\r\n" + sb.ToString());


            string ruleTelPath = "rules\\rule_tel.txt";
            if (File.Exists(ruleTelPath))
            {
                foreach (var item in File.ReadAllLines(ruleTelPath))
                {
                    Common.ltRuleTel.Add(item.ToLower());
                }
            }

            sb.Clear();
            foreach (var item in Common.ltRuleTel)
            {
                sb.AppendLine(item);
            }
            log.Info("rule_tel.txt---->包含" + Common.ltRuleTel.Count() + "个号码前缀,内容如下:\r\n" + sb.ToString());

        }

        /// <summary>
        /// 选择表格
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = excelFileFilter;
                if (ofd.ShowDialog() != DialogResult.OK) return;

                log.Info("解析中……");
                Application.DoEvents();

                Stopwatch sw = new Stopwatch();
                sw.Start();  //开始计时

                string excelPath = ofd.FileName;

                Workbook workbook = new Workbook(excelPath);
                Cells cells = workbook.Worksheets[0].Cells;
                System.Data.DataTable dataTable1 = cells.ExportDataTable(1, 0, cells.MaxDataRow, cells.MaxColumn + 1);//noneTitle

                ltImgInfo = new ConcurrentQueue<ImgInfo>();

                //遍历
                ImgInfo temp;
                int imgCount = 0;
                foreach (DataRow row in dataTable1.Rows)
                {
                    temp = new ImgInfo();
                    temp.id = row[0].ToString();
                    temp.title = row[1].ToString();

                    List<MatInfo> list = new List<MatInfo>();
                    for (int i = 2; i < cells.MaxColumn + 1; i++)
                    {

                        string tempStr = row[i].ToString();
                        if (!string.IsNullOrEmpty(tempStr))
                        {
                            if (i >= 7)
                            {
                                List<string> ltScrUrlTemp = Common.GetScrUrl(tempStr);
                                if (ltScrUrlTemp.Count > 0)
                                {
                                    foreach (var item in ltScrUrlTemp)
                                    {

                                        MatInfo matInfo = new MatInfo();
                                        matInfo.url = item;
                                        list.Add(matInfo);
                                    }
                                }
                            }
                            else
                            {
                                MatInfo matInfo = new MatInfo();
                                matInfo.url = tempStr;
                                list.Add(matInfo);
                            }
                        }
                    }
                    temp.images = list;
                    imgCount = imgCount + list.Count();
                    ltImgInfo.Enqueue(temp);

                    //for test
                    //if (ltImgInfo.Count()>10)
                    //{
                    //    break;
                    //}
                }
                log.Info("解析完毕,一共[" + ltImgInfo.Count + "]条记录,[" + imgCount + "]张图片,耗时:" + sw.ElapsedMilliseconds + "毫秒");
            }
            catch (Exception ex)
            {
                log.Error("解析表格异常:" + ex.Message);
                MessageBox.Show("解析表格异常:" + ex.Message);
            }
        }

        void ShowCostTime(string total, string ocrNum, string downloadCount, long time, int vioIDCount)
        {
            txtTotal.Invoke(new Action(() =>
            {
                TimeSpan ts = TimeSpan.FromMilliseconds(time);
                txtTotal.Text = string.Format("下载完成:{0}/{1},识别完成:{2}/{3},违规ID数量:{5},用时:{4}"
                    , downloadCount
                    , total
                    , ocrNum
                    , total
                    , ts.ToString()
                    , vioIDCount
                    );
            }));
        }

        /// <summary>
        /// 下载识别
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (ltImgInfo.Count == 0)
            {
                MessageBox.Show("请先选择表格!");
                return;
            }

            DialogResult result = MessageBox.Show("确认开始下载识别?此操作会清空上一次的数据,请注意备份!", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (result == DialogResult.Yes)
            {
                log.Info("确认开始下载识别!");
            }
            else
            {
                log.Info("取消开始下载识别!");
                return;
            }

            if (!Directory.Exists("img"))
            {
                Directory.CreateDirectory("img");
            }

            if (!Directory.Exists("ocr_result"))
            {
                Directory.CreateDirectory("ocr_result");
            }

            if (!Directory.Exists("result"))
            {
                Directory.CreateDirectory("result");
            }

            if (!Directory.Exists("result//img"))
            {
                Directory.CreateDirectory("result//img");
            }

            //清空结果
            File.WriteAllText("result//result.txt", "");
            File.WriteAllText("result//result_detail.txt", "");
            // 清空文件夹中的文件
            foreach (string filePath in Directory.GetFiles("result", "*", SearchOption.AllDirectories))
            {
                File.Delete(filePath);
            }

            // 写入列标题
            File.WriteAllText("result//result.txt", "id\ttitel\tcontent\r\n");

            btnStop.Enabled = true;
            btnStart.Enabled = false;
            chkSaveImg.Enabled = false;
            chkSaveOcr.Enabled = false;

            if (chkSaveImg.Checked)
            {
                saveImg = true;
            }
            else
            {
                saveImg = false;
            }

            if (chkSaveOcr.Checked)
            {
                saveOcr = true;
            }
            else
            {
                saveOcr = false;
            }

            Application.DoEvents();

            cts = new CancellationTokenSource();

            Stopwatch total = new Stopwatch();
            total.Start();  //开始计时

            // 清空队列
            matQueue = new ConcurrentQueue<ImgInfo>();
            //while (!matQueue.IsEmpty)
            //{
            //    matQueue.TryDequeue(out _);
            //}


            ocrNum = 0;//完成OCR识别的数量
            totalCount = ltImgInfo.Count();//图片总数量
            downloadCount = 0;

            //下载线程
            int downloadThreadNum = 2;
            for (int i = 0; i < downloadThreadNum; i++)
            {
                Task.Factory.StartNew(() =>
                {
                    while (true)
                    {
                        //判断是否被取消;
                        if (cts.Token.IsCancellationRequested)
                        {
                            return;
                        }

                        if (downloadCount == totalCount)
                        {
                            log.Info("--------------------------------->下载完成!<----------------------------------");
                            return;
                        }

                        ImgInfo imgInfo = new ImgInfo();
                        if (ltImgInfo.TryDequeue(out imgInfo))
                        {
                            //队列容量大于50 休息一秒
                            if (matQueue.Count > 50)
                            {
                                System.Threading.Thread.Sleep(1000);
                            }

                            if (matQueue.Count > 100)
                            {
                                System.Threading.Thread.Sleep(2000);
                            }

                            int imagesCount = imgInfo.images.Count();
                            for (int j = 0; j < imagesCount; j++)
                            {
                                try
                                {
                                    Stopwatch sw = new Stopwatch();
                                    sw.Start();  //开始计时
                                    HttpWebRequest request = WebRequest.Create(imgInfo.images[j].url) as HttpWebRequest;
                                    request.KeepAlive = false;
                                    request.ServicePoint.Expect100Continue = false;
                                    request.Timeout = 2000;// 2秒
                                    request.ReadWriteTimeout = 2000;//2秒

                                    request.ServicePoint.UseNagleAlgorithm = false;
                                    request.ServicePoint.ConnectionLimit = 65500;
                                    request.AllowWriteStreamBuffering = false;
                                    request.Proxy = null;

                                    request.CookieContainer = new CookieContainer();
                                    request.CookieContainer.Add(new Cookie("AspxAutoDetectCookieSupport", "1") { Domain = new Uri(imgInfo.images[j].url).Host });

                                    HttpWebResponse wresp = (HttpWebResponse)request.GetResponse();
                                    Stream s = wresp.GetResponseStream();
                                    Bitmap bmp = (Bitmap)System.Drawing.Image.FromStream(s);
                                    s.Dispose();
                                    wresp.Close();
                                    wresp.Dispose();
                                    request.Abort();

                                    sw.Stop();


                                    if (saveImg)
                                    {
                                        bmp.Save("img//" + imgInfo.id + "_" + j + ".jpg");
                                    }

                                    var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bmp);

                                    if (mat.Channels() == 4)
                                    {
                                        Cv2.CvtColor(mat, mat, ColorConversionCodes.BGRA2BGR);
                                    }

                                    imgInfo.images[j].mat = mat;
                                    imgInfo.images[j].name = imgInfo.id + "_" + j;

                                    if (saveImg)
                                    {
                                        bmp.Save("img//" + imgInfo.images[j].name + ".jpg");
                                    }

                                    log.Info("  " + imgInfo.images[j].name + "-->下载用时:" + sw.ElapsedMilliseconds + "毫秒");
                                }
                                catch (Exception ex)
                                {
                                    log.Error("---->id:" + imgInfo.id + ",url[" + imgInfo.images[j].url + "],下载异常:" + ex.Message);
                                }
                            }
                            matQueue.Enqueue(imgInfo);
                            Interlocked.Increment(ref downloadCount);
                        }

                    }
                }, TaskCreationOptions.LongRunning);

            }

            //识别线程
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    //判断是否被取消;
                    if (cts.Token.IsCancellationRequested)
                    {
                        return;
                    }

                    if (ocrNum == totalCount)
                    {
                        log.Info("--------------------------------->识别完成!<----------------------------------");
                        return;
                    }

                    ImgInfo imgInfo = new ImgInfo();
                    if (matQueue.TryDequeue(out imgInfo))
                    {

                        Stopwatch perID = new Stopwatch();
                        perID.Start();//开始计时
                        int imagesCount = imgInfo.images.Count();
                        for (int j = 0; j < imagesCount; j++)
                        {
                            //Mat mat= imgInfo.images[j].mat;
                            Stopwatch sw = new Stopwatch();
                            sw.Start();  //开始计时
                            PaddleOcrResult ocrResult = null;
                            try
                            {
                                if (imgInfo.images[j].mat != null && (!imgInfo.images[j].mat.Empty()))
                                {
                                    ocrResult = Program.paddleOcr.Run(imgInfo.images[j].mat);

                                    sw.Stop();
                                    log.Info("  " + imgInfo.images[j].name + "---->识别用时:" + sw.ElapsedMilliseconds + "毫秒");

                                    //string ocrInfo = ocrResult.Text.ToString();

                                    string ocrInfo = string.Join("\n", from x in ocrResult.Regions
                                                                       where x.Score > 0.8
                                                                       orderby x.Rect.Center.Y, x.Rect.Center.X
                                                                       select x.Text);

                                    if (saveOcr)
                                    {
                                        File.WriteAllText("ocr_result//" + imgInfo.images[j].name + ".txt", ocrInfo);
                                    }

                                    //规则校验
                                    Stopwatch ruleSw = new Stopwatch();
                                    ruleSw.Start();//开始计时
                                    ocrInfo = ocrInfo.Trim();
                                    ocrInfo = ocrInfo.Replace(" ", "");

                                    string words = "";
                                    string resultInfo = "";
                                    if (Common.RuleContainsCheck(ocrInfo, out words, ocrResult))
                                    {
                                        resultInfo = string.Format("ID:{0},Title:[{1}],------>包含违禁词:{2}", imgInfo.id, imgInfo.title, words);
                                        log.Info(resultInfo);

                                        //存数据
                                        File.AppendAllText("result//result.txt", imgInfo.id + "\t" + imgInfo.title + "\t包含违禁词:" + words + "\r\n");
                                        File.AppendAllText("result//result_detail.txt", "-------->\r\n" + resultInfo + ",识别内容" + ocrInfo + "\r\n<--------\r\n");

                                        //存图
                                        Cv2.ImWrite("result//img//" + imgInfo.images[j].name + ".jpg", imgInfo.images[j].mat);
                                        imgInfo.images[j].mat.Dispose();

                                        Interlocked.Increment(ref vioIDCount);

                                        break;
                                    }

                                    if (Common.RuleTelCheck(ocrInfo, out words, ocrResult))
                                    {
                                        resultInfo = string.Format("ID:{0},Title:[{1}],------>疑似包含电话号码:{2}", imgInfo.id, imgInfo.title, words);
                                        log.Info(resultInfo);
                                        //File.AppendAllText("result//result.txt", resultInfo+ "\r\n");
                                        File.AppendAllText("result//result.txt", imgInfo.id + "\t" + imgInfo.title + "\t疑似包含电话号码:" + words + "\r\n");
                                        File.AppendAllText("result//result_detail.txt", "-------->\r\n" + resultInfo + ",识别内容" + ocrInfo + "\r\n<--------\r\n");

                                        //存图
                                        Cv2.ImWrite("result//img//" + imgInfo.images[j].name + ".jpg", imgInfo.images[j].mat);
                                        imgInfo.images[j].mat.Dispose();

                                        Interlocked.Increment(ref vioIDCount);

                                        break;
                                    }
                                    imgInfo.images[j].mat.Dispose();
                                    ruleSw.Stop();
                                    //log.Info("  " + imgInfo.images[j].name + "---->违禁词校验用时:" + ruleSw.ElapsedMilliseconds + "毫秒");
                                }
                            }
                            catch (Exception ex)
                            {
                                imgInfo.images[j].mat.Dispose();
                                log.Info("  " + imgInfo.images[j].name + "---->识别异常:" + ex.Message);
                            }
                        }

                        perID.Stop();
                        log.Info("---->id:" + imgInfo.id + ",图片张数[" + imagesCount + "],识别小计用时:" + perID.ElapsedMilliseconds + "毫秒");
                        Interlocked.Increment(ref ocrNum);
                        ShowCostTime(totalCount.ToString(), ocrNum.ToString(), downloadCount.ToString(), total.ElapsedMilliseconds, vioIDCount);

                    }
                }
            }, TaskCreationOptions.LongRunning);
        }

        /// <summary>
        /// 停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            cts.Cancel();
            btnStop.Enabled = false;
            btnStart.Enabled = true;

            chkSaveImg.Enabled = true;
            chkSaveOcr.Enabled = true;
        }
    }
}

using Aspose.Cells;
using NLog;
using OpenCvSharp;
using OpenVINO.OCRService;
using Sdcb.OpenVINO;
using Sdcb.OpenVINO.PaddleOCR;
using Sdcb.OpenVINO.PaddleOCR.Models;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace OpenVINO.OCR
{public partial class frmMain : Form{public frmMain(){InitializeComponent();NLog.Windows.Forms.RichTextBoxTarget.ReInitializeAllTextboxes(this);}String startupPath;private string excelFileFilter = "表格|*.xlsx;*.xls;";private Logger log = NLog.LogManager.GetCurrentClassLogger();CancellationTokenSource cts;ConcurrentQueue<ImgInfo> ltImgInfo = new ConcurrentQueue<ImgInfo>();ConcurrentQueue<ImgInfo> matQueue = new ConcurrentQueue<ImgInfo>();bool saveImg = false;bool saveOcr = false;int ocrNum = 0;//完成OCR识别的数量int totalCount = 0;//图片总数量int downloadCount = 0;//图片下载数量int vioIDCount = 0;//违规ID;private void frmMain_Load(object sender, EventArgs e){DateTime limitTime = new DateTime(2024, 08, 30, 00, 00, 00);//测试使用if (DateTime.Now > limitTime){MessageBox.Show("此软件试用期已过");Application.Exit();}//初始化startupPath = System.Windows.Forms.Application.StartupPath;string detectionModelDir = startupPath + "\\inference\\ch_PP-OCRv3_det_infer";string classificationModelDir = startupPath + "\\inference\\ch_ppocr_mobile_v2.0_cls_infer";string recognitionModelDir = startupPath + "\\inference\\ch_PP-OCRv3_rec_infer";string labelFilePath = startupPath + "\\inference\\ppocr_keys.txt";FullOcrModel model = FullOcrModel.FromDirectory(detectionModelDir, classificationModelDir, recognitionModelDir, labelFilePath, ModelVersion.V3);PaddleOcrOptions paddleOcrOptions = new PaddleOcrOptions();paddleOcrOptions.DetectionDeviceOptions = new DeviceOptions("CPU");paddleOcrOptions.DetectionStaticSize = new OpenCvSharp.Size(800, 800);paddleOcrOptions.RecognitionStaticWidth = 512;Program.paddleOcr = new PaddleOcrAll(model, paddleOcrOptions);Program.paddleOcr.Detector.UnclipRatio = 1.5f;Program.paddleOcr.AllowRotateDetection = true;    /* 允许识别有角度的文字 */Program.paddleOcr.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */ServicePointManager.Expect100Continue = false;ServicePointManager.DefaultConnectionLimit = 512;//加载违禁词Common.ltRuleContains.Clear();Common.ltRuleTel.Clear();string ruleContainsPath = "rules\\rule_contains.txt";if (File.Exists(ruleContainsPath)){Common.ltRuleContains = File.ReadAllLines(ruleContainsPath).ToList();}StringBuilder sb = new StringBuilder();foreach (var item in Common.ltRuleContains){sb.AppendLine(item);}log.Info("rule_contains.txt---->包含" + Common.ltRuleContains.Count() + "个违禁词,内容如下:\r\n" + sb.ToString());string ruleTelPath = "rules\\rule_tel.txt";if (File.Exists(ruleTelPath)){foreach (var item in File.ReadAllLines(ruleTelPath)){Common.ltRuleTel.Add(item.ToLower());}}sb.Clear();foreach (var item in Common.ltRuleTel){sb.AppendLine(item);}log.Info("rule_tel.txt---->包含" + Common.ltRuleTel.Count() + "个号码前缀,内容如下:\r\n" + sb.ToString());}/// <summary>/// 选择表格/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){try{OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = excelFileFilter;if (ofd.ShowDialog() != DialogResult.OK) return;log.Info("解析中……");Application.DoEvents();Stopwatch sw = new Stopwatch();sw.Start();  //开始计时string excelPath = ofd.FileName;Workbook workbook = new Workbook(excelPath);Cells cells = workbook.Worksheets[0].Cells;System.Data.DataTable dataTable1 = cells.ExportDataTable(1, 0, cells.MaxDataRow, cells.MaxColumn + 1);//noneTitleltImgInfo = new ConcurrentQueue<ImgInfo>();//遍历ImgInfo temp;int imgCount = 0;foreach (DataRow row in dataTable1.Rows){temp = new ImgInfo();temp.id = row[0].ToString();temp.title = row[1].ToString();List<MatInfo> list = new List<MatInfo>();for (int i = 2; i < cells.MaxColumn + 1; i++){string tempStr = row[i].ToString();if (!string.IsNullOrEmpty(tempStr)){if (i >= 7){List<string> ltScrUrlTemp = Common.GetScrUrl(tempStr);if (ltScrUrlTemp.Count > 0){foreach (var item in ltScrUrlTemp){MatInfo matInfo = new MatInfo();matInfo.url = item;list.Add(matInfo);}}}else{MatInfo matInfo = new MatInfo();matInfo.url = tempStr;list.Add(matInfo);}}}temp.images = list;imgCount = imgCount + list.Count();ltImgInfo.Enqueue(temp);//for test//if (ltImgInfo.Count()>10)//{//    break;//}}log.Info("解析完毕,一共[" + ltImgInfo.Count + "]条记录,[" + imgCount + "]张图片,耗时:" + sw.ElapsedMilliseconds + "毫秒");}catch (Exception ex){log.Error("解析表格异常:" + ex.Message);MessageBox.Show("解析表格异常:" + ex.Message);}}void ShowCostTime(string total, string ocrNum, string downloadCount, long time, int vioIDCount){txtTotal.Invoke(new Action(() =>{TimeSpan ts = TimeSpan.FromMilliseconds(time);txtTotal.Text = string.Format("下载完成:{0}/{1},识别完成:{2}/{3},违规ID数量:{5},用时:{4}", downloadCount, total, ocrNum, total, ts.ToString(), vioIDCount);}));}/// <summary>/// 下载识别/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){if (ltImgInfo.Count == 0){MessageBox.Show("请先选择表格!");return;}DialogResult result = MessageBox.Show("确认开始下载识别?此操作会清空上一次的数据,请注意备份!", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (result == DialogResult.Yes){log.Info("确认开始下载识别!");}else{log.Info("取消开始下载识别!");return;}if (!Directory.Exists("img")){Directory.CreateDirectory("img");}if (!Directory.Exists("ocr_result")){Directory.CreateDirectory("ocr_result");}if (!Directory.Exists("result")){Directory.CreateDirectory("result");}if (!Directory.Exists("result//img")){Directory.CreateDirectory("result//img");}//清空结果File.WriteAllText("result//result.txt", "");File.WriteAllText("result//result_detail.txt", "");// 清空文件夹中的文件foreach (string filePath in Directory.GetFiles("result", "*", SearchOption.AllDirectories)){File.Delete(filePath);}// 写入列标题File.WriteAllText("result//result.txt", "id\ttitel\tcontent\r\n");btnStop.Enabled = true;btnStart.Enabled = false;chkSaveImg.Enabled = false;chkSaveOcr.Enabled = false;if (chkSaveImg.Checked){saveImg = true;}else{saveImg = false;}if (chkSaveOcr.Checked){saveOcr = true;}else{saveOcr = false;}Application.DoEvents();cts = new CancellationTokenSource();Stopwatch total = new Stopwatch();total.Start();  //开始计时// 清空队列matQueue = new ConcurrentQueue<ImgInfo>();//while (!matQueue.IsEmpty)//{//    matQueue.TryDequeue(out _);//}ocrNum = 0;//完成OCR识别的数量totalCount = ltImgInfo.Count();//图片总数量downloadCount = 0;//下载线程int downloadThreadNum = 2;for (int i = 0; i < downloadThreadNum; i++){Task.Factory.StartNew(() =>{while (true){//判断是否被取消;if (cts.Token.IsCancellationRequested){return;}if (downloadCount == totalCount){log.Info("--------------------------------->下载完成!<----------------------------------");return;}ImgInfo imgInfo = new ImgInfo();if (ltImgInfo.TryDequeue(out imgInfo)){//队列容量大于50 休息一秒if (matQueue.Count > 50){System.Threading.Thread.Sleep(1000);}if (matQueue.Count > 100){System.Threading.Thread.Sleep(2000);}int imagesCount = imgInfo.images.Count();for (int j = 0; j < imagesCount; j++){try{Stopwatch sw = new Stopwatch();sw.Start();  //开始计时HttpWebRequest request = WebRequest.Create(imgInfo.images[j].url) as HttpWebRequest;request.KeepAlive = false;request.ServicePoint.Expect100Continue = false;request.Timeout = 2000;// 2秒request.ReadWriteTimeout = 2000;//2秒request.ServicePoint.UseNagleAlgorithm = false;request.ServicePoint.ConnectionLimit = 65500;request.AllowWriteStreamBuffering = false;request.Proxy = null;request.CookieContainer = new CookieContainer();request.CookieContainer.Add(new Cookie("AspxAutoDetectCookieSupport", "1") { Domain = new Uri(imgInfo.images[j].url).Host });HttpWebResponse wresp = (HttpWebResponse)request.GetResponse();Stream s = wresp.GetResponseStream();Bitmap bmp = (Bitmap)System.Drawing.Image.FromStream(s);s.Dispose();wresp.Close();wresp.Dispose();request.Abort();sw.Stop();if (saveImg){bmp.Save("img//" + imgInfo.id + "_" + j + ".jpg");}var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bmp);if (mat.Channels() == 4){Cv2.CvtColor(mat, mat, ColorConversionCodes.BGRA2BGR);}imgInfo.images[j].mat = mat;imgInfo.images[j].name = imgInfo.id + "_" + j;if (saveImg){bmp.Save("img//" + imgInfo.images[j].name + ".jpg");}log.Info("  " + imgInfo.images[j].name + "-->下载用时:" + sw.ElapsedMilliseconds + "毫秒");}catch (Exception ex){log.Error("---->id:" + imgInfo.id + ",url[" + imgInfo.images[j].url + "],下载异常:" + ex.Message);}}matQueue.Enqueue(imgInfo);Interlocked.Increment(ref downloadCount);}}}, TaskCreationOptions.LongRunning);}//识别线程Task.Factory.StartNew(() =>{while (true){//判断是否被取消;if (cts.Token.IsCancellationRequested){return;}if (ocrNum == totalCount){log.Info("--------------------------------->识别完成!<----------------------------------");return;}ImgInfo imgInfo = new ImgInfo();if (matQueue.TryDequeue(out imgInfo)){Stopwatch perID = new Stopwatch();perID.Start();//开始计时int imagesCount = imgInfo.images.Count();for (int j = 0; j < imagesCount; j++){//Mat mat= imgInfo.images[j].mat;Stopwatch sw = new Stopwatch();sw.Start();  //开始计时PaddleOcrResult ocrResult = null;try{if (imgInfo.images[j].mat != null && (!imgInfo.images[j].mat.Empty())){ocrResult = Program.paddleOcr.Run(imgInfo.images[j].mat);sw.Stop();log.Info("  " + imgInfo.images[j].name + "---->识别用时:" + sw.ElapsedMilliseconds + "毫秒");//string ocrInfo = ocrResult.Text.ToString();string ocrInfo = string.Join("\n", from x in ocrResult.Regionswhere x.Score > 0.8orderby x.Rect.Center.Y, x.Rect.Center.Xselect x.Text);if (saveOcr){File.WriteAllText("ocr_result//" + imgInfo.images[j].name + ".txt", ocrInfo);}//规则校验Stopwatch ruleSw = new Stopwatch();ruleSw.Start();//开始计时ocrInfo = ocrInfo.Trim();ocrInfo = ocrInfo.Replace(" ", "");string words = "";string resultInfo = "";if (Common.RuleContainsCheck(ocrInfo, out words, ocrResult)){resultInfo = string.Format("ID:{0},Title:[{1}],------>包含违禁词:{2}", imgInfo.id, imgInfo.title, words);log.Info(resultInfo);//存数据File.AppendAllText("result//result.txt", imgInfo.id + "\t" + imgInfo.title + "\t包含违禁词:" + words + "\r\n");File.AppendAllText("result//result_detail.txt", "-------->\r\n" + resultInfo + ",识别内容" + ocrInfo + "\r\n<--------\r\n");//存图Cv2.ImWrite("result//img//" + imgInfo.images[j].name + ".jpg", imgInfo.images[j].mat);imgInfo.images[j].mat.Dispose();Interlocked.Increment(ref vioIDCount);break;}if (Common.RuleTelCheck(ocrInfo, out words, ocrResult)){resultInfo = string.Format("ID:{0},Title:[{1}],------>疑似包含电话号码:{2}", imgInfo.id, imgInfo.title, words);log.Info(resultInfo);//File.AppendAllText("result//result.txt", resultInfo+ "\r\n");File.AppendAllText("result//result.txt", imgInfo.id + "\t" + imgInfo.title + "\t疑似包含电话号码:" + words + "\r\n");File.AppendAllText("result//result_detail.txt", "-------->\r\n" + resultInfo + ",识别内容" + ocrInfo + "\r\n<--------\r\n");//存图Cv2.ImWrite("result//img//" + imgInfo.images[j].name + ".jpg", imgInfo.images[j].mat);imgInfo.images[j].mat.Dispose();Interlocked.Increment(ref vioIDCount);break;}imgInfo.images[j].mat.Dispose();ruleSw.Stop();//log.Info("  " + imgInfo.images[j].name + "---->违禁词校验用时:" + ruleSw.ElapsedMilliseconds + "毫秒");}}catch (Exception ex){imgInfo.images[j].mat.Dispose();log.Info("  " + imgInfo.images[j].name + "---->识别异常:" + ex.Message);}}perID.Stop();log.Info("---->id:" + imgInfo.id + ",图片张数[" + imagesCount + "],识别小计用时:" + perID.ElapsedMilliseconds + "毫秒");Interlocked.Increment(ref ocrNum);ShowCostTime(totalCount.ToString(), ocrNum.ToString(), downloadCount.ToString(), total.ElapsedMilliseconds, vioIDCount);}}}, TaskCreationOptions.LongRunning);}/// <summary>/// 停止/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){cts.Cancel();btnStop.Enabled = false;btnStart.Enabled = true;chkSaveImg.Enabled = true;chkSaveOcr.Enabled = true;}}
}

下载

源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396916.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter性能压测4000并发

性能测试的底层逻辑 程序为什么会有性能问题 用户操作 客户端&#xff08;web/app/小程序&#xff09;触发网络请求&#xff0c;服务器处理大量网络请求代码运行需要大量服务器资源&#xff08;CPU、内存、网络、磁盘等等&#xff09; 资源不是无限&#xff0c;硬件配置不是随…

使用Python发送PDD直播间弹幕(协议算法分析)

文章目录 1. 写在前面2. 接口分析3. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

日撸Java三百行(day19:字符串匹配)

目录 一、字符串的一些基础知识 二、代码实现 1.字符类的创建 2.字符类的遍历 3.字符串匹配 4.字符串截取 5.数据测试 6.完整的程序代码 总结 一、字符串的一些基础知识 字符串&#xff08;String&#xff09;是用一对双引号括起来的零个或多个字符组成的有限序列&am…

简单的docker学习 第13章 CI/CD与Jenkins(上)

第13章 CI/CD 与 Jenkins 13.1 平台登录页面 13.1.1 GitLab-8098-root 13.1.2 Jenkins-8080-zhangsan 13.1.3 SonarQube-9000-admin 13.1.4 harbor-80-admin 13.2 CI/CD 与 DevOps 13.2.1 CI/CD 简介 CI > Continuous Integration&#xff0c;持续集成。即将持续不断更新…

如何在linux系统上部署nginx

1&#xff09;首先去 nginx.org/download 官网下载你所需要的版本 我这里是下载的 nginx-1-23-3.tar.gz 2&#xff09;然后执行 yum -y install lrzsz 安装文件上传软件 执行 rz 选择你下载nginx的位置进行上传 yum -y install lrzsz 3&#xff09;执行 tar -zxvf nginx-1.23…

数据可视化(爬取豆瓣网站)

目录 1 绪论 1.1 研究背景 1.2 研究目的和意义 1.3 研究内容和方法 2. 需求分析 2.1 系统功能描述 2.2 数据采集与预处理 2.2.1 数据采集 2.2.2 数据清洗 2.2.3 数据处理 2.3 功能需求 2.3.1 登录模块 2.3.2 数据展示模块 3 系统设计 3.1 系统功能结构设计 3.2 …

Pycharm中重命名项目之后切换虚拟环境

Pycharm中重命名项目之后切换虚拟环境 场景 在Pycharm里面Rename Project/Directory之后&#xff0c;通常需要切换虚拟环境。 步骤 # 退出当前虚拟环境 deactivate # 删除旧的虚拟环境 .venv # 新建新的虚拟环境 python -m venv .venv # 切换到新的工程目录 cd E:\Bigdata\…

排序算法——插入排序

一、插入排序概念 直接插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理类似于人们手动排序卡片的方式。该算法通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插…

二叉树相关的算法题

二叉树相关的算法题 单值二叉树 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;t…

初阶数据结构5 排序

排序 1. 排序概念及运用1.1 概念1.2运用1.3 常见排序算法 2. 实现常⻅排序算法2.1 插⼊排序2.1.1 直接插⼊排序2.1.2 希尔排序2.1.2.1 希尔排序的时间复杂度计算 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序2.3.2.1 hoare版本2.3.2.2…

【云服务器系列】基于华为云OBS实现Picgo和Typora的完美融合

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

STM32-IIC协议详解

一、IIC简介 IC&#xff08;Inter-Integrated Circuit&#xff09;协议由飞利浦公司于1980年代开发&#xff0c;是一种用于集成电路间短距离通信的串行协议。它设计用于连接低速外围设备&#xff0c;特别适合于需要简单数据交换的场景。IC协议使用两根信号线&#xff1a;SCL&am…

Python数值计算(23)——modified akima插值

1. 数学原理 在前面的Akima插值中&#xff0c;计算斜率使用如下公式&#xff1a; 如果记&#xff1a; 在出现分母分子同时为零的情况时&#xff0c;会出现NaN的计算结果&#xff0c;Akima他自己也意识到这种问题&#xff0c;因此&#xff0c;在原来的算法上做了修订&#xff0…

Python | Leetcode Python题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution:def minPatches(self, nums: List[int], n: int) -> int:patches, x 0, 1length, index len(nums), 0while x < n:if index < length and nums[index] < x:x nums[index]index 1else:x << 1patches …

【线性代数】第2章 矩阵及其运算,矩阵的定义,矩阵的加法,矩阵的乘法(同济大学)

目录 1 矩阵 一、矩阵概念的引入 二、矩阵的定义 三、特殊的矩阵 同型矩阵与矩阵相等的概念 四、矩阵与线性变换 例 例 例 2 矩阵的运算 例 一、矩阵的加法 二、数与矩阵相乘 例&#xff08;续&#xff09; 三、矩阵与矩阵相乘 1 矩阵 一、矩阵概…

NVIDIA Triton系列11-模型类别与调度器-1

NVIDIA Triton系列11-模型类别与调度器-1 B站&#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) 博客&#xff1a;肆十二-CSDN博客 问答&#xff1a;(10 封私信 / 72 条消息) 肆十二 - 知乎 (zhihu.com) 在 Triton 推理服务器的使用中&#xff0c;模…

数据科学 - 数据可视化(持续更新)

1. 前言​​​​​​​ 数据可视化能够将复杂的数据集转化为易于理解的图形、图表或图像。这种直观的表现形式使得人们能够更快地理解数据的分布、趋势、异常值以及数据之间的关系&#xff0c;从而更深入地洞察数据背后的信息。 数据可视化在数据分析和决策制定过程中具有不可…

C++的7种设计模式原则

一、设计模式前言 设计模式&#xff08;Design Patterns&#xff09;的“模式”指的是一种在软件设计中经过验证的、解决特定问题的方案。它们不是具体的代码&#xff0c;而是解决常见设计问题的抽象方案或模板。设计模式提供了一种标准的方式来组织代码&#xff0c;以提高代码…

为JetBrains IDE设置自定义TODO筛选器(筛选指定的关键字)和Live Templates

为JetBrains IDE设置自定义TODO筛选器&#xff08;筛选指定的关键字&#xff09;和Live Templates 以下内容以搜索关键字 // TODO Zzz 为例&#xff0c;不区分大小写&#xff0c;可以将模板中的 Zzz 换成其他内容。 设置自定义TODO筛选器 在IDE设置中找到TODO选项&#xff0…

AWS注册是否必须使用美元银行卡

亚马逊网络服务(AWS)作为全球领先的云计算平台,吸引了众多企业和个人用户。然而,不少人在注册AWS账户时会产生疑问:是否必须使用美元银行卡?实际上,这种说法并不准确。虽然AWS的主要结算货币是美元,但用户在注册和使用过程中有多种支付方式可供选择。我们结合九河云的分析来告…