Category: DICOM

  • Orthanc

    최근 버전 업그레이드 됨에 따라서 원격 접속이 매우 제한된 것 같다. HTTPS를 지원하지 못하면 원격 접속을 이용할 수 없게 된다. Orthanc 에서는 리버스 프록시와 자체적으로 지원하는데 자체적으로 지원하는 방법을 이용을 아무리 해봐도 안되었다. 그래서 익숙한 nginx 를 이용하여 리버스 프록시로 구현하였다.

    Web 화면보다는 Rest API가 더 중요하기 때문이 이를 이용할 수 있도록 설정을 하는 것을 목표로 했다.

    늘 하듯이 도커 이미지를 이용하여 컨테이너를 생성하고 orthanc와 필요한 패키지들을 설치한다. Orthanc 도움말을 보면 성능을 위해서는 SQLite가 아닌 MySQL이나 PostgreSQL을 이용하라고 한다. PostgreSQL을 좋아하기 때문에 이를 이용하기 위해서 설치한다.

    sudo docker run -it -p 8042:8042 -p 4242:4242 -p 443:443 --name orthanc --restart always -v /home/ysrcc/ext:/root/OrthancStorage debian
    
    echo 'Acquire::http::Proxy "http://rcc.work:3142";' > /etc/apt/apt.conf
    rm -rf /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime 
    apt -y update && apt -y upgrade
    
    apt -y install locales
    sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen
    locale-gen
    
    apt -y install orthanc orthanc-postgresql \
            procps nano ftp curl postgresql nginx sudo

    웹 접속에서는 문제가 생기지 않는데 curl 명령어를 이용할 경우 주소가 일치하지 않으면 인증서와 관련된 오류가 생긴다. -k 를 이용하여 검증을 안함으로 해도 되기는 하지만, 정석대로 인증서를 이용하는 것을 전제로 한다.

    인증서는 다음과 같이 생성한다.

    openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /tmp/private.key -out /tmp/certificate.crt -subj "/CN=10.10.10.171"
    cat /tmp/private.key /tmp/certificate.crt > /tmp/certificate.pem

    /etc/orthanc/orthanc.json 에서 다음의 내용을 수정한다. 리버스 프록시를 이용하여 접속을 할 것이기 때문에 설정을 건드릴 부분이 별로 없다.

    "StorageDirectory" : "/root/OrthancStorage",
    ...
    "DefaultEncoding" : "Korean",
    
    or
    
    sed -i 's/Latin1/Korean/g' /etc/orthanc/orthanc.json

    /etc/orthanc/postgresql.json 파일에서 다음을 수정한다. username과 password 부분을 수정한다.

    "EnableIndex" : true,
    "Username" : "postgres",
    "Password" : "postgres",

    설정을 했으면 PostgreSQL 에서도 수정해야 한다는 것을 알 수 있다.

    $ service postgresql start
    $ sudo -u postgres psql
    # \password postgres
    # create database orthanc_db;
    # \q

    nginx.conf 파일에서 gzip off로 설정한다. 미리 작성한 파일을 가져와도 된다.

    http {
          ...
          gzip off;
          ...
    }
    
    or
    
    curl -s http://rcc.work:3143/nginx_orthanc.conf > /etc/nginx/nginx.conf

    /etc/nginx/sites-available/default 를 다음과 같이 수정한다.

    server {
            listen 80 default_server;
            listen [::]:80 default_server;
    
            listen 443 ssl default_server;
            listen [::]:443 ssl default_server;
            ssl_certificate /tmp/certificate.crt;
            ssl_certificate_key /tmp/private.key;
            ssl_protocols TLSv1.3;
            ssl_prefer_server_ciphers on;
            ssl_ciphers "TLS-AES-128-GCM-SHA256:ECDHE-RSA-AES128-SHA256";
    
            root /var/www/blog;
    
            index index.html index.htm index.nginx-debian.html;
    
            server_name _;
    
            location / {
                    proxy_pass http://localhost:8042;
                    proxy_set_header HOST $host;
                    proxy_set_header X-Real-IP $remote_addr;
            }
    
    or
    
    curl -s http://rcc.work:3143/default_orthanc > /etc/nginx/sites-available/default

    컨테이너가 예기치 않게 종료될 수 있으므로 .bashrc 에 다음을 추가해서 실행시에 문제가 없도록 한다.

    echo "cd /root" >> /root/.bashrc
    echo "service postgresql start" >> /root/.bashrc
    echo "service nginx start" >> /root/.bashrc
    echo "Orthanc /etc/orthanc/ &" >> /root/.bashrc
  • Orthanc 기본 api 이용하기

    연구용 PACS에 이미지를 몽땅 넣었으니 이제 원하는 이미지 만을 선정하는 작업을 해야한다. 기본적으로 익명화 처리된 키 값을 가지고 있기 때문에 관련 정보에서 이 정보를 찾아서 다시 정리를 해야한다. 결과는 JSON 포맷으로 나오기 때문에 이에 맞춰서 설정을 하면 된다. ID/PW를 alice/alice롤 했기 때문에 auth는 같은 식으로 지정한다.

    import requests
    import json
    
    r = requests.get("주소:8042/patients", auth=("alice", "alice"))
    patients_list = json.loads(r.text)

    첫 번째 목록에 해당하는 환자 번호를 찾기 위해서는 한 번 실행한다.

    r = requests.get
    ("주소:8042/patients/"+patients_list[0], auth=("alice", "alice"))
    r = json.loads(r.text)

    우리 자료를 기준으로는 MainDicomTags 하위의 PatientID 항목에 있음을 알 수 있다. 이 자료를 선택하기 위해서는 다음과 같이 한다.

    patient_id = r['MainDicomTags']['PatientID']
    patients_studies = r['Studies']

    이 환자가 시행 받은 영상 정보들은 Studies 항목에 있다. 각각에 대하여 어떤 검사인지 알기 위하여 다시 정보를 요청한다. 그러면 ‘Series’ 항목에 목록이 생성된다. 그리고 Series를 다시 조회하면 검사 modality를 알 수 있고, 이 modality 에 해당하는 이미지 파일은 instances 항목으로 확인할 수 있다.

  • Orthanc DICOM 서버

    필요에 의해서 DICOM 서버를 구축해야 했다. 필요한 이유는 많은 PACS 이미지를 전송 받아서 분석에 이용하기 위해서는 DICOM 포맷으로만 가능하다고 한다. 이게 단순히 dcm 파일로만 전송해 줄 수 있다는 것이 아니다. DICOM 이라는 규격을 준수하면 파일을 주고 받을 수 있다는 것이다. 즉, DICOM 서버가 필요하다는 소리이다. 인터넷 검색을 통하여 몇 개를 찾을 수 있었는데, 그 중에서 Orthanc 가 Rest API도 지원이 되고, 오픈 소스이기 때문에 사용을 해보았다.

    처음에는 Docker에서 진행하여 보았다. 홈페이지에서도 도커를 언급하고 있으므로, 안되는 것은 아니다. 다만, 완전 초보인 경우에는 설정 파일을 수정하기 전까지는 localhost의 web에서 접속을 함으로써 성공 여부를 평가할 수 있다. 급한 것은 아니나 프로그램에 익숙해 진 이후에 하면 되는 것이라서 이럴 때마다 희생되는 나의 옛 데탑 PC에 Ubuntu Desktop을 설치한 이후에 프로그램을 실행하였다.

    Debian이나 Ubuntu repository에 등록된 프로그램이기 때문에 설치는 간단하다. 일단은 관련 플러그인도 다 설치하여 보았다.

    $ sudo apt install orthanc orthanc-*

    기본 설정으로 DICOM 포트는 4242이며, web이나 rest api 포트는 8042이다. 병원 PACS에서 파일 전송을 위한 SCP 등록을 위해서 업체 관리자에게 부탁해서 등록을 했다. 알려주어야 하는 것은 이름(title), IP, 포트이다. 이렇게 등록이 되면 PACS에서 send 를 클릭하는 것으로 한 방에 보낼 수 있다.

    기본 설치를 하게 되면 /usr/sbin 에 Orthanc라는 실행 파일이 설치가 된다. 그리고 이는 /etc/init.d/orthanc 라는 스크립트에 의하여 관리가 된다. 상태를 보면 다음과 같다.

    $ sudo systemctl status orthanc
    ...
    CGroup: /system.slice/orthanc.service
             /usr/sbin/Orthanc --logdir=/var/log/orthanc /etc/orthanc/

    Orthanc는 JSON 포맷으로 설정을 관리한다. 그리고 특정 파일을 지정할 수 있다. 폴더를 지정하면 폴더 내의 모든 파일을 합하여 인식이 된다고 한다. 즉, /etc/orthanc/ 에 있는 파일이 설정 파일이다. localhost 이외의 컴퓨터에서 접속을 하기 위해서는 /etc/orthanc/orthanc.json 파일을 수정해야 한다. 기본 설정인 상태에서 다음의 부분을 수정한다. 설정 파일에 보면 나와 있지만 사용자 계정과 비밀번호는 plain text로 저장이 되므로, 그냥 예시에서 주석을 해제하여 이용하였다. 그리고 서비스를 재시작하면 다른 PC에서도 접속할 수 있다.

    ...
    "RemoteAccessAllowed" : true,
    ...
    "AuthenticationEnabled" : true,
    ...
    "RegisteredUsers": {
    "ID": "PW"
    }