├── .gitignore ├── Dockerfile ├── Gopkg.lock ├── Gopkg.toml ├── README.md ├── assets ├── demo-1.png └── demo-2.png ├── cmd ├── classify.go ├── root.go └── server.go ├── data └── labels.json ├── main.go ├── notes └── docker.md ├── package-lock.json ├── package.json ├── public └── index.html ├── requirements.txt ├── tensorcv ├── data_util.go ├── handler.go ├── model.go ├── route.go └── tensor_util.go ├── tf_models ├── create_mnist_model.py └── create_resnet_model.py ├── tsconfig.json ├── ui ├── components │ ├── bar_chart.tsx │ └── enums.ts ├── index.scss ├── index.tsx └── util.ts └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | environment/ 2 | node_modules/ 3 | .vscode/ 4 | vendor/ 5 | tf_models/resnet_50_model 6 | tf_models/mnist_model 7 | public/index.bundle.js -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Build from golang base image 2 | FROM golang:1.10 3 | 4 | LABEL authors="Calvin Feng" 5 | 6 | COPY . /go/src/tensorgo 7 | WORKDIR /go/src/tensorgo 8 | 9 | EXPOSE 3000 10 | 11 | ENV TF_TYPE "cpu" 12 | ENV TARGET_DIRECTORY "/usr/local" 13 | 14 | # Install TensorFlow C library 15 | RUN curl -L \ 16 | https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-${TF_TYPE}-linux-x86_64-1.6.0.tar.gz | \ 17 | tar -C ${TARGET_DIRECTORY} -xz 18 | RUN ldconfig 19 | 20 | # Hide some warnings 21 | ENV TF_CPP_MIN_LOG_LEVEL 2 22 | 23 | # Install Python. 24 | RUN \ 25 | apt-get update && \ 26 | apt-get install -y python python-dev python-pip python-virtualenv && \ 27 | rm -rf /var/lib/apt/lists/* 28 | 29 | RUN pip install -r requirements.txt 30 | 31 | # Create the residual neural network model 32 | RUN python ./tf_models/create_resnet_model.py 33 | 34 | # Install Go dependencies 35 | RUN go get -u github.com/golang/dep/cmd/dep 36 | RUN go install 37 | 38 | # Install Node 39 | RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && apt-get install -y nodejs 40 | RUN npm install 41 | RUN npm run build 42 | 43 | CMD tensorgo server -------------------------------------------------------------------------------- /Gopkg.lock: -------------------------------------------------------------------------------- 1 | # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. 2 | 3 | 4 | [[projects]] 5 | name = "github.com/gorilla/context" 6 | packages = ["."] 7 | revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42" 8 | version = "v1.1.1" 9 | 10 | [[projects]] 11 | name = "github.com/gorilla/mux" 12 | packages = ["."] 13 | revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf" 14 | version = "v1.6.2" 15 | 16 | [[projects]] 17 | name = "github.com/inconshreveable/mousetrap" 18 | packages = ["."] 19 | revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" 20 | version = "v1.0" 21 | 22 | [[projects]] 23 | name = "github.com/spf13/cobra" 24 | packages = ["."] 25 | revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" 26 | version = "v0.0.3" 27 | 28 | [[projects]] 29 | name = "github.com/spf13/pflag" 30 | packages = ["."] 31 | revision = "583c0c0531f06d5278b7d917446061adc344b5cd" 32 | version = "v1.0.1" 33 | 34 | [[projects]] 35 | name = "github.com/tensorflow/tensorflow" 36 | packages = ["tensorflow/go","tensorflow/go/op"] 37 | revision = "93bc2e2072e0daccbcff7a90d397b704a9e8f778" 38 | version = "v1.8.0" 39 | 40 | [solve-meta] 41 | analyzer-name = "dep" 42 | analyzer-version = 1 43 | inputs-digest = "91e770bf9d239204227044b623f47180dd772e5e78ed7e5d216786047cb9f9b3" 44 | solver-name = "gps-cdcl" 45 | solver-version = 1 46 | -------------------------------------------------------------------------------- /Gopkg.toml: -------------------------------------------------------------------------------- 1 | 2 | # Gopkg.toml example 3 | # 4 | # Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md 5 | # for detailed Gopkg.toml documentation. 6 | # 7 | # required = ["github.com/user/thing/cmd/thing"] 8 | # ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] 9 | # 10 | # [[constraint]] 11 | # name = "github.com/user/project" 12 | # version = "1.0.0" 13 | # 14 | # [[constraint]] 15 | # name = "github.com/user/project2" 16 | # branch = "dev" 17 | # source = "github.com/myfork/project2" 18 | # 19 | # [[override]] 20 | # name = "github.com/x/y" 21 | # version = "2.4.0" 22 | 23 | 24 | [[constraint]] 25 | name = "github.com/gorilla/mux" 26 | version = "1.6.2" 27 | 28 | [[constraint]] 29 | name = "github.com/spf13/cobra" 30 | version = "0.0.3" 31 | 32 | [[constraint]] 33 | name = "github.com/tensorflow/tensorflow" 34 | version = "1.8.0" 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Image Classification - TensorFlow in Go 2 | ## What is it? 3 | It's a simple application that allows you to upload an image and performs classification on it. 4 | 5 | First, user clicks upload and select an image: 6 |  7 | 8 | Then the server will run the image through a residual neural network with 50 layers and compute an 9 | answer: 10 | 11 |  12 | 13 | ## Run With Docker 14 | ### Build The Image 15 | The easiest way to run this project is through docker. First, build the image. 16 | 17 | docker build -t tensorgo . 18 | 19 | And then run the image in a container and publish port to 3000 20 | 21 | docker run --publish 3000:3000 tensorgo 22 | 23 | Now you can see the app on `localhost:3000`! 24 | 25 | ### Didn't work? 26 | If you are experiencing error regarding model failed to load or complaint from TensorFlow about 27 | `cannot find model`, then that means you probably need to run the Python script to build the model 28 | first and then build Docker image. 29 | 30 | Create a virtual environment and install requirements using `pip`: 31 | 32 | virtualenv environment 33 | source environment/bin/activate 34 | pip install -r requirements.txt 35 | 36 | Now navigate to `tf_models/` folder and run one of the Python scripts: 37 | 38 | python create_resnet_model.py 39 | 40 | Now build again: 41 | 42 | docker build -t tensorgo . 43 | 44 | ## Run Without Docker 45 | ### Prerequisites 46 | * Go 1.8+ 47 | * Node 6+ 48 | * Python 2.7+ 49 | 50 | ### Install TensorFlow C binding 51 | [Source](https://www.tensorflow.org/install/install_c): Execute the following shell command 52 | ``` 53 | TF_TYPE="cpu" # Change to "gpu" for GPU support 54 | OS="linux" # Change to "darwin" for macOS 55 | TARGET_DIRECTORY="/usr/local" 56 | curl -L \ 57 | "https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-${TF_TYPE}-${OS}-x86_64-1.8.0.tar.gz" | 58 | sudo tar -C $TARGET_DIRECTORY -xz 59 | ``` 60 | 61 | Then configure the linker 62 | ``` 63 | sudo ldconfig 64 | ``` 65 | 66 | ### Install Project Dependencies 67 | Once TensorFlow is installed, next is to install Go dependency 68 | ``` 69 | dep ensure 70 | ``` 71 | 72 | Then compile Go source code 73 | ``` 74 | go install 75 | ``` 76 | 77 | Install node modules for building the frontend 78 | ``` 79 | npm install 80 | ``` 81 | 82 | Then build it 83 | ``` 84 | npm run build 85 | ``` 86 | 87 | ### Compile TensorFlow Model 88 | Create a virtual environment and install requirements using `pip`: 89 | 90 | virtualenv environment 91 | source environment/bin/activate 92 | pip install -r requirements.txt 93 | 94 | Now navigate to `tf_models/` folder and run one of the Python scripts: 95 | 96 | python create_resnet_model.py 97 | 98 | Now you are ready to go. 99 | 100 | ## Start 101 | Simply do 102 | 103 | tensorgo start 104 | -------------------------------------------------------------------------------- /assets/demo-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinfeng/tensorgo/3d9cd55b3870f811a367adfbcbbdbd3265314f21/assets/demo-1.png -------------------------------------------------------------------------------- /assets/demo-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinfeng/tensorgo/3d9cd55b3870f811a367adfbcbbdbd3265314f21/assets/demo-2.png -------------------------------------------------------------------------------- /cmd/classify.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "strings" 7 | "tensorgo/tensorcv" 8 | 9 | "github.com/spf13/cobra" 10 | ) 11 | 12 | // Image file extensions 13 | const ( 14 | PNG = "png" 15 | JPG = "jpg" 16 | JPEG = "jpeg" 17 | ) 18 | 19 | func classify(cmd *cobra.Command, args []string) error { 20 | imgPath, err := cmd.Flags().GetString("img") 21 | if err != nil { 22 | return err 23 | } 24 | 25 | if imgPath == "" { 26 | return errors.New("please specify a valid image file location") 27 | } 28 | 29 | splitPath := strings.Split(imgPath, ".") 30 | 31 | var imgType string 32 | switch splitPath[len(splitPath)-1] { 33 | case PNG: 34 | imgType = "png" 35 | case JPEG: 36 | imgType = "jpeg" 37 | case JPG: 38 | imgType = "jpeg" 39 | default: 40 | return fmt.Errorf("%s is not a valid image", imgPath) 41 | } 42 | 43 | tensor, err := tensorcv.GetTensorFromImagePath(imgPath, imgType, 3) 44 | if err != nil { 45 | return err 46 | } 47 | 48 | fmt.Println("Image tensor is loaded:", tensor.Shape()) 49 | 50 | softmaxScore := tensorcv.RunResNetModel(tensor, ResNet) 51 | if softmaxScore == nil { 52 | return fmt.Errorf("unexpected problem occurred when resnet model is run, score is nil") 53 | } 54 | 55 | // Softmax score is of shape (N, 1000), since N is 1 here, so we will use the 0 indexed item. 56 | score := softmaxScore[0] 57 | top := make(map[int]bool) 58 | 59 | // Pick top 5, using the lazy way instead of writing a quick select... 60 | results := make([]string, 0, 5) 61 | for i := 0; i < 5; i++ { 62 | classIdx, _ := tensorcv.ArgMax(score, top) 63 | results = append(results, labels[classIdx]) 64 | } 65 | 66 | fmt.Printf("Top 5 classifications: %s\n", results) 67 | return nil 68 | } 69 | -------------------------------------------------------------------------------- /cmd/root.go: -------------------------------------------------------------------------------- 1 | // Author(s): Calvin Feng 2 | 3 | package cmd 4 | 5 | import ( 6 | "fmt" 7 | "os" 8 | "tensorgo/tensorcv" 9 | 10 | "github.com/spf13/cobra" 11 | ) 12 | 13 | // Model Path 14 | const ( 15 | ResNet = "./tf_models/resnet_50_model" 16 | ) 17 | 18 | var labels map[int]string 19 | 20 | func init() { 21 | l, err := tensorcv.LoadLabels("./data/labels.json") 22 | if err != nil { 23 | panic(err) 24 | } 25 | 26 | labels = l 27 | } 28 | 29 | var rootCommand = &cobra.Command{ 30 | Use: "tensor_go", 31 | Short: "image recognition in Go using tensorflow and keras models", 32 | } 33 | 34 | var serverCommand = &cobra.Command{ 35 | Use: "server", 36 | Short: "start http server and listen for requests", 37 | Aliases: []string{"s"}, 38 | RunE: server, 39 | } 40 | 41 | var classifyCommand = &cobra.Command{ 42 | Use: "classify", 43 | Short: "classify a specified png or jpeg image", 44 | Aliases: []string{"c"}, 45 | RunE: classify, 46 | } 47 | 48 | // Execute will activate the root command. 49 | func Execute() { 50 | classifyCommand.Flags().String("img", "", "image path for the image you wish to classify") 51 | 52 | rootCommand.AddCommand(serverCommand, classifyCommand) 53 | if err := rootCommand.Execute(); err != nil { 54 | fmt.Println(err) 55 | os.Exit(1) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /cmd/server.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | "tensorgo/tensorcv" 7 | 8 | "github.com/spf13/cobra" 9 | ) 10 | 11 | func server(cmd *cobra.Command, args []string) error { 12 | port := ":3000" 13 | 14 | if len(args) > 0 { 15 | port = fmt.Sprintf(":%s", args[0]) 16 | } 17 | 18 | server := &http.Server{ 19 | Addr: port, 20 | Handler: tensorcv.LoadRoutes(labels, ResNet), 21 | } 22 | 23 | fmt.Printf("server is listening and serving on %s\n", port) 24 | if err := server.ListenAndServe(); err != nil { 25 | return err 26 | } 27 | 28 | return nil 29 | } 30 | -------------------------------------------------------------------------------- /data/labels.json: -------------------------------------------------------------------------------- 1 | { 2 | "0": "tench, Tinca tinca", 3 | "1": "goldfish, Carassius auratus", 4 | "2": "great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias", 5 | "3": "tiger shark, Galeocerdo cuvieri", 6 | "4": "hammerhead, hammerhead shark", 7 | "5": "electric ray, crampfish, numbfish, torpedo", 8 | "6": "stingray", 9 | "7": "cock", 10 | "8": "hen", 11 | "9": "ostrich, Struthio camelus", 12 | "10": "brambling, Fringilla montifringilla", 13 | "11": "goldfinch, Carduelis carduelis", 14 | "12": "house finch, linnet, Carpodacus mexicanus", 15 | "13": "junco, snowbird", 16 | "14": "indigo bunting, indigo finch, indigo bird, Passerina cyanea", 17 | "15": "robin, American robin, Turdus migratorius", 18 | "16": "bulbul", 19 | "17": "jay", 20 | "18": "magpie", 21 | "19": "chickadee", 22 | "20": "water ouzel, dipper", 23 | "21": "kite", 24 | "22": "bald eagle, American eagle, Haliaeetus leucocephalus", 25 | "23": "vulture", 26 | "24": "great grey owl, great gray owl, Strix nebulosa", 27 | "25": "European fire salamander, Salamandra salamandra", 28 | "26": "common newt, Triturus vulgaris", 29 | "27": "eft", 30 | "28": "spotted salamander, Ambystoma maculatum", 31 | "29": "axolotl, mud puppy, Ambystoma mexicanum", 32 | "30": "bullfrog, Rana catesbeiana", 33 | "31": "tree frog, tree-frog", 34 | "32": "tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui", 35 | "33": "loggerhead, loggerhead turtle, Caretta caretta", 36 | "34": "leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea", 37 | "35": "mud turtle", 38 | "36": "terrapin", 39 | "37": "box turtle, box tortoise", 40 | "38": "banded gecko", 41 | "39": "common iguana, iguana, Iguana iguana", 42 | "40": "American chameleon, anole, Anolis carolinensis", 43 | "41": "whiptail, whiptail lizard", 44 | "42": "agama", 45 | "43": "frilled lizard, Chlamydosaurus kingi", 46 | "44": "alligator lizard", 47 | "45": "Gila monster, Heloderma suspectum", 48 | "46": "green lizard, Lacerta viridis", 49 | "47": "African chameleon, Chamaeleo chamaeleon", 50 | "48": "Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis", 51 | "49": "African crocodile, Nile crocodile, Crocodylus niloticus", 52 | "50": "American alligator, Alligator mississipiensis", 53 | "51": "triceratops", 54 | "52": "thunder snake, worm snake, Carphophis amoenus", 55 | "53": "ringneck snake, ring-necked snake, ring snake", 56 | "54": "hognose snake, puff adder, sand viper", 57 | "55": "green snake, grass snake", 58 | "56": "king snake, kingsnake", 59 | "57": "garter snake, grass snake", 60 | "58": "water snake", 61 | "59": "vine snake", 62 | "60": "night snake, Hypsiglena torquata", 63 | "61": "boa constrictor, Constrictor constrictor", 64 | "62": "rock python, rock snake, Python sebae", 65 | "63": "Indian cobra, Naja naja", 66 | "64": "green mamba", 67 | "65": "sea snake", 68 | "66": "horned viper, cerastes, sand viper, horned asp, Cerastes cornutus", 69 | "67": "diamondback, diamondback rattlesnake, Crotalus adamanteus", 70 | "68": "sidewinder, horned rattlesnake, Crotalus cerastes", 71 | "69": "trilobite", 72 | "70": "harvestman, daddy longlegs, Phalangium opilio", 73 | "71": "scorpion", 74 | "72": "black and gold garden spider, Argiope aurantia", 75 | "73": "barn spider, Araneus cavaticus", 76 | "74": "garden spider, Aranea diademata", 77 | "75": "black widow, Latrodectus mactans", 78 | "76": "tarantula", 79 | "77": "wolf spider, hunting spider", 80 | "78": "tick", 81 | "79": "centipede", 82 | "80": "black grouse", 83 | "81": "ptarmigan", 84 | "82": "ruffed grouse, partridge, Bonasa umbellus", 85 | "83": "prairie chicken, prairie grouse, prairie fowl", 86 | "84": "peacock", 87 | "85": "quail", 88 | "86": "partridge", 89 | "87": "African grey, African gray, Psittacus erithacus", 90 | "88": "macaw", 91 | "89": "sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita", 92 | "90": "lorikeet", 93 | "91": "coucal", 94 | "92": "bee eater", 95 | "93": "hornbill", 96 | "94": "hummingbird", 97 | "95": "jacamar", 98 | "96": "toucan", 99 | "97": "drake", 100 | "98": "red-breasted merganser, Mergus serrator", 101 | "99": "goose", 102 | "100": "black swan, Cygnus atratus", 103 | "101": "tusker", 104 | "102": "echidna, spiny anteater, anteater", 105 | "103": "platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus", 106 | "104": "wallaby, brush kangaroo", 107 | "105": "koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus", 108 | "106": "wombat", 109 | "107": "jellyfish", 110 | "108": "sea anemone, anemone", 111 | "109": "brain coral", 112 | "110": "flatworm, platyhelminth", 113 | "111": "nematode, nematode worm, roundworm", 114 | "112": "conch", 115 | "113": "snail", 116 | "114": "slug", 117 | "115": "sea slug, nudibranch", 118 | "116": "chiton, coat-of-mail shell, sea cradle, polyplacophore", 119 | "117": "chambered nautilus, pearly nautilus, nautilus", 120 | "118": "Dungeness crab, Cancer magister", 121 | "119": "rock crab, Cancer irroratus", 122 | "120": "fiddler crab", 123 | "121": "king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica", 124 | "122": "American lobster, Northern lobster, Maine lobster, Homarus americanus", 125 | "123": "spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish", 126 | "124": "crayfish, crawfish, crawdad, crawdaddy", 127 | "125": "hermit crab", 128 | "126": "isopod", 129 | "127": "white stork, Ciconia ciconia", 130 | "128": "black stork, Ciconia nigra", 131 | "129": "spoonbill", 132 | "130": "flamingo", 133 | "131": "little blue heron, Egretta caerulea", 134 | "132": "American egret, great white heron, Egretta albus", 135 | "133": "bittern", 136 | "134": "crane", 137 | "135": "limpkin, Aramus pictus", 138 | "136": "European gallinule, Porphyrio porphyrio", 139 | "137": "American coot, marsh hen, mud hen, water hen, Fulica americana", 140 | "138": "bustard", 141 | "139": "ruddy turnstone, Arenaria interpres", 142 | "140": "red-backed sandpiper, dunlin, Erolia alpina", 143 | "141": "redshank, Tringa totanus", 144 | "142": "dowitcher", 145 | "143": "oystercatcher, oyster catcher", 146 | "144": "pelican", 147 | "145": "king penguin, Aptenodytes patagonica", 148 | "146": "albatross, mollymawk", 149 | "147": "grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus", 150 | "148": "killer whale, killer, orca, grampus, sea wolf, Orcinus orca", 151 | "149": "dugong, Dugong dugon", 152 | "150": "sea lion", 153 | "151": "Chihuahua", 154 | "152": "Japanese spaniel", 155 | "153": "Maltese dog, Maltese terrier, Maltese", 156 | "154": "Pekinese, Pekingese, Peke", 157 | "155": "Shih-Tzu", 158 | "156": "Blenheim spaniel", 159 | "157": "papillon", 160 | "158": "toy terrier", 161 | "159": "Rhodesian ridgeback", 162 | "160": "Afghan hound, Afghan", 163 | "161": "basset, basset hound", 164 | "162": "beagle", 165 | "163": "bloodhound, sleuthhound", 166 | "164": "bluetick", 167 | "165": "black-and-tan coonhound", 168 | "166": "Walker hound, Walker foxhound", 169 | "167": "English foxhound", 170 | "168": "redbone", 171 | "169": "borzoi, Russian wolfhound", 172 | "170": "Irish wolfhound", 173 | "171": "Italian greyhound", 174 | "172": "whippet", 175 | "173": "Ibizan hound, Ibizan Podenco", 176 | "174": "Norwegian elkhound, elkhound", 177 | "175": "otterhound, otter hound", 178 | "176": "Saluki, gazelle hound", 179 | "177": "Scottish deerhound, deerhound", 180 | "178": "Weimaraner", 181 | "179": "Staffordshire bullterrier, Staffordshire bull terrier", 182 | "180": "American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier", 183 | "181": "Bedlington terrier", 184 | "182": "Border terrier", 185 | "183": "Kerry blue terrier", 186 | "184": "Irish terrier", 187 | "185": "Norfolk terrier", 188 | "186": "Norwich terrier", 189 | "187": "Yorkshire terrier", 190 | "188": "wire-haired fox terrier", 191 | "189": "Lakeland terrier", 192 | "190": "Sealyham terrier, Sealyham", 193 | "191": "Airedale, Airedale terrier", 194 | "192": "cairn, cairn terrier", 195 | "193": "Australian terrier", 196 | "194": "Dandie Dinmont, Dandie Dinmont terrier", 197 | "195": "Boston bull, Boston terrier", 198 | "196": "miniature schnauzer", 199 | "197": "giant schnauzer", 200 | "198": "standard schnauzer", 201 | "199": "Scotch terrier, Scottish terrier, Scottie", 202 | "200": "Tibetan terrier, chrysanthemum dog", 203 | "201": "silky terrier, Sydney silky", 204 | "202": "soft-coated wheaten terrier", 205 | "203": "West Highland white terrier", 206 | "204": "Lhasa, Lhasa apso", 207 | "205": "flat-coated retriever", 208 | "206": "curly-coated retriever", 209 | "207": "golden retriever", 210 | "208": "Labrador retriever", 211 | "209": "Chesapeake Bay retriever", 212 | "210": "German short-haired pointer", 213 | "211": "vizsla, Hungarian pointer", 214 | "212": "English setter", 215 | "213": "Irish setter, red setter", 216 | "214": "Gordon setter", 217 | "215": "Brittany spaniel", 218 | "216": "clumber, clumber spaniel", 219 | "217": "English springer, English springer spaniel", 220 | "218": "Welsh springer spaniel", 221 | "219": "cocker spaniel, English cocker spaniel, cocker", 222 | "220": "Sussex spaniel", 223 | "221": "Irish water spaniel", 224 | "222": "kuvasz", 225 | "223": "schipperke", 226 | "224": "groenendael", 227 | "225": "malinois", 228 | "226": "briard", 229 | "227": "kelpie", 230 | "228": "komondor", 231 | "229": "Old English sheepdog, bobtail", 232 | "230": "Shetland sheepdog, Shetland sheep dog, Shetland", 233 | "231": "collie", 234 | "232": "Border collie", 235 | "233": "Bouvier des Flandres, Bouviers des Flandres", 236 | "234": "Rottweiler", 237 | "235": "German shepherd, German shepherd dog, German police dog, alsatian", 238 | "236": "Doberman, Doberman pinscher", 239 | "237": "miniature pinscher", 240 | "238": "Greater Swiss Mountain dog", 241 | "239": "Bernese mountain dog", 242 | "240": "Appenzeller", 243 | "241": "EntleBucher", 244 | "242": "boxer", 245 | "243": "bull mastiff", 246 | "244": "Tibetan mastiff", 247 | "245": "French bulldog", 248 | "246": "Great Dane", 249 | "247": "Saint Bernard, St Bernard", 250 | "248": "Eskimo dog, husky", 251 | "249": "malamute, malemute, Alaskan malamute", 252 | "250": "Siberian husky", 253 | "251": "dalmatian, coach dog, carriage dog", 254 | "252": "affenpinscher, monkey pinscher, monkey dog", 255 | "253": "basenji", 256 | "254": "pug, pug-dog", 257 | "255": "Leonberg", 258 | "256": "Newfoundland, Newfoundland dog", 259 | "257": "Great Pyrenees", 260 | "258": "Samoyed, Samoyede", 261 | "259": "Pomeranian", 262 | "260": "chow, chow chow", 263 | "261": "keeshond", 264 | "262": "Brabancon griffon", 265 | "263": "Pembroke, Pembroke Welsh corgi", 266 | "264": "Cardigan, Cardigan Welsh corgi", 267 | "265": "toy poodle", 268 | "266": "miniature poodle", 269 | "267": "standard poodle", 270 | "268": "Mexican hairless", 271 | "269": "timber wolf, grey wolf, gray wolf, Canis lupus", 272 | "270": "white wolf, Arctic wolf, Canis lupus tundrarum", 273 | "271": "red wolf, maned wolf, Canis rufus, Canis niger", 274 | "272": "coyote, prairie wolf, brush wolf, Canis latrans", 275 | "273": "dingo, warrigal, warragal, Canis dingo", 276 | "274": "dhole, Cuon alpinus", 277 | "275": "African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus", 278 | "276": "hyena, hyaena", 279 | "277": "red fox, Vulpes vulpes", 280 | "278": "kit fox, Vulpes macrotis", 281 | "279": "Arctic fox, white fox, Alopex lagopus", 282 | "280": "grey fox, gray fox, Urocyon cinereoargenteus", 283 | "281": "tabby, tabby cat", 284 | "282": "tiger cat", 285 | "283": "Persian cat", 286 | "284": "Siamese cat, Siamese", 287 | "285": "Egyptian cat", 288 | "286": "cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", 289 | "287": "lynx, catamount", 290 | "288": "leopard, Panthera pardus", 291 | "289": "snow leopard, ounce, Panthera uncia", 292 | "290": "jaguar, panther, Panthera onca, Felis onca", 293 | "291": "lion, king of beasts, Panthera leo", 294 | "292": "tiger, Panthera tigris", 295 | "293": "cheetah, chetah, Acinonyx jubatus", 296 | "294": "brown bear, bruin, Ursus arctos", 297 | "295": "American black bear, black bear, Ursus americanus, Euarctos americanus", 298 | "296": "ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus", 299 | "297": "sloth bear, Melursus ursinus, Ursus ursinus", 300 | "298": "mongoose", 301 | "299": "meerkat, mierkat", 302 | "300": "tiger beetle", 303 | "301": "ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle", 304 | "302": "ground beetle, carabid beetle", 305 | "303": "long-horned beetle, longicorn, longicorn beetle", 306 | "304": "leaf beetle, chrysomelid", 307 | "305": "dung beetle", 308 | "306": "rhinoceros beetle", 309 | "307": "weevil", 310 | "308": "fly", 311 | "309": "bee", 312 | "310": "ant, emmet, pismire", 313 | "311": "grasshopper, hopper", 314 | "312": "cricket", 315 | "313": "walking stick, walkingstick, stick insect", 316 | "314": "cockroach, roach", 317 | "315": "mantis, mantid", 318 | "316": "cicada, cicala", 319 | "317": "leafhopper", 320 | "318": "lacewing, lacewing fly", 321 | "319": "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", 322 | "320": "damselfly", 323 | "321": "admiral", 324 | "322": "ringlet, ringlet butterfly", 325 | "323": "monarch, monarch butterfly, milkweed butterfly, Danaus plexippus", 326 | "324": "cabbage butterfly", 327 | "325": "sulphur butterfly, sulfur butterfly", 328 | "326": "lycaenid, lycaenid butterfly", 329 | "327": "starfish, sea star", 330 | "328": "sea urchin", 331 | "329": "sea cucumber, holothurian", 332 | "330": "wood rabbit, cottontail, cottontail rabbit", 333 | "331": "hare", 334 | "332": "Angora, Angora rabbit", 335 | "333": "hamster", 336 | "334": "porcupine, hedgehog", 337 | "335": "fox squirrel, eastern fox squirrel, Sciurus niger", 338 | "336": "marmot", 339 | "337": "beaver", 340 | "338": "guinea pig, Cavia cobaya", 341 | "339": "sorrel", 342 | "340": "zebra", 343 | "341": "hog, pig, grunter, squealer, Sus scrofa", 344 | "342": "wild boar, boar, Sus scrofa", 345 | "343": "warthog", 346 | "344": "hippopotamus, hippo, river horse, Hippopotamus amphibius", 347 | "345": "ox", 348 | "346": "water buffalo, water ox, Asiatic buffalo, Bubalus bubalis", 349 | "347": "bison", 350 | "348": "ram, tup", 351 | "349": "bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis", 352 | "350": "ibex, Capra ibex", 353 | "351": "hartebeest", 354 | "352": "impala, Aepyceros melampus", 355 | "353": "gazelle", 356 | "354": "Arabian camel, dromedary, Camelus dromedarius", 357 | "355": "llama", 358 | "356": "weasel", 359 | "357": "mink", 360 | "358": "polecat, fitch, foulmart, foumart, Mustela putorius", 361 | "359": "black-footed ferret, ferret, Mustela nigripes", 362 | "360": "otter", 363 | "361": "skunk, polecat, wood pussy", 364 | "362": "badger", 365 | "363": "armadillo", 366 | "364": "three-toed sloth, ai, Bradypus tridactylus", 367 | "365": "orangutan, orang, orangutang, Pongo pygmaeus", 368 | "366": "gorilla, Gorilla gorilla", 369 | "367": "chimpanzee, chimp, Pan troglodytes", 370 | "368": "gibbon, Hylobates lar", 371 | "369": "siamang, Hylobates syndactylus, Symphalangus syndactylus", 372 | "370": "guenon, guenon monkey", 373 | "371": "patas, hussar monkey, Erythrocebus patas", 374 | "372": "baboon", 375 | "373": "macaque", 376 | "374": "langur", 377 | "375": "colobus, colobus monkey", 378 | "376": "proboscis monkey, Nasalis larvatus", 379 | "377": "marmoset", 380 | "378": "capuchin, ringtail, Cebus capucinus", 381 | "379": "howler monkey, howler", 382 | "380": "titi, titi monkey", 383 | "381": "spider monkey, Ateles geoffroyi", 384 | "382": "squirrel monkey, Saimiri sciureus", 385 | "383": "Madagascar cat, ring-tailed lemur, Lemur catta", 386 | "384": "indri, indris, Indri indri, Indri brevicaudatus", 387 | "385": "Indian elephant, Elephas maximus", 388 | "386": "African elephant, Loxodonta africana", 389 | "387": "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", 390 | "388": "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", 391 | "389": "barracouta, snoek", 392 | "390": "eel", 393 | "391": "coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch", 394 | "392": "rock beauty, Holocanthus tricolor", 395 | "393": "anemone fish", 396 | "394": "sturgeon", 397 | "395": "gar, garfish, garpike, billfish, Lepisosteus osseus", 398 | "396": "lionfish", 399 | "397": "puffer, pufferfish, blowfish, globefish", 400 | "398": "abacus", 401 | "399": "abaya", 402 | "400": "academic gown, academic robe, judge's robe", 403 | "401": "accordion, piano accordion, squeeze box", 404 | "402": "acoustic guitar", 405 | "403": "aircraft carrier, carrier, flattop, attack aircraft carrier", 406 | "404": "airliner", 407 | "405": "airship, dirigible", 408 | "406": "altar", 409 | "407": "ambulance", 410 | "408": "amphibian, amphibious vehicle", 411 | "409": "analog clock", 412 | "410": "apiary, bee house", 413 | "411": "apron", 414 | "412": "ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin", 415 | "413": "assault rifle, assault gun", 416 | "414": "backpack, back pack, knapsack, packsack, rucksack, haversack", 417 | "415": "bakery, bakeshop, bakehouse", 418 | "416": "balance beam, beam", 419 | "417": "balloon", 420 | "418": "ballpoint, ballpoint pen, ballpen, Biro", 421 | "419": "Band Aid", 422 | "420": "banjo", 423 | "421": "bannister, banister, balustrade, balusters, handrail", 424 | "422": "barbell", 425 | "423": "barber chair", 426 | "424": "barbershop", 427 | "425": "barn", 428 | "426": "barometer", 429 | "427": "barrel, cask", 430 | "428": "barrow, garden cart, lawn cart, wheelbarrow", 431 | "429": "baseball", 432 | "430": "basketball", 433 | "431": "bassinet", 434 | "432": "bassoon", 435 | "433": "bathing cap, swimming cap", 436 | "434": "bath towel", 437 | "435": "bathtub, bathing tub, bath, tub", 438 | "436": "beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon", 439 | "437": "beacon, lighthouse, beacon light, pharos", 440 | "438": "beaker", 441 | "439": "bearskin, busby, shako", 442 | "440": "beer bottle", 443 | "441": "beer glass", 444 | "442": "bell cote, bell cot", 445 | "443": "bib", 446 | "444": "bicycle-built-for-two, tandem bicycle, tandem", 447 | "445": "bikini, two-piece", 448 | "446": "binder, ring-binder", 449 | "447": "binoculars, field glasses, opera glasses", 450 | "448": "birdhouse", 451 | "449": "boathouse", 452 | "450": "bobsled, bobsleigh, bob", 453 | "451": "bolo tie, bolo, bola tie, bola", 454 | "452": "bonnet, poke bonnet", 455 | "453": "bookcase", 456 | "454": "bookshop, bookstore, bookstall", 457 | "455": "bottlecap", 458 | "456": "bow", 459 | "457": "bow tie, bow-tie, bowtie", 460 | "458": "brass, memorial tablet, plaque", 461 | "459": "brassiere, bra, bandeau", 462 | "460": "breakwater, groin, groyne, mole, bulwark, seawall, jetty", 463 | "461": "breastplate, aegis, egis", 464 | "462": "broom", 465 | "463": "bucket, pail", 466 | "464": "buckle", 467 | "465": "bulletproof vest", 468 | "466": "bullet train, bullet", 469 | "467": "butcher shop, meat market", 470 | "468": "cab, hack, taxi, taxicab", 471 | "469": "caldron, cauldron", 472 | "470": "candle, taper, wax light", 473 | "471": "cannon", 474 | "472": "canoe", 475 | "473": "can opener, tin opener", 476 | "474": "cardigan", 477 | "475": "car mirror", 478 | "476": "carousel, carrousel, merry-go-round, roundabout, whirligig", 479 | "477": "carpenter's kit, tool kit", 480 | "478": "carton", 481 | "479": "car wheel", 482 | "480": "cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM", 483 | "481": "cassette", 484 | "482": "cassette player", 485 | "483": "castle", 486 | "484": "catamaran", 487 | "485": "CD player", 488 | "486": "cello, violoncello", 489 | "487": "cellular telephone, cellular phone, cellphone, cell, mobile phone", 490 | "488": "chain", 491 | "489": "chainlink fence", 492 | "490": "chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour", 493 | "491": "chain saw, chainsaw", 494 | "492": "chest", 495 | "493": "chiffonier, commode", 496 | "494": "chime, bell, gong", 497 | "495": "china cabinet, china closet", 498 | "496": "Christmas stocking", 499 | "497": "church, church building", 500 | "498": "cinema, movie theater, movie theatre, movie house, picture palace", 501 | "499": "cleaver, meat cleaver, chopper", 502 | "500": "cliff dwelling", 503 | "501": "cloak", 504 | "502": "clog, geta, patten, sabot", 505 | "503": "cocktail shaker", 506 | "504": "coffee mug", 507 | "505": "coffeepot", 508 | "506": "coil, spiral, volute, whorl, helix", 509 | "507": "combination lock", 510 | "508": "computer keyboard, keypad", 511 | "509": "confectionery, confectionary, candy store", 512 | "510": "container ship, containership, container vessel", 513 | "511": "convertible", 514 | "512": "corkscrew, bottle screw", 515 | "513": "cornet, horn, trumpet, trump", 516 | "514": "cowboy boot", 517 | "515": "cowboy hat, ten-gallon hat", 518 | "516": "cradle", 519 | "517": "crane", 520 | "518": "crash helmet", 521 | "519": "crate", 522 | "520": "crib, cot", 523 | "521": "Crock Pot", 524 | "522": "croquet ball", 525 | "523": "crutch", 526 | "524": "cuirass", 527 | "525": "dam, dike, dyke", 528 | "526": "desk", 529 | "527": "desktop computer", 530 | "528": "dial telephone, dial phone", 531 | "529": "diaper, nappy, napkin", 532 | "530": "digital clock", 533 | "531": "digital watch", 534 | "532": "dining table, board", 535 | "533": "dishrag, dishcloth", 536 | "534": "dishwasher, dish washer, dishwashing machine", 537 | "535": "disk brake, disc brake", 538 | "536": "dock, dockage, docking facility", 539 | "537": "dogsled, dog sled, dog sleigh", 540 | "538": "dome", 541 | "539": "doormat, welcome mat", 542 | "540": "drilling platform, offshore rig", 543 | "541": "drum, membranophone, tympan", 544 | "542": "drumstick", 545 | "543": "dumbbell", 546 | "544": "Dutch oven", 547 | "545": "electric fan, blower", 548 | "546": "electric guitar", 549 | "547": "electric locomotive", 550 | "548": "entertainment center", 551 | "549": "envelope", 552 | "550": "espresso maker", 553 | "551": "face powder", 554 | "552": "feather boa, boa", 555 | "553": "file, file cabinet, filing cabinet", 556 | "554": "fireboat", 557 | "555": "fire engine, fire truck", 558 | "556": "fire screen, fireguard", 559 | "557": "flagpole, flagstaff", 560 | "558": "flute, transverse flute", 561 | "559": "folding chair", 562 | "560": "football helmet", 563 | "561": "forklift", 564 | "562": "fountain", 565 | "563": "fountain pen", 566 | "564": "four-poster", 567 | "565": "freight car", 568 | "566": "French horn, horn", 569 | "567": "frying pan, frypan, skillet", 570 | "568": "fur coat", 571 | "569": "garbage truck, dustcart", 572 | "570": "gasmask, respirator, gas helmet", 573 | "571": "gas pump, gasoline pump, petrol pump, island dispenser", 574 | "572": "goblet", 575 | "573": "go-kart", 576 | "574": "golf ball", 577 | "575": "golfcart, golf cart", 578 | "576": "gondola", 579 | "577": "gong, tam-tam", 580 | "578": "gown", 581 | "579": "grand piano, grand", 582 | "580": "greenhouse, nursery, glasshouse", 583 | "581": "grille, radiator grille", 584 | "582": "grocery store, grocery, food market, market", 585 | "583": "guillotine", 586 | "584": "hair slide", 587 | "585": "hair spray", 588 | "586": "half track", 589 | "587": "hammer", 590 | "588": "hamper", 591 | "589": "hand blower, blow dryer, blow drier, hair dryer, hair drier", 592 | "590": "hand-held computer, hand-held microcomputer", 593 | "591": "handkerchief, hankie, hanky, hankey", 594 | "592": "hard disc, hard disk, fixed disk", 595 | "593": "harmonica, mouth organ, harp, mouth harp", 596 | "594": "harp", 597 | "595": "harvester, reaper", 598 | "596": "hatchet", 599 | "597": "holster", 600 | "598": "home theater, home theatre", 601 | "599": "honeycomb", 602 | "600": "hook, claw", 603 | "601": "hoopskirt, crinoline", 604 | "602": "horizontal bar, high bar", 605 | "603": "horse cart, horse-cart", 606 | "604": "hourglass", 607 | "605": "iPod", 608 | "606": "iron, smoothing iron", 609 | "607": "jack-o'-lantern", 610 | "608": "jean, blue jean, denim", 611 | "609": "jeep, landrover", 612 | "610": "jersey, T-shirt, tee shirt", 613 | "611": "jigsaw puzzle", 614 | "612": "jinrikisha, ricksha, rickshaw", 615 | "613": "joystick", 616 | "614": "kimono", 617 | "615": "knee pad", 618 | "616": "knot", 619 | "617": "lab coat, laboratory coat", 620 | "618": "ladle", 621 | "619": "lampshade, lamp shade", 622 | "620": "laptop, laptop computer", 623 | "621": "lawn mower, mower", 624 | "622": "lens cap, lens cover", 625 | "623": "letter opener, paper knife, paperknife", 626 | "624": "library", 627 | "625": "lifeboat", 628 | "626": "lighter, light, igniter, ignitor", 629 | "627": "limousine, limo", 630 | "628": "liner, ocean liner", 631 | "629": "lipstick, lip rouge", 632 | "630": "Loafer", 633 | "631": "lotion", 634 | "632": "loudspeaker, speaker, speaker unit, loudspeaker system, speaker system", 635 | "633": "loupe, jeweler's loupe", 636 | "634": "lumbermill, sawmill", 637 | "635": "magnetic compass", 638 | "636": "mailbag, postbag", 639 | "637": "mailbox, letter box", 640 | "638": "maillot", 641 | "639": "maillot, tank suit", 642 | "640": "manhole cover", 643 | "641": "maraca", 644 | "642": "marimba, xylophone", 645 | "643": "mask", 646 | "644": "matchstick", 647 | "645": "maypole", 648 | "646": "maze, labyrinth", 649 | "647": "measuring cup", 650 | "648": "medicine chest, medicine cabinet", 651 | "649": "megalith, megalithic structure", 652 | "650": "microphone, mike", 653 | "651": "microwave, microwave oven", 654 | "652": "military uniform", 655 | "653": "milk can", 656 | "654": "minibus", 657 | "655": "miniskirt, mini", 658 | "656": "minivan", 659 | "657": "missile", 660 | "658": "mitten", 661 | "659": "mixing bowl", 662 | "660": "mobile home, manufactured home", 663 | "661": "Model T", 664 | "662": "modem", 665 | "663": "monastery", 666 | "664": "monitor", 667 | "665": "moped", 668 | "666": "mortar", 669 | "667": "mortarboard", 670 | "668": "mosque", 671 | "669": "mosquito net", 672 | "670": "motor scooter, scooter", 673 | "671": "mountain bike, all-terrain bike, off-roader", 674 | "672": "mountain tent", 675 | "673": "mouse, computer mouse", 676 | "674": "mousetrap", 677 | "675": "moving van", 678 | "676": "muzzle", 679 | "677": "nail", 680 | "678": "neck brace", 681 | "679": "necklace", 682 | "680": "nipple", 683 | "681": "notebook, notebook computer", 684 | "682": "obelisk", 685 | "683": "oboe, hautboy, hautbois", 686 | "684": "ocarina, sweet potato", 687 | "685": "odometer, hodometer, mileometer, milometer", 688 | "686": "oil filter", 689 | "687": "organ, pipe organ", 690 | "688": "oscilloscope, scope, cathode-ray oscilloscope, CRO", 691 | "689": "overskirt", 692 | "690": "oxcart", 693 | "691": "oxygen mask", 694 | "692": "packet", 695 | "693": "paddle, boat paddle", 696 | "694": "paddlewheel, paddle wheel", 697 | "695": "padlock", 698 | "696": "paintbrush", 699 | "697": "pajama, pyjama, pj's, jammies", 700 | "698": "palace", 701 | "699": "panpipe, pandean pipe, syrinx", 702 | "700": "paper towel", 703 | "701": "parachute, chute", 704 | "702": "parallel bars, bars", 705 | "703": "park bench", 706 | "704": "parking meter", 707 | "705": "passenger car, coach, carriage", 708 | "706": "patio, terrace", 709 | "707": "pay-phone, pay-station", 710 | "708": "pedestal, plinth, footstall", 711 | "709": "pencil box, pencil case", 712 | "710": "pencil sharpener", 713 | "711": "perfume, essence", 714 | "712": "Petri dish", 715 | "713": "photocopier", 716 | "714": "pick, plectrum, plectron", 717 | "715": "pickelhaube", 718 | "716": "picket fence, paling", 719 | "717": "pickup, pickup truck", 720 | "718": "pier", 721 | "719": "piggy bank, penny bank", 722 | "720": "pill bottle", 723 | "721": "pillow", 724 | "722": "ping-pong ball", 725 | "723": "pinwheel", 726 | "724": "pirate, pirate ship", 727 | "725": "pitcher, ewer", 728 | "726": "plane, carpenter's plane, woodworking plane", 729 | "727": "planetarium", 730 | "728": "plastic bag", 731 | "729": "plate rack", 732 | "730": "plow, plough", 733 | "731": "plunger, plumber's helper", 734 | "732": "Polaroid camera, Polaroid Land camera", 735 | "733": "pole", 736 | "734": "police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria", 737 | "735": "poncho", 738 | "736": "pool table, billiard table, snooker table", 739 | "737": "pop bottle, soda bottle", 740 | "738": "pot, flowerpot", 741 | "739": "potter's wheel", 742 | "740": "power drill", 743 | "741": "prayer rug, prayer mat", 744 | "742": "printer", 745 | "743": "prison, prison house", 746 | "744": "projectile, missile", 747 | "745": "projector", 748 | "746": "puck, hockey puck", 749 | "747": "punching bag, punch bag, punching ball, punchball", 750 | "748": "purse", 751 | "749": "quill, quill pen", 752 | "750": "quilt, comforter, comfort, puff", 753 | "751": "racer, race car, racing car", 754 | "752": "racket, racquet", 755 | "753": "radiator", 756 | "754": "radio, wireless", 757 | "755": "radio telescope, radio reflector", 758 | "756": "rain barrel", 759 | "757": "recreational vehicle, RV, R.V.", 760 | "758": "reel", 761 | "759": "reflex camera", 762 | "760": "refrigerator, icebox", 763 | "761": "remote control, remote", 764 | "762": "restaurant, eating house, eating place, eatery", 765 | "763": "revolver, six-gun, six-shooter", 766 | "764": "rifle", 767 | "765": "rocking chair, rocker", 768 | "766": "rotisserie", 769 | "767": "rubber eraser, rubber, pencil eraser", 770 | "768": "rugby ball", 771 | "769": "rule, ruler", 772 | "770": "running shoe", 773 | "771": "safe", 774 | "772": "safety pin", 775 | "773": "saltshaker, salt shaker", 776 | "774": "sandal", 777 | "775": "sarong", 778 | "776": "sax, saxophone", 779 | "777": "scabbard", 780 | "778": "scale, weighing machine", 781 | "779": "school bus", 782 | "780": "schooner", 783 | "781": "scoreboard", 784 | "782": "screen, CRT screen", 785 | "783": "screw", 786 | "784": "screwdriver", 787 | "785": "seat belt, seatbelt", 788 | "786": "sewing machine", 789 | "787": "shield, buckler", 790 | "788": "shoe shop, shoe-shop, shoe store", 791 | "789": "shoji", 792 | "790": "shopping basket", 793 | "791": "shopping cart", 794 | "792": "shovel", 795 | "793": "shower cap", 796 | "794": "shower curtain", 797 | "795": "ski", 798 | "796": "ski mask", 799 | "797": "sleeping bag", 800 | "798": "slide rule, slipstick", 801 | "799": "sliding door", 802 | "800": "slot, one-armed bandit", 803 | "801": "snorkel", 804 | "802": "snowmobile", 805 | "803": "snowplow, snowplough", 806 | "804": "soap dispenser", 807 | "805": "soccer ball", 808 | "806": "sock", 809 | "807": "solar dish, solar collector, solar furnace", 810 | "808": "sombrero", 811 | "809": "soup bowl", 812 | "810": "space bar", 813 | "811": "space heater", 814 | "812": "space shuttle", 815 | "813": "spatula", 816 | "814": "speedboat", 817 | "815": "spider web, spider's web", 818 | "816": "spindle", 819 | "817": "sports car, sport car", 820 | "818": "spotlight, spot", 821 | "819": "stage", 822 | "820": "steam locomotive", 823 | "821": "steel arch bridge", 824 | "822": "steel drum", 825 | "823": "stethoscope", 826 | "824": "stole", 827 | "825": "stone wall", 828 | "826": "stopwatch, stop watch", 829 | "827": "stove", 830 | "828": "strainer", 831 | "829": "streetcar, tram, tramcar, trolley, trolley car", 832 | "830": "stretcher", 833 | "831": "studio couch, day bed", 834 | "832": "stupa, tope", 835 | "833": "submarine, pigboat, sub, U-boat", 836 | "834": "suit, suit of clothes", 837 | "835": "sundial", 838 | "836": "sunglass", 839 | "837": "sunglasses, dark glasses, shades", 840 | "838": "sunscreen, sunblock, sun blocker", 841 | "839": "suspension bridge", 842 | "840": "swab, swob, mop", 843 | "841": "sweatshirt", 844 | "842": "swimming trunks, bathing trunks", 845 | "843": "swing", 846 | "844": "switch, electric switch, electrical switch", 847 | "845": "syringe", 848 | "846": "table lamp", 849 | "847": "tank, army tank, armored combat vehicle, armoured combat vehicle", 850 | "848": "tape player", 851 | "849": "teapot", 852 | "850": "teddy, teddy bear", 853 | "851": "television, television system", 854 | "852": "tennis ball", 855 | "853": "thatch, thatched roof", 856 | "854": "theater curtain, theatre curtain", 857 | "855": "thimble", 858 | "856": "thresher, thrasher, threshing machine", 859 | "857": "throne", 860 | "858": "tile roof", 861 | "859": "toaster", 862 | "860": "tobacco shop, tobacconist shop, tobacconist", 863 | "861": "toilet seat", 864 | "862": "torch", 865 | "863": "totem pole", 866 | "864": "tow truck, tow car, wrecker", 867 | "865": "toyshop", 868 | "866": "tractor", 869 | "867": "trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi", 870 | "868": "tray", 871 | "869": "trench coat", 872 | "870": "tricycle, trike, velocipede", 873 | "871": "trimaran", 874 | "872": "tripod", 875 | "873": "triumphal arch", 876 | "874": "trolleybus, trolley coach, trackless trolley", 877 | "875": "trombone", 878 | "876": "tub, vat", 879 | "877": "turnstile", 880 | "878": "typewriter keyboard", 881 | "879": "umbrella", 882 | "880": "unicycle, monocycle", 883 | "881": "upright, upright piano", 884 | "882": "vacuum, vacuum cleaner", 885 | "883": "vase", 886 | "884": "vault", 887 | "885": "velvet", 888 | "886": "vending machine", 889 | "887": "vestment", 890 | "888": "viaduct", 891 | "889": "violin, fiddle", 892 | "890": "volleyball", 893 | "891": "waffle iron", 894 | "892": "wall clock", 895 | "893": "wallet, billfold, notecase, pocketbook", 896 | "894": "wardrobe, closet, press", 897 | "895": "warplane, military plane", 898 | "896": "washbasin, handbasin, washbowl, lavabo, wash-hand basin", 899 | "897": "washer, automatic washer, washing machine", 900 | "898": "water bottle", 901 | "899": "water jug", 902 | "900": "water tower", 903 | "901": "whiskey jug", 904 | "902": "whistle", 905 | "903": "wig", 906 | "904": "window screen", 907 | "905": "window shade", 908 | "906": "Windsor tie", 909 | "907": "wine bottle", 910 | "908": "wing", 911 | "909": "wok", 912 | "910": "wooden spoon", 913 | "911": "wool, woolen, woollen", 914 | "912": "worm fence, snake fence, snake-rail fence, Virginia fence", 915 | "913": "wreck", 916 | "914": "yawl", 917 | "915": "yurt", 918 | "916": "web site, website, internet site, site", 919 | "917": "comic book", 920 | "918": "crossword puzzle, crossword", 921 | "919": "street sign", 922 | "920": "traffic light, traffic signal, stoplight", 923 | "921": "book jacket, dust cover, dust jacket, dust wrapper", 924 | "922": "menu", 925 | "923": "plate", 926 | "924": "guacamole", 927 | "925": "consomme", 928 | "926": "hot pot, hotpot", 929 | "927": "trifle", 930 | "928": "ice cream, icecream", 931 | "929": "ice lolly, lolly, lollipop, popsicle", 932 | "930": "French loaf", 933 | "931": "bagel, beigel", 934 | "932": "pretzel", 935 | "933": "cheeseburger", 936 | "934": "hotdog, hot dog, red hot", 937 | "935": "mashed potato", 938 | "936": "head cabbage", 939 | "937": "broccoli", 940 | "938": "cauliflower", 941 | "939": "zucchini, courgette", 942 | "940": "spaghetti squash", 943 | "941": "acorn squash", 944 | "942": "butternut squash", 945 | "943": "cucumber, cuke", 946 | "944": "artichoke, globe artichoke", 947 | "945": "bell pepper", 948 | "946": "cardoon", 949 | "947": "mushroom", 950 | "948": "Granny Smith", 951 | "949": "strawberry", 952 | "950": "orange", 953 | "951": "lemon", 954 | "952": "fig", 955 | "953": "pineapple, ananas", 956 | "954": "banana", 957 | "955": "jackfruit, jak, jack", 958 | "956": "custard apple", 959 | "957": "pomegranate", 960 | "958": "hay", 961 | "959": "carbonara", 962 | "960": "chocolate sauce, chocolate syrup", 963 | "961": "dough", 964 | "962": "meat loaf, meatloaf", 965 | "963": "pizza, pizza pie", 966 | "964": "potpie", 967 | "965": "burrito", 968 | "966": "red wine", 969 | "967": "espresso", 970 | "968": "cup", 971 | "969": "eggnog", 972 | "970": "alp", 973 | "971": "bubble", 974 | "972": "cliff, drop, drop-off", 975 | "973": "coral reef", 976 | "974": "geyser", 977 | "975": "lakeside, lakeshore", 978 | "976": "promontory, headland, head, foreland", 979 | "977": "sandbar, sand bar", 980 | "978": "seashore, coast, seacoast, sea-coast", 981 | "979": "valley, vale", 982 | "980": "volcano", 983 | "981": "ballplayer, baseball player", 984 | "982": "groom, bridegroom", 985 | "983": "scuba diver", 986 | "984": "rapeseed", 987 | "985": "daisy", 988 | "986": "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", 989 | "987": "corn", 990 | "988": "acorn", 991 | "989": "hip, rose hip, rosehip", 992 | "990": "buckeye, horse chestnut, conker", 993 | "991": "coral fungus", 994 | "992": "agaric", 995 | "993": "gyromitra", 996 | "994": "stinkhorn, carrion fungus", 997 | "995": "earthstar", 998 | "996": "hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa", 999 | "997": "bolete", 1000 | "998": "ear, spike, capitulum", 1001 | "999": "toilet tissue, toilet paper, bathroom tissue" 1002 | } -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | // Author(s): Calvin Feng 2 | 3 | package main 4 | 5 | import "tensorgo/cmd" 6 | 7 | func main() { 8 | cmd.Execute() 9 | } 10 | -------------------------------------------------------------------------------- /notes/docker.md: -------------------------------------------------------------------------------- 1 | # Docker 2 | ## Basic Commands 3 | The pull command fetches an image from Docker registry, much like `npm install`. 4 | ``` 5 | docker pull busybox 6 | ``` 7 | 8 | Use `images` command to see a list of all images on your system. 9 | ``` 10 | docker images 11 | ``` 12 | 13 | Use `run` to run a container based on the provided image. 14 | ``` 15 | docker run busybox 16 | ``` 17 | 18 | Use `ps` to see all the containers that are currently running. 19 | ``` 20 | docker ps 21 | ``` 22 | 23 | Attach `-a` to show all the containers that ran. 24 | ``` 25 | docker ps -a 26 | ``` 27 | 28 | We can SSH into a docker container using a `-it` flag 29 | ``` 30 | docker run -it busybox sh 31 | ``` 32 | 33 | We can remove containers using `rm`, even those who have already exited. 34 | ``` 35 | docker rm 91e3611bf6ae 36 | ``` 37 | 38 | We can delete all containers in one go. The `-q` flag means returning only numeric IDs and `-f` 39 | flag means filter ouput based on conditions provided. 40 | ``` 41 | docker ps -a -q -f status=exited 42 | ``` 43 | 44 | The command above will filter docker containers and return numeric IDs of those selected containers, 45 | now we can go ahead and delete them. 46 | ``` 47 | docker rm $(docker ps -a -q -f status=exited) 48 | ``` 49 | 50 | Now if we want to run a container and immediately delete it afterward then we can use a flag `--rm` 51 | ``` 52 | docker run busybox --rm 53 | ``` 54 | 55 | ## Web Applications 56 | Let's pull an image from Prakhar repository, the guy who wrote the tutorial. 57 | ``` 58 | docker run prakhar1989/static-site 59 | ``` 60 | 61 | At this point, the container is not exposing any port. We need to run the container is a detached 62 | mode so we can ask the container to publish ports. The flag `-d` means detached mode. The flag `-P` 63 | will publish all exposed ports to random ports. Finally, the flag `--name` corresponds to a name we 64 | want to give to the container. 65 | ``` 66 | docker run --detach --publish-all --name static-site prakhar1989/static-site 67 | ``` 68 | 69 | Now we ask the docker what are the ports. 70 | ``` 71 | docker port static-site 72 | ``` 73 | 74 | ## Create Images 75 | * Base images are images that have no parent image, usually images with an OS like ubuntu, busybox 76 | or debian. 77 | * Child images are images that build on base images and add additional functionality. 78 | * Official images are images that are officially maintained and supported by people at Docker. 79 | * Usere images are images created and shared by users. 80 | 81 | Let's begin with creating a Dockerfile. 82 | ```Dockerfile 83 | FROM golang:1.8 as build 84 | 85 | LABEL authors="Calvin Feng" 86 | 87 | # The public image golang:1.8 specified that all source code must go into /go/src/ 88 | COPY . /go/src/react-ts-go-todo 89 | WORKDIR /go/src/react-ts-go-todo 90 | 91 | EXPOSE 3000 92 | 93 | RUN go get -u github.com/golang/dep/cmd/dep 94 | 95 | RUN go install 96 | 97 | CMD react-ts-go-todo 98 | ``` 99 | 100 | After Dockerfile has been specified, build the image using `build`, and the flag `-t` means tag name. 101 | The actual tag comes after the colon. In this case, the tag is `beta`. 102 | ``` 103 | docker build -tag react-ts-go-todo:beta . 104 | ``` 105 | 106 | Now let's run it, using publish flag to forward 3000 to 8000 because we already exposed 3000. 107 | ``` 108 | docker run --publish 8000:3000 react-ts-go-todo:beta 109 | ``` 110 | 111 | Or run it in detach mode which is more convenient 112 | ``` 113 | docker run --publish 8000:3000 --detach react-ts-go-todo:beta 114 | ``` 115 | 116 | Stop them all 117 | ``` 118 | docker stop $(docker ps -q) 119 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tensorgo", 3 | "version": "0.1.0", 4 | "description": "react typescript image classification", 5 | "main": "index.tsx", 6 | "scripts": { 7 | "build": "webpack", 8 | "build:watch": "webpack --watch" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/calvinfeng/tensorgo.git" 13 | }, 14 | "keywords": [ 15 | "react", 16 | "typescript", 17 | "go", 18 | "tensorflow" 19 | ], 20 | "author": "Calvin Feng", 21 | "license": "ISC", 22 | "bugs": { 23 | "url": "https://github.com/calvinfeng/tensorgo/issues" 24 | }, 25 | "homepage": "https://github.com/calvinfeng/tensorgo#readme", 26 | "dependencies": { 27 | "@material-ui/core": "^1.2.1", 28 | "@types/axios": "^0.14.0", 29 | "@types/chart.js": "^2.7.22", 30 | "@types/react": "^16.3.17", 31 | "@types/react-dom": "^16.0.6", 32 | "axios": "^0.18.0", 33 | "chart.js": "^2.7.2", 34 | "css-loader": "^0.28.11", 35 | "node-sass": "^4.9.0", 36 | "react": "^16.4.0", 37 | "react-dom": "^16.4.0", 38 | "sass-loader": "^7.0.3", 39 | "style-loader": "^0.21.0", 40 | "ts-loader": "^4.4.1", 41 | "typescript": "^2.9.1", 42 | "webpack": "^4.12.0", 43 | "webpack-cli": "^3.0.3" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |TensorFlow is computing...
120 |{this.state.errorMessage}
; 130 | } 131 | 132 | return ; 133 | } 134 | 135 | render() { 136 | return ( 137 |Classify an image using residual neural network with 50 layers
140 |