如何使用深度学习进行药物标签提取——PaddleOCR模型

432 阅读6分钟

利用深度学习提取药物标签

光学字符识别(OCR)使用光学技术将可读文本提取为机器编码的文本。大量处理纸质表格的公司都使用OCR来提取文件中的文本。

将尖端技术应用于现代问题,使医疗保健领域的各种问题得到解决,从而改善人们的生活。

机器学习已被用于医院,在疾病识别和诊断、机器人手术和医学影像诊断方面更快地识别病人。

医疗保健中一个值得关注的领域还没有被大量探索,那就是药物标签提取。光学字符识别(OCR)使用光学技术将可读文本提取为机器编码的文本。

OCR已经被用于谷歌的视觉翻译服务上。最近,大多数提供PDF服务的公司,如Adobe,也在其应用程序上提供这一功能。

我们将使用OCR,使我们能够从处方药中自动提取药物标签/文本。

前提条件

要理解本教程,你需要以下条件。

  • 安装有Google Colab或Jupyter Notebook。
  • 你需要熟悉机器学习。
  • 你需要安装Python和PaddleOCR。

为了进行我们的药物标签提取,我们需要执行三个关键的事情。

  1. 安装并导入我们的依赖项。
  2. 实例化模型和检测。
  3. 将结果可视化。

安装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的两张图片。

Drug1

Drug2

让我们用以下命令来设置它。

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.ttfttf 是我们用于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)

让我们看一下结果。这是我们之前的同一张图片。我们可以看到,它已经提取了文本并在其周围画出了边界框。

Output image using PaddleOCR

收尾工作

PaddleOCR模型的一个关键特征是它的快速性。我们还注意到,只需几行代码,我们就可以从处方药中提取标签。很神奇,对吗?

简而言之,本教程向你展示了如何使用OCR从药品标签中提取文本。你的图像的大小和质量将大大影响你的结果。

远程运行这个合作项目可能会给你一个错误,因为你不能远程使用我的图像路径。你可以将你选择的图像导入你的合作项目,或者你可以在本地执行任务以规避这个错误。