Hello everyone. In the previous video we started with the flask application. The task for this video is to write an upload image function and additional helper function. And with that we'll be done with our flask application. The upload function will allow a user to upload an image to our site. And we are going to use the image as a query image and get results and show them back to the user as we done in the previous video, right at app dot route, and this time, just upload slash.
Additionally, we will set one more argument here methods equals to in bracket set post everything capital. Because we are working with the rest framework, this post is the way to communicate with our server. With dispose method, our server will expect some data to be uploaded to it. Now let's define the upload function and defined Upload the DIR variable, which will hold a path to the folder where all uploaded files will be saved. Right os.path.to join at root. Then second one is uploads slash.
If we don't have the mentioned folder on the server, the flask will throw an error, and the app will crash. To prevent this from happening in the production, we'll check if your folder exists and create one if it doesn't. So right if not, always.path.is there, apple cider. Then oiz.mk there, upload there. Okay, now we can iterate through all images files from our user post request. To do that, define a for loop and write a request dot files dot get list, and in brackets provide file.
If we use post request in our flask framework, all send files by a user will be saved under this key file. Now access a file name by using IMG dot file name. To save the file to our server, we need to create the destination path for our image. To create one we'll use a simple string join around slash character type slash dot join and in brackets provide a list. The first element will be uploaded there and the second one is IMG name. And save the file by using save method at image object.
Now, now that we have successfully saved all sent images, it's time to perform the inference on it. Defined variable result equals MP dot array, train image paths and to index only the most similar images. We We'll need to get results from simple inference function and use those indices to get paths from the most similar images. Before we proceed, let's remind ourselves what arguments should be provided inference function itself. As you can see, we need to provide model session, train set factors, upload image paths, image, size, and distance. Go back to the app.pi.
And let's provide those arguments. The first thing that we need to provide is the model which we have defined before, then provide the TensorFlow session. The first argument is the train vectors, which we have loaded from the pickle before. The fourth argument for the function is upload image path. To get this we can write OS dot path dot join and provide uploader an image name. With this, we are going to get The last image if there are multiple images uploaded by a user, use our config file to access the image size.
So far we have code that will return paths to closest images based on the on uploaded one. But the thing is all paths are pointing to the data set slash train folder. This was okay in the training process. However, in the inference process, we have set all the training set images to been in static slash images folder. So to access them, we have to change the original path to newly created one. To do this define new variable result file equals when to do list.
Define the loop that iterates for all images in the list for each image append to the result final images slash plus IMG dot split on slash minus one. For example, we if for example, if we have data set slash train slash, zero frog BMG, you will have the list of data set, train, and zero frog BMG, so list with the free elements. And by accessing with minus one, we are going to access only the last element in the list. So in our case, it is the name of a training set image image the upload function return render template result equals HTML. As you may know, we already have result dot html created in our templates folder. This would be enough if we were not trying to show the resulting images back to user to access specific values.
In the render time, we need to provide quarks or keyboard arguments to our render template function. Here will arbitrarily set image name equals two Image name, and a result path equals to result file. And to complete our flask application, we are going to implement one more helper function, which is going to help us to access all uploaded images. So set at app dot route. And in route provide slash upload slash, bigger than or less than define filename. define some image that takes file name as an argument and return send from directory that takes two arguments, uploads and file name to start the flask application, right, if name equals to Maine, which is a standard way to start the whole application in that part right dot run.
And as a first argument said the port equals to 5000. Please know that if you set some port that is occupied flask will throw an error. So to overcome this set the port to be something above 4000. The next argument is debug equals to true. This argument will be set to false in the production time. And we are all done.
If you have any comments or questions, please post them in the comment section. Otherwise, I'll see you in the next tutorial.