Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Detecting tuberculosis from X-ray scan using pytorch

License

NotificationsYou must be signed in to change notification settings

udion/XTBTorch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Detecting tuberculosis from X-ray scan using pytorch

Requirements

pytorch 1.0+scikit-learnmatplotlibjupyter notebook

Introduction

Dataset is obtained fromhere which consisted of2 differnet set of scans, ChinaSet and Montgomery.

  • ChinaSet consists of 662 scans (including positive and negative cases of TB)
  • Montogomery consists of 138 scans (including positive and negative cases of TB)

In total there are800 scans with394 positive cases and406 negative cases

I randomly picked680 scans (85%) for training and120 scans (15%) for testing.

Preprocessing of dataset

Each of the scan in training set is randomly rotated, translated, and horizontally flipped to perform the augmentation.No augmentation was performed on testing set. All the scans and their augmented versions for training are present indata/train and test dataset is present indata/test

Preprocessing notebook can be found atsrc/Xray_DatasetPreprocess.ipynb

Some examples of positive scan and it's augmented version:

Some examples of negative scan and it's augmented version:

Note that all the scans are saved as 128x128 grayscale image as the original scans had much larger dimensions making it harder to train on personal computer with not so awesome GPU

Model and Training

I modifiedresnet18 architecture (calling itXrayResnet) from pytorch's model library. I appended aconv2d layer at beginning of the network to conver the single channel image to 3 channel image. and the finalaverage 2d pool andLinear layers were changed to fit the binary classificaion problem.

The training and testing loop can be found atsrc/Xray_trainloop.ipynb

XrayResnet description

XrayResnet(  (C1): Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (model_ft): ResNet(    (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)    (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)    (relu): ReLU(inplace)    (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)    (layer1): Sequential(      (0): BasicBlock(        (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)      )      (1): BasicBlock(        (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)      )    )    (layer2): Sequential(      (0): BasicBlock(        (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (downsample): Sequential(          (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)          (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        )      )      (1): BasicBlock(        (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)      )    )    (layer3): Sequential(      (0): BasicBlock(        (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (downsample): Sequential(          (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)          (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        )      )      (1): BasicBlock(        (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)      )    )    (layer4): Sequential(      (0): BasicBlock(        (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (downsample): Sequential(          (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)          (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        )      )      (1): BasicBlock(        (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)        (relu): ReLU(inplace)        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)      )    )    (avgpool): AvgPool2d(kernel_size=4, stride=2, padding=0)    (fc): Sequential(      (0): Linear(in_features=512, out_features=256, bias=True)      (1): Linear(in_features=256, out_features=2, bias=True)    )  ))

Results

Training curves:

Confidence report:

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp