在上一篇文章的“如何实现DICOMweb?"部分,提到了有一套Python版本的DICOMweb服务器端开源代码,NeurDICOM。这里书接上文,对这个开源框架做一个介绍。包括这个框架的定位、功能、框架、实现,以及有哪些值得参考借鉴的。
轻量级DICOMweb服务器
NeurDICOM是一个轻量级的DICOMweb服务器,代码完全开源,Github网址:https://github.com/reactmed/neurdicom。框架的开发初衷是用于支持机器学习和神经网络在医学影像领域的应用。使用者可以采用这个框架,集中存储和管理大批量影像,通过互联网进行影像的查询、获取和上传,并且能够集成调用自己开发的影像分析与处理扩展插件。
这篇文章只介绍NeurDICOM框架是如何实现和提供DICOMweb标准接口服务的。
提供最常用的“增删改查”功能
NeurDICOM作为服务器,对外提供DICOMweb服务,包括QIDO-RS,WADO-RS,STOW-RS。具体来说,NeurDICOM在患者(Patient)、检查(Study)、序列(Series)和实例(Instance)四个级别的对象上,提供查询、获取、上传(更新)和删除服务。简单来说,就是通过RESTful接口,面向互联网,提供DICOM对象的增删改查服务。
Instance大家可能不熟悉,可以简单理解为Image。当然,严格来说Instance还包含了图像以外的其他文件。
开源软件4件套
NeurDICOM基于4个非常具有代表性的开源软件搭建。包括,1)采用Django作为框架;2)通过Tornado提供非阻塞网络I/O服务;3)借助Django REST framework来简化和提速RESTful接口开发;4)底层使用PostgreSQL存储DICOM文件索引信息。
此外,还使用了pydicom来解析DICOM文件,使用pynetdicom来进行DICOM通讯。
PostgreSQL负责DICOM信息存储与索引
PostgreSQL是一个开源免费关系型数据库,可以看做是MySQL之外的另一个选择。NeurDICOM对PostgreSQL的使用简单明了,就是建立了Patients、Studies、Series和Instances这4个核心表格,分别存储从导入的DICOM文件中解析出来的DICOM头文件信息。每个表格中的字段也基本是包括且仅包括DICOM信息中包含的,同时又是DICOMweb接口需要的基础信息项。例如,Patiets表的ID、姓名、性别、年龄、出生日期字段;Study表的UID、ID、检查日期、检查描述,以及用于和Patient表关联的patient_ID字段。Series和Instances表格与此类似。
Django框架负责后台影像管理
Django是一个重量级Python开源Web Server开发框架。突出优势在于:功能完善且丰富,提供了ORM(Object-Relation-Model)框架,以及丰富的后台管理功能。
NeurDICOM恰恰重度使用Django框架的上述两个特点。首先,建立了Patient、Study、Series和Instance Model,与PostgreSQL数据库中的相应表格对应;其次,使用Django的后台管理,也就是manage.py文件,来完成包括DICOM文件批量导入在内的后台影像管理功能。例如,通过如下示例代码,导入"images"文件夹下的所有DICOM影像。
python ./manage.py store_dicom ./images
对于导入的DICOM影像,其DICOM头文件信息将按级别分类存储到前述PostgreSQL表格中,DICOM文件本身将集中存储在一个指定的文件夹目录下,缺省为代码根目录下的“media”目录。在media目录下,所有DICOM文件不再划分目录,直接存储在根目录下。Windows平台用户需要注意,如果一个文件夹下存储文件过多,会导致这个文件夹打开非常慢,几乎不可操作。也是因为这个原因,NeurDICOM在Windows平台上,不适合管理大规模的影像数据。
Tornado提供高效异步IO
Tornado是一个轻量级Python开源Web Server开发框架。特点和优势在于提供异步非阻塞IO处理,具备出色的抗负载能力和优异的处理性能,不依赖多进程/多线程。这也应该是作者选择Tornado来提供DICOMweb接口服务的主要原因吧。
此外,Tornado还有一个优点,全面支持WSGI,可以与其他支持WSGI的web框架和HTTP服务器集成,搭档工作。也正是基于这一点