利用深度学习提取药物标签
光学字符识别(OCR)使用光学技术将可读文本提取为机器编码的文本。大量处理纸质表格的公司都使用OCR来提取文件中的文本。
将尖端技术应用于现代问题,使医疗保健领域的各种问题得到解决,从而改善人们的生活。
机器学习已被用于医院,在疾病识别和诊断、机器人手术和医学影像诊断方面更快地识别病人。
医疗保健中一个值得关注的领域还没有被大量探索,那就是药物标签提取。光学字符识别(OCR)使用光学技术将可读文本提取为机器编码的文本。
OCR已经被用于谷歌的视觉翻译服务上。最近,大多数提供PDF服务的公司,如Adobe,也在其应用程序上提供这一功能。
我们将使用OCR,使我们能够从处方药中自动提取药物标签/文本。
前提条件
要理解本教程,你需要以下条件。
- 安装有Google Colab或Jupyter Notebook。
- 你需要熟悉机器学习。
- 你需要安装Python和PaddleOCR。
为了进行我们的药物标签提取,我们需要执行三个关键的事情。
- 安装并导入我们的依赖项。
- 实例化模型和检测。
- 将结果可视化。
安装PaddleOCR for Python
我们首先在Colab或本地打开一个Jupyter笔记本,并安装所需的库。我们要安装的依赖是PaddleOCR。
前往Paddle OCR的Github[页面]。
在Tutorial 部分,导航到installation 子部分。
安装过程有两个部分。首先,你必须安装paddlepaddle ,它是PaddleOCR模型背后的底层框架。其次,我们要去安装paddleOCR 。
PaddleOCR模型可以在GPU和CPU上运行。GPU通常是首选,因为其内存带宽更大。
如果你有一台支持GPU的机器,使用以下命令来安装PaddleOCR。
!python3 -m pip install paddlepaddle-gpu==2.0.0 -i https://mirror.baidu.com/pypi/simple
如果你有一台支持CPU的机器,使用下面的命令来安装PaddleOCR。
!python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple
如果你在安装时碰巧遇到错误,那是因为你还没有安装
pip命令。要安装它,请使用命令,pip3 install --upgrade pip。另外,由于我们要在笔记本上安装它,所以我们必须在安装命令前加上感叹号!。
让我们通过快速的pip安装来安装PaddleOCR,使用以下命令。
pip install paddleocr
如果你克隆了Github上的PaddleOCR repo,那就最好了。
!git clone https://github.com/PaddlePaddle/PaddleOCR
这个克隆很关键,因为当我们在最后一步可视化我们的结果时,它将使我们能够查询特定的字体。
现在我们已经安装了我们的依赖项,让我们把它们导入我们的笔记本/实验室。
from paddleocr import PaddleOCR, draw_ocr
from matplotlib import pyplot as plt
import cv2
import os
paddleocr是我们主要的OCR依赖项matplotlib允许我们绘制图像cv2允许我们使用OpenCV库os允许文件夹目录导航
将PaddleOCR模型应用于图像
现在,让我们把PaddleOCR应用到我们的图像上。
这是我们要应用PaddleOCR的两张图片。


让我们用以下命令来设置它。
ocr_model = PaddleOCR(lang='en')
这个命令指定了选择的语言。在我们的案例中,我们将其设置为英语。由于PaddleOCR是由百度的工程师制作的,所以它也能识别汉字。你可以选择你的语言为中文或任何其他支持的语言。
下面的命令设置了我们的图像在机器上的路径。
img_path = os.path.join('.', 'drug1.jpg')
让我们在ocr_model ,运行OCR方法,进行一些检测。我们可以将结果存储在一个称为result.
result = ocr_model.ocr(img_path)
运行上面的命令可以得到输出结果。
[[[[114.0, 39.0], [265.0, 5.0], [273.0, 39.0], [121.0, 72.0]],
('Generio', 0.9429093)],
[[[422.0, 99.0], [464.0, 89.0], [469.0, 113.0], [428.0, 122.0]],
('1', 0.5031448)],
[[[135.0, 118.0], [457.0, 40.0], [467.0, 80.0], [144.0, 158.0]],
('TO APPOINTME', 0.9501941)],
[[[302.0, 124.0], [433.0, 94.0], [442.0, 132.0], [311.0, 163.0]],
('THEN', 0.9947262)],
[[[146.0, 166.0], [323.0, 122.0], [332.0, 160.0], [155.0, 203.0]],
('ONLY.', 0.9750903)],
[[[154.0, 204.0], [455.0, 127.0], [468.0, 175.0], [167.0, 253.0]],
('TWICEDAILY', 0.99549305)]]
使用type(result) 命令,我们发现这些结果存储在一个列表中。我们可以使用标准的列表索引来获取结果。
为了抓取所有的文本,让我们在结果变量中循环,挑选第一个索引是文本的。下面的命令将只打印出文本。
for res in result:
print(res[1][0])
输出。
Generio
1
TO APPOINTME
THEN
ONLY.
TWICEDAILY
上面的几行代码使我们能够快速提取药瓶/胶囊中的药物标签。
请注意,我们在这个例子中使用的是
drug1.jpg。你可以玩玩代码,使用drug2.jpg,看看结果如何。
使用PaddleOCR提取处方药标签
这一步涉及到对结果的可视化。draw_ocr 方法,opencv ,和matplotlib 库帮助我们实现这个目标。
让我们把盒子、分数和文本坐标提取到单独的变量中。然后我们把这些坐标传给draw_ocr 方法。
如果你曾经执行过这样的任务,这个过程感觉类似于物体检测。boxes 变量进行循环,抓取我们的result 变量中的第一个索引,texts 变量抓取第二个索引,scores 抓取第三个索引。
boxes = [res[0] for res in result]
texts = [res[1][0] for res in result]
scores = [res[1][1] for res in result]
下一步涉及为我们的draw_ocr 方法指定字体路径。这就是为什么我在教程的前面提到,你需要克隆PaddleOCR Github仓库。
为了使用draw_ocr 方法,我们需要为特定字体定义一个路径。在下载的repo里面,按照下面显示的那个路径,你会在一个文件夹里面找到不同的字体。对于我们的情况,latin.ttf 。ttf 是我们用于True Type Font 的字体格式。
我们通过发出以下命令来完成这个工作。
font_path = os.path.join('PaddleOCR', 'doc', 'fonts', 'latin.ttf')
现在让我们用OpenCV加载我们的图像。我们使用OpenCV的imread() 方法来读入我们的图像。
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
命令cv2.COLOR_BGR2RGB ,重新排列颜色通道的顺序。默认情况下,OpenCV以BGR形式导入图像。
最后一步是将我们的图像和检测结果可视化。
使用matplotlib,让我们首先调整我们的显示区域大小。
plt.figure(figsize=(15,15))
然后我们使用draw_ocr 方法在图像上画出注释。
annotated = draw_ocr(img, boxes, texts, scores, font_path=font_path)
最后,我们使用matplotlib的imshow() 方法来使图像可视化。
plt.imshow(annotated)
让我们看一下结果。这是我们之前的同一张图片。我们可以看到,它已经提取了文本并在其周围画出了边界框。

收尾工作
PaddleOCR模型的一个关键特征是它的快速性。我们还注意到,只需几行代码,我们就可以从处方药中提取标签。很神奇,对吗?
简而言之,本教程向你展示了如何使用OCR从药品标签中提取文本。你的图像的大小和质量将大大影响你的结果。
远程运行这个合作项目可能会给你一个错误,因为你不能远程使用我的图像路径。你可以将你选择的图像导入你的合作项目,或者你可以在本地执行任务以规避这个错误。