一、步骤
- 上传你的视频,重命名为in.mp4,将视频进行切割操作。
- 将切割好的图片进行文字识别。
- 将识别好的文字全部放入out.txt文件当中。
二、实现技术
chinese_ocr_db_crnn_server
- 类别图像 - 文字识别
- 网络Differentiable Binarization+CRNN
- 数据集icdar2015数据集
chinese_ocr_db_crnn_server Module用于识别图片当中的汉字。其基于chinese_text_detection_db_server检测得到的文本框,继续识别文本框中的中文文字。识别文字算法采用CRNN(Convolutional Recurrent Neural Network)即卷积递归神经网络。其是DCNN和RNN的组合,专门用于识别图像中的序列式对象。与CTC loss配合使用,进行文字识别,可以直接从文本词级或行级的标注中学习,不需要详细的字符级的标注。该Module是一个通用的OCR模型,支持直接预测。
该Module依赖于第三方库shapely和pyclipper,使用该Module之前,请先安装shapely和pyclipper。
- paddlepaddle >= 1.7.2
- paddlehub >= 1.6.0
- shapely
- pyclipper
三、实现过程
1.安装依赖
环境自带的paddle以及paddlehub版本足够支持本模型运行,因此不升级版本
!pip install shapely
!pip install pyclipper
2.安装模型
安装chinese_ocr_db_crnn_server模型,后续进行使用
!hub install chinese_ocr_db_crnn_server
3.创建文件
创建我们需要的文件以及文件夹并进行判断,以防大家在文件存在的时候报错
import os
path = './images/'; # 将视频切割为图片存放的路径
txtpath = './out.txt' # 指定生成字幕后保存的文件
if os.path.exists(path):
print('文件夹已经存在')
else:
os.mkdir(path) #不存在即创建
print('创建成功')
if os.path.exists(txtpath):
print('文件已经存在')
else:
os.mknod(txtpath) #不存在即创建
print('文件创建成功')
4.视频处理
将视频按帧进行处理,并保存到path指定的文件夹中
#视频按帧处理读取图片
import cv2
vc = cv2.VideoCapture(r'./in.mp4') # 读入视频文件,命名cv
n = 1 # 计数
if vc.isOpened(): # 判断是否正常打开
rval, frame = vc.read()
else:
rval = False
timeF = 10 # 视频帧计数间隔频率
i = 0
while rval: # 循环读取视频帧
rval, frame = vc.read()
if (n % timeF == 0): # 每隔timeF帧进行存储操作
i += 1
cv2.imwrite(r''+path+'{}.jpg'.format(i), frame) # 存储为图像
n = n + 1
cv2.waitKey(1)
vc.release()
5.字幕提取
将切割好的图片进行文字识别以及将文字保存到txtpath指定的txt中(这里提取的是全部的文字,如果只想提取字幕的话可以设置一个区域进行提取)
当预测的图片中没有文字的时候,返回值为空,所以需要进行判断(注意)
import paddlehub as hub
import cv2
data = os.listdir(path) #读取保存图片的文件夹
ocr = hub.Module(name="chinese_ocr_db_crnn_server") #加载模型
txt = open(txtpath,mode='w')
for file in data: #进行遍历
result = ocr.recognize_text(paths=['./images/'+file],use_gpu=False,output_dir='ocr_result',visualization=True) #预测并输出我们的预测结果
lujing = result[0]['save_path'] #保存图片的路径
if lujing != "": # 当里边没有文字的时候,返回的为空
os.rename(lujing,'./ocr_result/'+file) #生成的图片重命名(ocr_result/ndarray_1598175427.8176346.jpg,还未找到如何自定义名称)
text = result[0]['data']
txt.write('-----'+file+'-----\n') #给每张图片做一个分隔符
for file in text: #进行遍历
name = file['text']
txt.write(name+'\n')
print("全部预测完毕,请查看你的预测图片以及文字txt")
txt.close()
【本文fork自百度-飞桨Studio-星河社区】