基于AI的计算机视觉识别在Java项目中的使用 (一) —— 背景

2 篇文章 0 订阅
博主在公司软件项目中负责机器视觉识别服务的研发,由于市场上的第三方服务无法满足需求,决定自主研发。博主利用业余时间,从技术预研到模型训练、部署,全程独立完成。目前功能主体研发完毕,正在进行测试。未来将分享技术栈和详细过程,涉及OpenCV、Docker深度学习环境搭建、数据准备、模型训练与优化、Java环境部署等话题。
摘要由CSDN通过智能技术生成

最近公司做一款软件产品,我在其中承担机器视觉识别服务的研发工作。

自己一直从事企业应用和互联网应用项目的开发和管理工作。对于机器视觉这种强调算法的任务,自己平时工作中接触不多。原本这个产品是打算直接采购第三方服务的。对于第三方服务,我也做了一些调研,发现市场上的产品,无论价格还是功能都无法很好地契合我们的产品需求。开源的产品也找了,符合需求的没有,接近需求的开源项目极少。

自己前两年一直在用业余时间做人工智能、深度学习方面的学习和尝试,其中也涉及到机器视觉部分的内容。加上我对于如何实现相关功能有些思路,和Boss商量之后决定下注去做。

这个服务是整个产品的关键环节,如果我这边难产了,前期公司其他同事投入到产品中的时间精力也都打了水漂。所以自己接手这项任务还是承受了一些压力。

这段时间我还在另外一个项目帮忙,时忙时闲的,这之外的时间才用来做识别服务研发。在公司可用时间不算多,很多工作我是用业余时间来完成的,很多算法是在散步中想到的,甚至有时候是带着问题入睡,带着答案起床。绝对不是要彰显自己有多敬业努力、喜欢加班!我不喜欢加班,公司也没有加班文化,只是自己对这项挑战非常有兴趣而已。

目前为止,这部分功能的主体研发已基本完成,正在配合产品其他部分功能做测试。部分细节还会根据实际测试结果多一些打磨。

这项工作从技术可行性预研、技术选型、基础算法设计、实现、深度学习模型搭建、训练数据的准备清洗、模型训练和调优以及服务端的部署都是我独自做的,在此过程中也是小有收获。

前段时间在公司,我和同事们通过TechTalk分享了主要设计思路。现在我想继续通过文字来分享其中涉及的技术栈和细节,同时也作为自己近段时间工作的回顾总结。

后续,我打算分如下几期从不同方面来介绍:

二、《基于AI的计算机视觉识别在Java项目中的使用 —— OpenCV的使用》

三、《基于AI的计算机视觉识别在Java项目中的使用 —— 搭建基于Docker的深度学习训练环境》

四、《基于AI的计算机视觉识别在Java项目中的使用 —— 准备深度学习训练数据》

五、《基于AI的计算机视觉识别在Java项目中的使用 —— 深度模型的训练调优》

六、《基于AI的计算机视觉识别在Java项目中的使用 —— 深度模型在Java环境中的部署》

去年底本打算业余时间做一个基于AI的自由行助手,已经完成了分布式爬虫部分的开发。那中间也有一些可以总结的内容,比如多线程和分布式任务的相互协调,使用Redis做爬虫集群的缓存,如何应对网站的反爬虫机制等。后来也花了一点时间继续在研究如何用BERT语言模型对抓取的网页数据做解析和关键字提取。这些原有计划因为这项临时任务而打断,后面也希望能继续。

ImageComparerUI——基于Java语言实现的相似图像识别,基于直方图比较算法。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; public class ImageComparerUI extends JComponent implements ActionListener { /** * */ private static final long serialVersionUID = 1L; private JButton browseBtn; private JButton histogramBtn; private JButton compareBtn; private Dimension mySize; // image operator private MediaTracker tracker; private BufferedImage sourceImage; private BufferedImage candidateImage; private double simility; // command constants public final static String BROWSE_CMD = "Browse..."; public final static String HISTOGRAM_CMD = "Histogram Bins"; public final static String COMPARE_CMD = "Compare Result"; public ImageComparerUI() { JPanel btnPanel = new JPanel(); btnPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); browseBtn = new JButton("Browse..."); histogramBtn = new JButton("Histogram Bins"); compareBtn = new JButton("Compare Result"); // buttons btnPanel.add(browseBtn); btnPanel.add(histogramBtn); btnPanel.add(compareBtn); // setup listener... browseBtn.addActionListener(this); histogramBtn.addActionListener(this); compareBtn.addActionListener(this); mySize = new Dimension(620, 500); JFrame demoUI = new JFrame("Similiar Image Finder"); demoUI.getContentPane().setLayout(new BorderLayout()); demoUI.getContentPane().add(this, BorderLayout.CENTER); demoUI.getContentPane().add(btnPanel, BorderLayout.SOUTH); demoUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); demoUI.pack(); demoUI.setVisible(true); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; if(sourceImage != null) { Image scaledImage = sourceImage.getScaledInstance(300, 300, Image.SCALE_FAST); g2.drawImage(scaledImage, 0, 0, 300, 300, null); } if(candidateImage != null) { Image scaledImage = candidateImage.getScaledInstance(300, 330, Image.SCALE_FAST); g2.drawImage(scaledImage, 310, 0, 300, 300, null); } // display compare result info here Font myFont = new Font("Serif", Font.BOLD, 16); g2.setFont(myFont); g2.setPaint(Color.RED); g2.drawString("The degree of similarity : " + simility, 50, 350); } public void actionPerformed(ActionEvent e) { if(BROWSE_CMD.equals(e.getActionCommand())) { JFileChooser chooser = new JFileChooser(); chooser.showOpenDialog(null); File f = chooser.getSelectedFile(); BufferedImage bImage = null; if(f == null) return; try { bImage = ImageIO.read(f); } catch (IOException e1) { e1.printStackTrace(); } tracker = new MediaTracker(this); tracker.addImage(bImage, 1); // blocked 10 seconds to load the image data try { if (!tracker.waitForID(1, 10000)) { System.out.println("Load error."); System.exit(1); }// end if } catch (InterruptedException ine) { ine.printStackTrace(); System.exit(1); } // end catch if(sourceImage == null) { sourceImage = bImage; }else if(candidateImage == null) { candidateImage = bImage; } else { sourceImage = null; candidateImage = null; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值