# film-poster-genres

> Predicting film genres from their posters with Tensorflow.js

The example code & slide deck for a talk I gave on getting started with AI. A link to the unlisted YouTube video is available upon request (because it contains my face, and this is a public repo) - see [my website](https://starbeamrainbowlabs.com/) for ways to get in touch.

This is the `post-talk-improvements` branch, which contains a number of adjustments and changes to this codebase. These changes improve the model, but make it more complex to understand and hence are kept in a separate branch to allow regular users to look at the simpler / easier to understand codebase.


## Dataset
The dataset used with this demo can be found here:

https://nextcloud.starbeamrainbowlabs.com/index.php/s/wmCdL4tX3HHGAFD

The format is as follows:

```
+ dataset_dir/
	+ categories.txt
	+ train/
		+ 1234,Comedy,Fantasy.jpg
		+ 4321,Western,Short,Drama.jpg
		+ .....
	+ validate/
		+ 6789,Drama,Mystery,Thriller.jpg
		+ 9876,History,Documentary,Animation.jpg
		+ .....
```

The filenames of the images take the following format: `ID,GENRE_1,GENRE_2,GENRE_N.jpg`.

The `categories.txt` file should contain 1 category name per line (the order matters, as the line numbers - starting from 0 - are used as the numerical ids when training the model).


## System / User Requirements
 - [Node.js](https://nodejs.org/)
 - [NPM](https://www.npmjs.com/) (installed by default with Node.js)
 - A relatively decent CPU
 - Basic knowledge of the command-line / terminal

 
## Installation
First, clone this git repo:

```bash
git clone https://git.starbeamrainbowlabs.com/Demos/film-poster-genres.git
cd film-poster-genres
```

Then, install the dependencies:

```bash
npm install
```

## Usage

### Training
To train a new model:

```bash
node src/index.mjs train --input path/to/dataset_dir --output path/to/output_dir
```

The output directory will look like this:

```
 + output_dir/
	+ metrics.stream.json
	+ checkpoints/
		+ 0/
		+ 1/
		+ 2/
		+ 3/
```


## Predicting
To make a prediction using an existing model:

```bash
node src/index.mjs predict --input path/to/image.jpg --ai-model path/to/checkpoint_dir/
```

The result will be written to the standard output. Extra debugging data is written to the standard error, but this can be ignored.


## Contributing
Contributions are very welcome! Git patches are preferred - I can move this repo to GitHub if that makes it easier. Please mention in your contribution that you release your work under the MPL-2.0 (see below).


## Licence
This code is released under the Mozilla Public License 2.0. The full license text is included in the `LICENSE` file in this repository. Tldr legal have a [great summary](https://tldrlegal.com/license/mozilla-public-license-2.0-(mpl-2)) of the license if you're interested.
