做验证码图片的识别,不论是使用传统的ORC技术,还是使用统计机器学习或者是使用深度学习神经网络,都少不了从网络上采集大量相关的验证码图片做数据集样本来进行训练。
采集验证码图片,可以直接使用Python进行批量下载,下载完之后,就需要对下载下来的验证码图片进行标注。一般情况下,一个验证码图片的文件名就是图片中验证码的实际字符串。
在不借助工具的情况下,我们对验证码图片进行上述标注的流程是:
1、打开图片所在的文件夹;
2、选择一个图片;
3、鼠标右键重命名;
4、输入正确的字符串;
5、保存
州的先生亲身体验,一个验证码完成数据的标注,大概需要10到20秒。大量的时间浪费在了重复地进行鼠标右键重命名操作了。于是,使用Qt的Python封装包——PyQt5,编写了一个小工具,方便进行验证码图片的数据标注,节省时间,珍惜生命。
程序的运行如下动图所示:
下面我们来了解一下如何编写这个验证码图片数据标注程序。
首先,我们来构建一个图形界面。这个图形界面里面包含了一个图像展示控件、一个文本输入控件、四个按钮控件。基于此,我们选择三个布局来排列图形界面的布局。图形界面窗口中的核心控件是一个QWidget(),其布局层设置为网格布局QGridLayout()。在其中放置三个控件:图像展示控件QWidget()、文本输入控件QLineText()、四个按钮组QWidget()。
同时,图像展示控件QWidget()用水平布局层QHBoxLayout()包含一个QLabel()标签来占位;按钮组控件QWidget()用一个垂直布局层QVBoxLayout()将4个按钮控件QPushButton()添加进去。最后,代码如下所示:
class ImgTag(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("验证码图片标注 州的先生 zmister.com") # 主控件和主控件布局 self.main_widget = QtWidgets.QWidget() self.main_layout = QtWidgets.QGridLayout() self.main_widget.setLayout(self.main_layout) # 图像展示控件 self.img_widget = QtWidgets.QWidget() self.img_layout = QtWidgets.QHBoxLayout() self.img_widget.setLayout(self.img_layout) # 标签占位 self.img_view = QtWidgets.QLabel("请选择一个文件夹!") self.img_view.setAlignment(QtCore.Qt.AlignCenter) self.img_layout.addWidget(self.img_view) # 图像标注控件 self.img_input = QtWidgets.QLineEdit() # 控制按钮控件 self.opera_widget = QtWidgets.QWidget() self.opera_layout = QtWidgets.QVBoxLayout() self.opera_widget.setLayout(self.opera_layout) # 各个按钮 self.select_img_btn = QtWidgets.QPushButton("选择目录") self.previous_img_btn = QtWidgets.QPushButton("上一张") self.previous_img_btn.setEnabled(False) self.next_img_btn = QtWidgets.QPushButton("下一张") self.next_img_btn.setEnabled(False) self.save_img_btn = QtWidgets.QPushButton("保存") self.save_img_btn.setEnabled(False) # 添加按钮到布局 self.opera_layout.addWidget(self.select_img_btn) self.opera_layout.addWidget(self.previous_img_btn) self.opera_layout.addWidget(self.next_img_btn) self.opera_layout.addWidget(self.save_img_btn) # 将控件添加到主控件布局层 self.main_layout.addWidget(self.img_widget,0,0,4,4) self.main_layout.addWidget(self.opera_widget,0,4,5,1) self.main_layout.addWidget(self.img_input,4,0,1,4) # 状态栏 self.img_total_current_label = QtWidgets.QLabel() self.img_total_label = QtWidgets.QLabel() self.statusBar().addPermanentWidget(self.img_total_current_label) self.statusBar().addPermanentWidget(self.img_total_label, stretch=0) # 在状态栏添加永久控件 # 设置UI界面核心控件 self.setCentralWidget(self.main_widget)