工作记录二(线上赛分析延申)
一、线上赛赛题说明
1.数据集描述
本届比赛的训练数据集,共有122387张。数据集地址在这里
- 标注集在
train_label.txt
文件中,单行标注示例如下:
train/mg_crop_217514.jpg A.a(1+p)²
(打开训练数据集,你会发现,本次大家挑战的,都是分辨率都是比较低的手写字体的图。线下赛任务,也会让车模识别手写字体哦!)
- 对应
train
文件夹中的图片如下:
包含img_path
图片路径与标注内容,二者以’\t’间隔。
2.提交要求
本次比赛要求选手使用飞桨PaddlePaddle2.2及以上版本生成端到端深度学习模型。 选手需上传训练模型、预测代码及环境库(可选)的zip形式压缩包,命名为submission,提交到本赛事结果页进行自动评测。
注意以下要求:
- 预测代码需命名为
predict.py
- 整体压缩包不超过100M
- 目录结构约定如下
| -- model # 存放模型
| | -- xxx.pbmodel
| | -- xxx.pdiparams
| | …
| -- env # 存放依赖库,如PaddleDetection、PaddleSeg
| | -- xxx.lib
| |…
| -- predict.py # 预测代码
| -- requirements.txt # 相关依赖
|...
3.评分规则
Accuracy:模型对每张图片里文字内容的识别准确率,错一个字即为错,按照准确率高低进行排名。
4.官方baseline
喜乐多多多:打开项目
5.平台评测配置环境
- 预测框架:平台默认配置paddle(v2.3)框架;
- 代码环境:平台仅配置python3.7执行环境;
- 环境库(可选):选手如需使用超出平台的代码依赖库或框架,即要求定义好 requirements.txt文件,确保predict.py在平台能正常执行。
6.平台自动评测过程科普
AI Studio平台提供统一的预测机器资源(V100)
参赛选手在代码提交页面提交压缩包后,测评系统会进行解压,并将测试图片集test文件夹放在解压后文件主目录中。后台视角下的文件结构将如下所示:
submission
├── model
├── PaddleOCR
├── test
│ ├── mg_crop_87772.jpg
│ ├── mg_crop_87786.jpg
│ ├── mg_crop_87787.jpg
│ ├── ...
│ ├── ...
└── predict.py
此时,系统将运行predict.py
,自动预测并将结果保存为result.txt。result.txt的存储路径,需要选手设定好其保存路径位submission/result.txt
。后台具体执行命令如下:
python predict.py
-
predict.py输入:预测脚本应接收模型路径和数据路径,请自行处理predict.py中的数据和模型读取逻辑,保证平台执行
python predict.py
可正确预测。(平台会自动将测试图片test文件夹,放在submission路径下,选手无需提交) -
predict.py输出:预测结果需保存到result.txt文件,包含图片路径和预测结果,二者以 ‘\t’ 间隔:
test/mg_crop_xxxxxx.jpg Time flies by.
其中 img_path
必须遵循上述目录结构。
- ACC值:平台根据
predict.py
运行得到的预测结果计算ACC值。
二、线上赛基本配置延申
1.数据清洗与增强
数据清洗方面,我的任务包括识别并删除数据集中存在的噪声和错误,确保输入的数据质量。
在数据增强方面,打算通过多种手段扩充训练数据集,以提高OCR模型的泛化能力。具体措施包括但不限于:图像旋转、缩放、平移、色彩调整、加入噪声等。这些技术将帮助模型更好地适应不同的输入图像,提高其识别准确度。
对应数据集:
可以发现手写体居多,后面也有各类印刷体
2.数据清洗方法
1. 去噪(使用高斯模糊)
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_your_image.jpg')
# 高斯模糊去噪
denoised_image = cv2.GaussianBlur(image, (5, 5), 0)
# 保存或显示图像
cv2.imwrite('denoised_image.jpg', denoised_image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 去除图像边框
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)
# 二值化图像
_, binary_image = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY_INV)
# 查找轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算边界框
x, y, w, h = cv2.boundingRect(contours[0])
# 裁剪图像
cropped_image = image[y:y+h, x:x+w]
# 保存或显示图像
cv2.imwrite('cropped_image.jpg', cropped_image)
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.调整图像大小
import cv2
# 读取图像
image = cv2.imread('path_to_your_image.jpg')
# 调整图像大小
resized_image = cv2.resize(image, (800, 600)) # 调整为800x600
# 保存或显示图像
cv2.imwrite('resized_image.jpg', resized_image)
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.灰度化处理
import cv2
# 读取图像
image = cv2.imread('path_to_your_image.jpg')
# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 保存或显示图像
cv2.imwrite('gray_image.jpg', gray_image)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 异常检测与处理(例如:检查并删除低质量图像)
import cv2
import os
# 设置图像文件夹路径
image_folder = 'path_to_your_image_folder'
# 设置质量阈值
quality_threshold = 100 # 根据需求调整
# 遍历文件夹中的所有图像
for filename in os.listdir(image_folder):
image_path = os.path.join(image_folder, filename)
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 计算图像的质量指标(如方差)
if image is not None:
variance = cv2.Laplacian(image, cv2.CV_64F).var()
# 删除低质量图像
if variance < quality_threshold:
os.remove(image_path)
print(f'Removed low quality image: {filename}')
print('Data cleaning completed.')
图像清洗过后,我们还需要对原始数据打标签,目前小组内正在分工进行。
推荐一个好用的工具(目前正在研究):
另外数据清洗完的标注工作目前还在进行~