Há este programa mri_synthstrip que insere um arquivo de ressonância magnética cerebral e produz o mesmo arquivo de ressonância magnética cerebral excluindo o crânio. Este é um passo inicial básico para pré-processar ressonâncias magnéticas cerebrais para pesquisa.
O programa é maravilhoso e a sintaxe para remover a pele do crânio de uma única ressonância magnética é simples se você instalar o programa no seu computador:
mri_synthstrip -i input.nii.gz -o stripped.nii.gz
Os autores são muito simpáticos e até criaram uma imagem Docker que você pode extrair do Dockerhub com docker pull freesurfer/synthstrip
nesse caso a sintaxe para retirar o crânio de uma ressonância magnética do cérebro é
docker run -v C:/Users/ch134560/Desktop/MRI_files://data freesurfer/synthstrip -i //data/input.nii.gz -o //data/stripped.nii.gz
O que estou tentando fazer é criar uma imagem Docker que rode todos os arquivos MRI em um diretório e faça skull strips com synthstrip. Achei que isso seria fácil.
Meu Dockerfile multiestágio se parece com isso, mas não funciona porque não reconhece o comando no loop
freesurfer/synthstrip -i "$file" -o "$file"
ou
mri_synthstrip -i "$file" -o "$file"
Acho que não sei como chamar um comando específico dentro de um loop Unix.
#########STAGE 1: CREATE THE MOUNT AND COPY THE MRIs TO BE SKULL-STRIPPED#########
# Use ubuntu as base image
FROM ubuntu AS prepare
# Set working directory
WORKDIR /app
# Copy all MRIs
COPY . .
#########STAGE 2: USE SYNTHSTRIP#########
FROM freesurfer/synthstrip
# Set working directory
WORKDIR /app
# Copy all MRIs
COPY --from=prepare . .
# Create a loop that runs through the MRIs
RUN for file in .; do freesurfer/synthstrip -i "$file" -o "$file"; done
ENTRYPOINT ["ls"]
Outra opção que pensei é criar uma compilação de vários estágios na qual primeiro importo o programa synthstrip e depois faço um loop pelos arquivos MRI e chamo o synthstrip, mas, novamente, não sei exatamente como chamar o comando para executar o synthstrip a partir do python.
Arquivo Docker
#########STAGE 1: CREATE THE SYNTHSTRIP CONTAINER###########
# Use synthstrip AS base image
FROM freesurfer/synthstrip as builder
# Set working directory
WORKDIR /app
#########STAGE 2: CREATE THE ANACONDA CONTAINER###########
# Use miniconda as base image
FROM continuumio/miniconda3
# Set working directory
WORKDIR /app
# Copy the initial image
COPY --from=builder . .
# Create the environment
COPY environment.yml .
RUN conda env create -f environment.yml
# Make run commands use the new environment
SHELL ["conda", "run", "-n", "app", "bin/bash", "-c"]
# Code to run when the container is started
COPY main.py .
ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "app", "python", "main.py"]
arquivo main.py
import os
import subprocess
for MRI in os.listdir('./file_with_MRIs'):
print(MRI)
proc = subprocess.Popen(['docker run freesurfer/synthstrip -i ', MRI, ' -o', MRI],
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE
)
(out, err) = proc.communicate()
print (out)
Outra opção é criar uma imagem Docker menor que percorra os arquivos MRI e apenas chame a imagem Docker do synthstrip para cada um deles e colete a saída, mas não tenho certeza de como fazer isso.