From 96ec2e67c145684009e2d631cd889160ad10bb80 Mon Sep 17 00:00:00 2001 From: bharath Date: Fri, 16 Nov 2018 09:51:45 +0530 Subject: [PATCH] Add auth_url and token to KnowThyNumber Change-Id: Id767f03283550551c2225563e3b0f402981f01a3 --- examples/KnowThyNumber/BE/files/grayscale.png | Bin 126 -> 0 bytes examples/KnowThyNumber/BE/server.go | 182 ++++++++++++++++++ examples/KnowThyNumber/FE/JsCode.js | 9 +- examples/KnowThyNumber/FE/index.html | 2 + 4 files changed, 191 insertions(+), 2 deletions(-) delete mode 100644 examples/KnowThyNumber/BE/files/grayscale.png diff --git a/examples/KnowThyNumber/BE/files/grayscale.png b/examples/KnowThyNumber/BE/files/grayscale.png deleted file mode 100644 index 8645ac03e3bf3edd8f605d2b9f344ce080e06264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^G9b(WBpAZe8a#lMtEY=&NX49_qyx+v)BgOQuXgOw z)RZIZg=cqXyjBSLAiw_H|0%alHl5Xz=w_XIo+H(0kw+4*eN~&lT9u9JJVHIJEDQ|) Y|JQMGTJpbNdIDsyr>mdKI;Vst0A4&QN&o-= diff --git a/examples/KnowThyNumber/BE/server.go b/examples/KnowThyNumber/BE/server.go index d4ec823..c1b825a 100644 --- a/examples/KnowThyNumber/BE/server.go +++ b/examples/KnowThyNumber/BE/server.go @@ -2,8 +2,188 @@ package main import ( "net/http" + "bytes" + "fmt" + "image" + "image/color" + "image/png" + "io" + "io/ioutil" + "math" + "mime/multipart" + "os" + + "github.com/disintegration/imaging" + "github.com/harrydb/go/img/grayscale" + // "github.com/nfnt/resize" ) +// UploadFile uploads a file to the server +func UploadFile(w http.ResponseWriter, r *http.Request) { + fmt.Printf("Inside upload \n") + if r.Method != http.MethodPost { + http.Redirect(w, r, "/", http.StatusSeeOther) + return + } + + // Save a copy of this request for debugging. + //requestDump, err := httputil.DumpRequest(r, true) + //if err != nil { + // fmt.Println(err) + //} + + //fmt.Println(string(requestDump)) + + file, handle, err := r.FormFile("file") + auth_url := r.Form.Get("auth_url") + token := r.Form.Get("token") + fmt.Println(auth_url) + fmt.Println(token) + if err != nil { + fmt.Printf("upload error\n") + fmt.Println(err.Error()) + fmt.Fprintf(w, "%v", err) + return + } + defer file.Close() + + mimeType := handle.Header.Get("Content-Type") + switch mimeType { + // case "image/jpeg": + // saveFile(w, file, handle) + case "image/png": + saveFile(w, file, handle, auth_url, token) + default: + jsonResponse(w, http.StatusBadRequest, "The format file is not valid.") + } +} + +func processImage(infile multipart.File) (err error) { + imgSrc, _, err := image.Decode(infile) + if err != nil { + panic(err.Error()) + } + + // Create a new grayscale image + bounds := imgSrc.Bounds() + w, h := bounds.Max.X, bounds.Max.Y + grayScale := image.NewGray(image.Rectangle{image.Point{0, 0}, image.Point{w, h}}) + for x := 0; x < w; x++ { + for y := 0; y < h; y++ { + imageColor := imgSrc.At(x, y) + rr, gg, bb, _ := imageColor.RGBA() + r := math.Pow(float64(rr), 2.2) + g := math.Pow(float64(gg), 2.2) + b := math.Pow(float64(bb), 2.2) + m := math.Pow(0.2125*r+0.7154*g+0.0721*b, 1/2.2) + Y := uint16(m + 0.5) + grayColor := color.Gray{uint8(Y >> 8)} + grayScale.Set(x, y, grayColor) + } + } + + //Resize image + newImg := imaging.Resize(imgSrc, 28, 28, imaging.Lanczos) + + // Grayscale 2 + grayImg := grayscale.Convert(newImg, grayscale.ToGrayLuminance) + threshold := grayscale.Otsu(grayImg) + grayscale.Threshold(grayImg, threshold, 0, 255) + + // Encode the grayscale image to the new file + newFileName := "grayscale.png" + newfile, err := os.Create("./files/" + newFileName) + if err != nil { + fmt.Printf("failed creating %s: %s", newfile, err) + return err + } + //defer newfile.Close() + //png.Encode(newfile, grayScale) + png.Encode(newfile, grayImg) + + return nil +} + +func saveFile(w http.ResponseWriter, file multipart.File, handle *multipart.FileHeader, auth_url string, token string) { + err := processImage(file) + //data, err := ioutil.ReadAll(file2) + if err != nil { + fmt.Fprintf(w, "%v", err) + fmt.Println("%v", err) + return + } + + //err = ioutil.WriteFile("./files/"+handle.Filename, data, 0666) + //if err != nil { + // fmt.Fprintf(w, "%v", err) + // return + //} + resp := predictNumber(auth_url, token) + jsonResponse(w, http.StatusCreated, resp) +} + +func postFile(filename string, targetUrl string, token string) (string, error) { + bodyBuf := &bytes.Buffer{} + bodyWriter := multipart.NewWriter(bodyBuf) + fmt.Println(filename) + + // this step is very important + fileWriter, err := bodyWriter.CreateFormFile("file", filename) + if err != nil { + fmt.Println("error writing to buffer") + return "", err + } + + // open file handle + fh, err := os.Open(filename) + if err != nil { + fmt.Println("error opening file") + return "", err + } + defer fh.Close() + + //iocopy + _, err = io.Copy(fileWriter, fh) + if err != nil { + return "", err + } + + contentType := bodyWriter.FormDataContentType() + bodyWriter.Close() + + client := &http.Client{} + fmt.Println(bodyBuf) + r, _ := http.NewRequest("POST", targetUrl, bodyBuf) + r.Header.Add("Content-Type", contentType) + r.Header.Add("X-Auth-Token", token) + resp, err := client.Do(r) + // resp, err := http.Post(targetUrl, contentType, bodyBuf) + if err != nil { + return "", err + } + defer resp.Body.Close() + resp_body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + fmt.Println(resp.Status) + fmt.Println(string(resp_body)) + return string(resp_body), nil +} + +func predictNumber(auth_url string, token string) string { + // target_url := "http://localhost:5000/mnist/classify" + filename := "./files/grayscale.png" + resp, _ := postFile(filename, auth_url, token) + return resp +} + +func jsonResponse(w http.ResponseWriter, code int, message string) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(code) + fmt.Fprint(w, message) +} + func ping(w http.ResponseWriter, r *http.Request) { w.Write([]byte("pong")) } @@ -15,3 +195,5 @@ func main() { panic(err) } } + + diff --git a/examples/KnowThyNumber/FE/JsCode.js b/examples/KnowThyNumber/FE/JsCode.js index b7ddeb0..393a4de 100755 --- a/examples/KnowThyNumber/FE/JsCode.js +++ b/examples/KnowThyNumber/FE/JsCode.js @@ -73,7 +73,7 @@ function uploadArea() { function getDstImage(data) { console.log("Entering into getDstImage") var fname = "./img/" - switch(data["classification"]) { + switch(data["data"]) { case 1: return fname+"1.jpg" case 2: @@ -98,13 +98,18 @@ function getDstImage(data) { } function uploadArea2() { - var canvas = document.getElementById("myCanvas") + var canvas = document.getElementById("myCanvas"); + canvas.toBlob( function (blob) { // Do something with the blob object, // e.g. creating a multipart form for file uploads: var formData = new FormData(); + var auth_url = document.getElementById("auth_url").value; + var token = document.getElementById("token").value; formData.append('file', blob, "predict.png"); + formData.append("auth_url", auth_url); + formData.append("token", token); $.ajax({ url: 'http://localhost:9000/upload/', type: 'POST', diff --git a/examples/KnowThyNumber/FE/index.html b/examples/KnowThyNumber/FE/index.html index f08974c..aa5066f 100755 --- a/examples/KnowThyNumber/FE/index.html +++ b/examples/KnowThyNumber/FE/index.html @@ -49,6 +49,8 @@ + Auth URL: + Token:

Color :