Update inception v3 readme

This commit is contained in:
2024-09-04 21:32:05 +02:00
parent c8bc6f7a39
commit 7b8c4bd811
3 changed files with 56 additions and 10 deletions

View File

@@ -0,0 +1,43 @@
# Inception v3
Inception v3 Inference on CUDANet
## Usage
1. Export pytorch Inception v3 weights pretrained on ImageNet (requires pytorch and torchvision):
```sh
python inception_v3.py
```
2. Follow the instructions from the repository root to build the CUDANet library.
3. Build Inception v3 (requires [OpenCV](https://opencv.org/) for image loading and preprocessing):
```sh
mkdir build
cd build
cmake -S ..
make
```
4. (Optional) Run tests
Generate test input/output and resources by running `inception_blocks.py` in the `test` folder
Build and run tests (requires [Google Test](https://github.com/google/googletest))
```sh
cd build
make test_inception_v3
./tests/test_inception_v3
```
5. Run Inception v3 inference:
```sh
inception_v3 ../inception_v3_weights.bin ../image.jpg
```
## Note on Preprocessing
The image preprocessing in this implementation uses OpenCV, which may produce slightly different results compared to PyTorch's Pillow-based preprocessing due to differences in interpolation methods during resizing.

View File

@@ -4,14 +4,21 @@ import sys
sys.path.append("../../tools") # Ugly hack
from utils import export_model_weights, print_model_parameters, predict
import torch
if __name__ == "__main__":
inception = torchvision.models.inception_v3(
weights = torchvision.models.Inception_V3_Weights.DEFAULT
inception = torchvision.models.inception_v3(
weights=weights,
transform_input=False
)
inception.transform_input = False
inception.eval()
# print_model_parameters(inception) # print layer names and number of parameters
export_model_weights(inception, "inception_v3_weights.bin")
# print(predict(inception, "bird.jpg"))
# class_labels = weights.meta["categories"]
# prediction = predict(inception, "bird.jpg")
# print(prediction, class_labels[prediction])

View File

@@ -35,8 +35,6 @@ def export_model_weights(model: torch.nn.Module, filename):
tensor_data += tensor_bytes
# print(model.named_buffers)
# Add buffers (for running_mean and running_var)
for name, buf in model.named_buffers():
if "running_mean" not in name and "running_var" not in name:
@@ -76,9 +74,7 @@ def predict(model, image_path, resize=299, crop=299, preprocess=None):
)
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(
0
) # create a mini-batch as expected by the model
input_batch = input_tensor.unsqueeze(0)
# move the input and model to GPU for speed if available
if torch.cuda.is_available():
@@ -87,4 +83,4 @@ def predict(model, image_path, resize=299, crop=299, preprocess=None):
with torch.no_grad():
output = model(input_batch)
return torch.argmax(output)
return torch.argmax(output).item()