mirror of
https://github.com/arnaucube/galdric.git
synced 2026-02-07 03:06:45 +01:00
implemented REST server api, to send an image, and return the analyzed content description
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
{
|
{
|
||||||
|
"serverIP": "127.0.0.1",
|
||||||
|
"serverPort": "3055",
|
||||||
"imgWidth": 300,
|
"imgWidth": 300,
|
||||||
"imgHeigh": 300
|
"imgHeigh": 300
|
||||||
}
|
}
|
||||||
|
|||||||
11
errors.go
11
errors.go
@@ -1,9 +1,18 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
func check(err error) {
|
func check(err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkAndReturn(err error, w http.ResponseWriter, msg string) {
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(w, msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,13 +11,11 @@ import (
|
|||||||
|
|
||||||
type imgRGBA [][]float64
|
type imgRGBA [][]float64
|
||||||
|
|
||||||
func dataToImage(data []byte, imageName string) (image.Image, error) {
|
func dataToImage(data []byte, imageExtension string) (image.Image, error) {
|
||||||
//var histogram imgRGBA
|
|
||||||
reader := bytes.NewReader(data)
|
reader := bytes.NewReader(data)
|
||||||
//var imageExtension = strings.Split(imageName, ".")[1]
|
|
||||||
var img image.Image
|
var img image.Image
|
||||||
var err error
|
var err error
|
||||||
/*switch imageExtension {
|
switch imageExtension {
|
||||||
case "png":
|
case "png":
|
||||||
img, err = png.Decode(reader)
|
img, err = png.Decode(reader)
|
||||||
case "jpg":
|
case "jpg":
|
||||||
@@ -27,19 +25,16 @@ func dataToImage(data []byte, imageName string) (image.Image, error) {
|
|||||||
default:
|
default:
|
||||||
img = nil
|
img = nil
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
img, err = jpeg.Decode(reader)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return img, err
|
return img, err
|
||||||
}
|
}
|
||||||
return img, err
|
return img, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func imageToData(img image.Image, imageName string) ([]byte, error) {
|
func imageToData(img image.Image, imageExtension string) ([]byte, error) {
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
//var imageExtension = strings.Split(imageName, ".")[1]
|
|
||||||
var err error
|
var err error
|
||||||
/*switch imageExtension {
|
switch imageExtension {
|
||||||
case "png":
|
case "png":
|
||||||
err = png.Encode(buf, img)
|
err = png.Encode(buf, img)
|
||||||
case "jpg":
|
case "jpg":
|
||||||
@@ -48,8 +43,7 @@ func imageToData(img image.Image, imageName string) ([]byte, error) {
|
|||||||
err = jpeg.Encode(buf, img, nil)
|
err = jpeg.Encode(buf, img, nil)
|
||||||
default:
|
default:
|
||||||
img = nil
|
img = nil
|
||||||
}*/
|
}
|
||||||
err = jpeg.Encode(buf, img, nil)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return buf.Bytes(), err
|
return buf.Bytes(), err
|
||||||
}
|
}
|
||||||
|
|||||||
5
knn.go
5
knn.go
@@ -2,7 +2,6 @@ package main
|
|||||||
|
|
||||||
func euclideanDist(img1, img2 [][]float64) float64 {
|
func euclideanDist(img1, img2 [][]float64) float64 {
|
||||||
var dist float64
|
var dist float64
|
||||||
|
|
||||||
for i := 0; i < len(img1); i++ {
|
for i := 0; i < len(img1); i++ {
|
||||||
for j := 0; j < len(img1[i]); j++ {
|
for j := 0; j < len(img1[i]); j++ {
|
||||||
dist += (img1[i][j] - img2[i][j]) * (img1[i][j] - img2[i][j])
|
dist += (img1[i][j] - img2[i][j]) * (img1[i][j] - img2[i][j])
|
||||||
@@ -13,12 +12,10 @@ func euclideanDist(img1, img2 [][]float64) float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func knn(dataset Dataset, input [][]float64) string {
|
func knn(dataset Dataset, input [][]float64) string {
|
||||||
d := euclideanDist(dataset["Leopards"][0], input)
|
d := euclideanDist(dataset["leopard"][0], input)
|
||||||
label := "lamp"
|
label := "lamp"
|
||||||
for k, v := range dataset {
|
for k, v := range dataset {
|
||||||
//fmt.Println(k)
|
|
||||||
for i := 0; i < len(v); i++ {
|
for i := 0; i < len(v); i++ {
|
||||||
//fmt.Println(i)
|
|
||||||
dNew := euclideanDist(v[i], input)
|
dNew := euclideanDist(v[i], input)
|
||||||
if dNew < d {
|
if dNew < d {
|
||||||
d = dNew
|
d = dNew
|
||||||
|
|||||||
13
main.go
13
main.go
@@ -2,16 +2,21 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//dataset := make(Dataset)
|
||||||
|
var dataset Dataset
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
readConfig("./config.json")
|
readConfig("./config.json")
|
||||||
|
|
||||||
c.Cyan("reading images datasets")
|
c.Cyan("reading images datasets")
|
||||||
tStart := time.Now()
|
tStart := time.Now()
|
||||||
dataset := readDataset("./dataset")
|
dataset = readDataset("./dataset")
|
||||||
fmt.Print("time spend reading images: ")
|
fmt.Print("time spend reading images: ")
|
||||||
fmt.Println(time.Since(tStart))
|
fmt.Println(time.Since(tStart))
|
||||||
fmt.Println("total folders scanned: " + strconv.Itoa(len(dataset)))
|
fmt.Println("total folders scanned: " + strconv.Itoa(len(dataset)))
|
||||||
@@ -24,8 +29,8 @@ func main() {
|
|||||||
|
|
||||||
//we have the images in the dataset variable
|
//we have the images in the dataset variable
|
||||||
//now, can take images
|
//now, can take images
|
||||||
testFile := readImage("./test.jpg")
|
|
||||||
r := knn(dataset, testFile)
|
|
||||||
fmt.Println("seems to be a " + r)
|
|
||||||
|
|
||||||
|
c.Green("server running")
|
||||||
|
router := NewRouter()
|
||||||
|
log.Fatal(http.ListenAndServe(":"+config.ServerPort, router))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
ServerIP string `json:"serverIP"`
|
||||||
|
ServerPort string `json:"serverPort"`
|
||||||
ImgWidth int `json:"imgWidth"`
|
ImgWidth int `json:"imgWidth"`
|
||||||
ImgHeigh int `json:"imgHeigh"`
|
ImgHeigh int `json:"imgHeigh"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
//each image is [][]float64, is a array of pixels
|
//each image is [][]float64, is a array of pixels
|
||||||
@@ -15,8 +16,6 @@ func byteArrayToFloat64Array(b []byte) []float64 {
|
|||||||
var f []float64
|
var f []float64
|
||||||
for i := 0; i < len(b); i++ {
|
for i := 0; i < len(b); i++ {
|
||||||
val, _ := strconv.ParseFloat(string(b[i]), 64)
|
val, _ := strconv.ParseFloat(string(b[i]), 64)
|
||||||
/*fmt.Print(string(b[i]) + "-")
|
|
||||||
fmt.Println(val)*/
|
|
||||||
f = append(f, val)
|
f = append(f, val)
|
||||||
}
|
}
|
||||||
return f
|
return f
|
||||||
@@ -24,14 +23,12 @@ func byteArrayToFloat64Array(b []byte) []float64 {
|
|||||||
|
|
||||||
func readImage(path string) [][]float64 {
|
func readImage(path string) [][]float64 {
|
||||||
//open image file
|
//open image file
|
||||||
/*reader, err := os.Open(path)
|
|
||||||
check(err)
|
|
||||||
defer reader.Close()*/
|
|
||||||
|
|
||||||
dat, err := ioutil.ReadFile(path)
|
dat, err := ioutil.ReadFile(path)
|
||||||
check(err)
|
check(err)
|
||||||
|
|
||||||
imageRaw, err := dataToImage(dat, path)
|
pathSplited := strings.Split(path, ".")
|
||||||
|
imageExtension := pathSplited[len(pathSplited)-1]
|
||||||
|
imageRaw, err := dataToImage(dat, imageExtension)
|
||||||
check(err)
|
check(err)
|
||||||
|
|
||||||
//resize the image to standard size
|
//resize the image to standard size
|
||||||
@@ -39,15 +36,9 @@ func readImage(path string) [][]float64 {
|
|||||||
|
|
||||||
//convert the image to histogram(RGBA)
|
//convert the image to histogram(RGBA)
|
||||||
histogram := imageToHistogram(image)
|
histogram := imageToHistogram(image)
|
||||||
//convert image to bytes
|
|
||||||
/*imgBytes, err := imageToData(image, path)
|
|
||||||
check(err)*/
|
|
||||||
|
|
||||||
//imgFloat := byteArrayToFloat64Array(imgBytes)
|
|
||||||
return histogram
|
return histogram
|
||||||
}
|
}
|
||||||
func readDataset(path string) map[string]ImgDataset {
|
func readDataset(path string) map[string]ImgDataset {
|
||||||
//dataset := make(map[string]ImgDataset)
|
|
||||||
dataset := make(Dataset)
|
dataset := make(Dataset)
|
||||||
|
|
||||||
folders, _ := ioutil.ReadDir(path)
|
folders, _ := ioutil.ReadDir(path)
|
||||||
@@ -62,8 +53,6 @@ func readDataset(path string) map[string]ImgDataset {
|
|||||||
|
|
||||||
imgDataset = append(imgDataset, image)
|
imgDataset = append(imgDataset, image)
|
||||||
|
|
||||||
/*fmt.Println(folder.Name())
|
|
||||||
fmt.Println(file.Name())*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//add the foldername to the Dataset map
|
//add the foldername to the Dataset map
|
||||||
|
|||||||
87
server.go
Normal file
87
server.go
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ImageModel struct {
|
||||||
|
File []byte `json:"file"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Route struct {
|
||||||
|
Name string
|
||||||
|
Method string
|
||||||
|
Pattern string
|
||||||
|
HandlerFunc http.HandlerFunc
|
||||||
|
}
|
||||||
|
type Routes []Route
|
||||||
|
|
||||||
|
var routes = Routes{
|
||||||
|
Route{
|
||||||
|
"Index",
|
||||||
|
"GET",
|
||||||
|
"/",
|
||||||
|
Index,
|
||||||
|
},
|
||||||
|
Route{
|
||||||
|
"NewImage",
|
||||||
|
"POST",
|
||||||
|
"/image",
|
||||||
|
NewImage,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Logger(inner http.Handler, name string) http.Handler {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
inner.ServeHTTP(w, r)
|
||||||
|
|
||||||
|
log.Printf(
|
||||||
|
"%s\t%s\t%s\t%s",
|
||||||
|
r.Method,
|
||||||
|
r.RequestURI,
|
||||||
|
name,
|
||||||
|
time.Since(start),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func NewRouter() *mux.Router {
|
||||||
|
router := mux.NewRouter().StrictSlash(true)
|
||||||
|
for _, route := range routes {
|
||||||
|
var handler http.Handler
|
||||||
|
handler = route.HandlerFunc
|
||||||
|
handler = Logger(handler, route.Name)
|
||||||
|
|
||||||
|
router.
|
||||||
|
Methods(route.Method).
|
||||||
|
Path(route.Pattern).
|
||||||
|
Name(route.Name).
|
||||||
|
Handler(handler)
|
||||||
|
}
|
||||||
|
return router
|
||||||
|
}
|
||||||
|
|
||||||
|
func Index(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintln(w, "send images to the /image path")
|
||||||
|
}
|
||||||
|
func NewImage(w http.ResponseWriter, r *http.Request) {
|
||||||
|
_, handler, err := r.FormFile("file")
|
||||||
|
check(err)
|
||||||
|
|
||||||
|
//imageName := strings.Split(handler.Filename, ".")[0]
|
||||||
|
//fileName := imageName + ".png"
|
||||||
|
|
||||||
|
//data, err := ioutil.ReadAll(file)
|
||||||
|
//check(err)
|
||||||
|
img := readImage(handler.Filename)
|
||||||
|
result := knn(dataset, img)
|
||||||
|
|
||||||
|
fmt.Println("seems to be a " + result)
|
||||||
|
fmt.Fprintln(w, "seems to be a "+result)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user