HomeAll you needChest X-Ray Disease Detection using ChexNet and Flask

Chest X-Ray Disease Detection using ChexNet and Flask

Introduction

ChexNet is a deep learning model designed to detect and diagnose multiple chest diseases from chest X-ray images. In this article, we will walk you through the process of creating a web-based tool using the ChexNet model and Flask web framework. The tool will accept an X-ray image as input and provide a diagnosis of 12 chest diseases.

Section 1: Setting up the environment

To create our ChexNet-based chest disease detection tool, we will be using the following Python libraries:

  1. Flask: A lightweight web framework for serving our web app
  2. Keras: A deep learning library used to load and run the ChexNet model
  3. TensorFlow: A machine learning framework used by Keras for backend processing

Make sure you have these libraries installed in your Python environment. You can install them using pip:

pip install flask keras tensorflow

Section 2: Implementing the ChexNet model

Create a file named chexnet.py and add the following code:

import numpy as np
from keras.models import load_model
from tensorflow.keras.preprocessing import image
from keras.applications.densenet import preprocess_input

class ChexNet:
    def __init__(self, weights_path):
        self.model = load_model(weights_path)

    def predict(self, img_path):
        img = image.load_img(img_path, target_size=(224, 224))
        img = img.convert('RGB')
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis=0)
        x = preprocess_input(x)

        preds = self.model.predict(x)
        return preds[0]

This code defines the ChexNet class, which takes a file path to the model weights as input and loads the model. The predict method accepts an image path, preprocesses the image, and returns the prediction probabilities for each of the 12 chest diseases.

Section 3: Creating the Flask web app

Create a file named app.py and add the following code:

from flask import Flask, render_template, request
from chexnet import ChexNet
import os

app = Flask(__name__)
model = ChexNet('weights.h5')

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        img = request.files.get('image')
        if img:
            img.save('uploaded_image.png')
            diagnosis = model.predict('uploaded_image.png')
            os.remove('uploaded_image.png')
            diagnosis = dict(zip(conditions, diagnosis))
            return render_template('result.html', diagnosis=diagnosis)
    return render_template('index.html')

conditions = [
    'Atelectasis', 'Cardiomegaly', 'Effusion',
    'Infiltration', 'Mass', 'Nodule', 'Pneumonia',
    'Pneumothorax', 'Consolidation', 'Edema',
    'Emphysema', 'Fibrosis', 'Pleural_Thickening', 'Hernia'
]

if __name__ == '__main__':
    app.run(debug=True)

This code sets up a Flask web app that uses the ChexNet model for diagnosis. The app has a single route that accepts GET and POST requests. When a POST request is made with an uploaded image, the app saves the image, obtains a diagnosis using the ChexNet model, and returns the results in a table.

Section 4: Creating the HTML templates

Create a directory named templates and add the following two HTML files:

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Chest X-Ray Diagnosis</title>
    <link rel="stylesheet" href="/static/css/styles.css">
</head>
<body>
    <div class="container">
        <h1>Chest X-Ray Diagnosis</h1>
        <form action="/" method="post" enctype="multipart/form-data">
            <input type="file" name="image" accept="image/*" required>
            <br><br>
            <input type="submit" value="Diagnose">
        </form>
    </div>
</body>
</html>

This is the main page of the web app, where users can upload an X-ray image for diagnosis.

result.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Diagnosis Results</title>
    <link rel="stylesheet" href="/static/css/styles.css">
</head>
<body>
    <div class="container">
        <h1>Diagnosis Results</h1>
        <table>
            <tr>
                <th>Condition</th>
                <th>Probability (%)</th>
            </tr>
            {% for condition, probability in diagnosis.items() %}
            <tr>
                <td>{{ condition }}</td>
                <td>{{ probability }}</td>
            </tr>
            {% endfor %}
        </table>
        <br>
        <a href="/">Try another X-ray</a>
    </div>
</body>
</html>

This template displays the diagnosis results in a table format, with the condition names and their corresponding probabilities.

Section 5: Adding CSS styles

Create a directory named static/css and add a file named styles.css with your desired styles.

Section 6: Running the web app

To run the web app, navigate to the directory containing app.py and execute the following command:

python app.py

This will start the Flask development server, and you can access the web app by opening a browser and navigating to http://127.0.0.1:5000/.

Conclusion

In this article, we have demonstrated how to create a web-based tool for detecting and diagnosing chest diseases from X-ray images using the ChexNet model and Flask web framework. By following the provided code and explanations, you should now be able to create your own chest disease detection tool.

In this article, we have demonstrated how to create a web-based tool for detecting and diagnosing chest diseases from X-ray images using the ChexNet model and Flask web framework. By following the provided code and explanations, you should now be able to create your own chest disease detection tool.

You can find the complete code for this project on GitHub. Feel free to clone the repository, make any necessary adjustments, and deploy your own version of the tool.

 

 

 

RELATED ARTICLES

Most Popular