├── mobilenet_quant_v1_224.tflite ├── README.md ├── Makefile ├── main.cxx └── labels.txt /mobilenet_quant_v1_224.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattn/webcam-detect-tflite/HEAD/mobilenet_quant_v1_224.tflite -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # webcam-detect-tflite 2 | 3 | Example App detecting objects from video capture using TensorFlow Lite. 4 | 5 | ## Usage 6 | 7 | ``` 8 | $ ./webcam-detector 9 | ``` 10 | 11 | ## Requirements 12 | 13 | * OpenCV 14 | * TensorFlow Lite 15 | 16 | ## Installation 17 | 18 | After modifying Makefile 19 | 20 | ``` 21 | $ make 22 | ``` 23 | 24 | ## License 25 | 26 | MIT 27 | 28 | labels.txt and mobilenet_quant_v1_224.tflite are provided from mobilenet_v1_1.0_224_quant.tgz 29 | 30 | ## Author 31 | 32 | Yasuhiro Matsumoto (a.k.a. mattn) 33 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TENSORFLOW_ROOT=/home/mattn/dev/tensorflow/tensorflow 2 | 3 | # The path to the location which you built tensorflow-lite with cmake. 4 | TENSORFLOW_CBUILD=$(TENSORFLOW_ROOT)/lite/cbuild 5 | CXXFLAGS ?= -g -I $(TENSORFLOW_ROOT) \ 6 | -I $(TENSORFLOW_CBUILD)/flatbuffers/include \ 7 | -I $(TENSORFLOW_CBUILD)/xnnpack/include \ 8 | -I $(TENSORFLOW_CBUILD)/cpuinfo/include \ 9 | -I $(TENSORFLOW_CBUILD)/pthreadpool-source/include \ 10 | `pkg-config --cflags opencv4 freetype2` 11 | LDFLAGS ?= -L $(TENSORFLOW_CBUILD) \ 12 | -L $(TENSORFLOW_CBUILD)/_deps/flatbuffers-build \ 13 | -L $(TENSORFLOW_CBUILD)/_deps/xnnpack-build \ 14 | -L $(TENSORFLOW_CBUILD)/_deps/fft2d-build \ 15 | -L $(TENSORFLOW_CBUILD)/_deps/cpuinfo-build \ 16 | -L $(TENSORFLOW_CBUILD)/pthreadpool \ 17 | -ltensorflow-lite -lXNNPACK -lpthreadpool -lflatbuffers -lfft2d_fftsg2d -lcpuinfo -lstdc++ -ltensorflowlite_c \ 18 | `pkg-config --libs opencv4 freetype2` -lpthread -ldl -lm -lfreetype 19 | 20 | .PHONY: all clean 21 | 22 | all: webcam-detector 23 | 24 | webcam-detector: main.o 25 | gcc -O3 -o webcam-detector main.o $(LDFLAGS) 26 | 27 | main.o : main.cxx 28 | g++ -c --std=c++14 main.cxx -O3 $(CXXFLAGS) 29 | 30 | clean: 31 | rm -f webcam-detector *.o 32 | -------------------------------------------------------------------------------- /main.cxx: -------------------------------------------------------------------------------- 1 | //#include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include 19 | #include 20 | #include 21 | 22 | class ft_renderer { 23 | private: 24 | FT_Library lib_; 25 | FT_Face face_; 26 | 27 | void stoc(int &c, int &i, const std::string &text) { 28 | unsigned char t1 = (unsigned char) text[i]; 29 | if (t1 >= 0xF0) { 30 | c = (((unsigned char)text[i] << 18) & 0x70000) | 31 | (((unsigned char)text[i+1] << 12) & 0xF000) | 32 | (((unsigned char)text[i+2] << 6) & 0x0FC0) | 33 | (((unsigned char)text[i+3] << 0) & 0x003F) ; 34 | i += 4; 35 | } else if (t1 >= 0xE0) { 36 | c = (((unsigned char)text[i] << 12) & 0xF000) | 37 | (((unsigned char)text[i+1] << 6) & 0x0FC0) | 38 | (((unsigned char)text[i+2] << 0) & 0x003F) ; 39 | i += 3; 40 | } else if (t1 >= 0xC2) { 41 | c = (((unsigned char)text[i] << 6) & 0x0FC0) | 42 | (((unsigned char)text[i+1] << 0) & 0x003F) ; 43 | i += 2; 44 | } else if (t1 > 0) { 45 | c = text[i]; 46 | i += 1; 47 | } else { 48 | c = '?'; 49 | i += 1; 50 | } 51 | } 52 | 53 | public: 54 | ft_renderer(std::vector& fontdata) { 55 | FT_Init_FreeType(&lib_); 56 | FT_New_Memory_Face(lib_, 57 | fontdata.data(), 58 | fontdata.size(), 0, &face_); 59 | } 60 | ~ft_renderer() { 61 | FT_Done_FreeType(lib_); 62 | } 63 | 64 | public: 65 | void putText(cv::InputOutputArray _img, const std::string& text, cv::Point pos, 66 | double fontScale, cv::Scalar color, bool bottomLeftOrigin) { 67 | 68 | if (text.empty()) 69 | return; 70 | 71 | FT_Set_Pixel_Sizes(face_, fontScale, fontScale); 72 | 73 | cv::Mat img = _img.getMat(); 74 | 75 | for (int i = 0; text[i] != 0;) { 76 | int c; 77 | 78 | stoc(c, i, text); 79 | FT_Load_Char(face_, (FT_Long)c, 0); 80 | FT_Render_Glyph(face_->glyph, FT_RENDER_MODE_MONO); 81 | FT_Bitmap *bmp = &(face_->glyph->bitmap); 82 | 83 | cv::Point loc = pos; 84 | loc.y = loc.y - (face_->glyph->metrics.horiBearingY >> 6) ; 85 | loc.x = loc.x + (face_->glyph->metrics.horiBearingX >> 6) ; 86 | int row, col, bit, cl; 87 | 88 | for (row = 0; row < bmp->rows; ++row) { 89 | if (loc.y + row > img.rows) 90 | continue; 91 | cv::Vec3b* ptr = img.ptr(loc.y + row); 92 | for (col = 0; col < bmp->pitch; ++col) { 93 | cl = bmp->buffer[ row * bmp->pitch + col]; 94 | for (bit = 7; bit >= 0; --bit) { 95 | if (loc.x + col * 8 + (7 - bit) > img.cols) 96 | continue; 97 | if (((cl >> bit) & 0x01) == 1) { 98 | ptr[loc.x + col * 8 + (7 - bit)][0] = color[0]; 99 | ptr[loc.x + col * 8 + (7 - bit)][1] = color[1]; 100 | ptr[loc.x + col * 8 + (7 - bit)][2] = color[2]; 101 | } 102 | } 103 | } 104 | } 105 | pos.x += (face_->glyph->advance.x) >> 6; 106 | pos.y += (face_->glyph->advance.y) >> 6; 107 | } 108 | } 109 | }; 110 | 111 | template 112 | void 113 | fill(T *in, cv::Mat& src) { 114 | int n = 0, nc = src.channels(), ne = src.elemSize(); 115 | for (int y = 0; y < src.rows; ++y) 116 | for (int x = 0; x < src.cols; ++x) 117 | for (int c = 0; c < nc; ++c) 118 | in[n++] = src.data[y * src.step + x * ne + c]; 119 | } 120 | 121 | int 122 | main(int argc, char const * argv[]) { 123 | std::string modelfile = "mobilenet_quant_v1_224.tflite"; 124 | std::string labelfile = "labels.txt"; 125 | 126 | if (argc == 3) { 127 | modelfile = argv[1]; 128 | labelfile = argv[2]; 129 | } else if (argc != 1) { 130 | std::cerr << "Usage of " << argv[0] << " [modelfile] [labelfile]" << std::endl; 131 | return -1; 132 | } 133 | TfLiteStatus status; 134 | std::unique_ptr model; 135 | std::unique_ptr interpreter; 136 | std::cout << "Loading model: " << modelfile << std::endl; 137 | model = tflite::FlatBufferModel::BuildFromFile(modelfile.c_str()); 138 | if (!model) { 139 | std::cerr << "Failed to load the model." << std::endl; 140 | return -1; 141 | } 142 | tflite::ops::builtin::BuiltinOpResolver resolver; 143 | tflite::InterpreterBuilder(*model, resolver)(&interpreter); 144 | 145 | const TfLiteXNNPackDelegateOptions kDefaultOptions = { 146 | .num_threads = 4, 147 | }; 148 | auto* delegate = TfLiteXNNPackDelegateCreate(&kDefaultOptions); 149 | if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) { 150 | return -1; 151 | } 152 | 153 | status = interpreter->AllocateTensors(); 154 | 155 | if (status != kTfLiteOk) { 156 | std::cerr << "Failed to allocate the memory for tensors." << std::endl; 157 | return -1; 158 | } 159 | 160 | cv::VideoCapture cap(0); 161 | if (!cap.isOpened()) { 162 | std::cerr << "Failed to open VideoCapture." << std::endl; 163 | return -1; 164 | } 165 | 166 | std::cout << "Loading labels: " << labelfile << std::endl; 167 | std::ifstream file(labelfile); 168 | if (!file) { 169 | std::cerr << "Failed to read " << labelfile << "." << std::endl; 170 | return -1; 171 | } 172 | std::vector labels; 173 | std::string line; 174 | while (std::getline(file, line)) 175 | labels.push_back(line); 176 | while (labels.size() % 16) 177 | labels.emplace_back(); 178 | 179 | cv::Scalar white(255, 255, 255); 180 | int input = interpreter->inputs()[0]; 181 | 182 | TfLiteIntArray* dims = interpreter->tensor(input)->dims; 183 | int wanted_height = dims->data[1]; 184 | int wanted_width = dims->data[2]; 185 | int wanted_channels = dims->data[3]; 186 | int wanted_type = interpreter->tensor(input)->type; 187 | 188 | uint8_t *in8 = nullptr; 189 | float *in16 = nullptr; 190 | 191 | if (wanted_type == kTfLiteFloat32) { 192 | in16 = interpreter->typed_tensor(input); 193 | } else if (wanted_type == kTfLiteUInt8) { 194 | in8 = interpreter->typed_tensor(input); 195 | } 196 | 197 | interpreter->SetNumThreads(4); 198 | 199 | std::ifstream fontfile("mplus-1c-thin.ttf", std::ios::in | std::ios::binary); 200 | if (!fontfile) { 201 | std::cerr << "Failed to read font file" << std::endl; 202 | return -1; 203 | } 204 | std::vector fontdata( 205 | (std::istreambuf_iterator(fontfile)), 206 | std::istreambuf_iterator()); 207 | ft_renderer ftw(fontdata); 208 | 209 | int frames = 0; 210 | clock_t prev = clock(); 211 | std::string fpss; 212 | while (true) { 213 | cv::Mat frame; 214 | cap >> frame; 215 | int key = cv::waitKey(1); 216 | if (key == 27) 217 | break; 218 | cv::Mat resized(wanted_height, wanted_width, frame.type()); 219 | cv::resize(frame, resized, resized.size(), cv::INTER_CUBIC); 220 | 221 | int n = 0; 222 | 223 | if (wanted_type == kTfLiteFloat32) { 224 | fill(in16, resized); 225 | } else if (wanted_type == kTfLiteUInt8) { 226 | fill(in8, resized); 227 | } 228 | 229 | status = interpreter->Invoke(); 230 | if (status != kTfLiteOk) { 231 | cv::imshow("window", frame); 232 | continue; 233 | } 234 | 235 | int output = interpreter->outputs()[0]; 236 | TfLiteIntArray* output_dims = interpreter->tensor(output)->dims; 237 | auto output_size = output_dims->data[output_dims->size - 1]; 238 | int output_type = interpreter->tensor(output)->type; 239 | 240 | std::vector> results; 241 | 242 | if (wanted_type == kTfLiteFloat32) { 243 | float *scores = interpreter->typed_output_tensor(0); 244 | for (int i = 0; i < output_size; ++i) { 245 | float value = (scores[i] - 127) / 127.0; 246 | if (value < 0.1) 247 | continue; 248 | results.push_back(std::pair(value, i)); 249 | } 250 | } else if (wanted_type == kTfLiteUInt8) { 251 | uint8_t *scores = interpreter->typed_output_tensor(0); 252 | for (int i = 0; i < output_size; ++i) { 253 | float value = (float)scores[i] / 255.0; 254 | if (value < 0.2) 255 | continue; 256 | results.push_back(std::pair(value, i)); 257 | } 258 | } 259 | std::sort(results.begin(), results.end(), 260 | [](std::pair& x, std::pair& y) -> int { 261 | return x.first > y.first; 262 | } 263 | ); 264 | 265 | n = 0; 266 | for (const auto& result : results) { 267 | std::stringstream ss; 268 | ss << result.first << ": " << labels[result.second]; 269 | ftw.putText(frame, ss.str(), cv::Point(50, 50 + 50 * n), 16, 270 | cv::Scalar(255,255,255), false); 271 | if (++n >= 3) 272 | break; 273 | } 274 | 275 | clock_t now = clock(); 276 | if (((now - prev) / CLOCKS_PER_SEC / 1) > 0) { 277 | std::stringstream ss; 278 | ss << frames << "fps"; 279 | fpss = ss.str(); 280 | std::cout << fpss << std::endl; 281 | frames = 1; 282 | prev = now; 283 | } 284 | ftw.putText(frame, fpss, cv::Point(50, 20), 16, 285 | cv::Scalar(255,255,255), false); 286 | frames++; 287 | 288 | cv::imshow("window", frame); 289 | } 290 | cv::destroyAllWindows(); 291 | return 0; 292 | } 293 | 294 | // vim:set cino=>2 et: 295 | -------------------------------------------------------------------------------- /labels.txt: -------------------------------------------------------------------------------- 1 | background 2 | tench 3 | goldfish 4 | great white shark 5 | tiger shark 6 | hammerhead 7 | electric ray 8 | stingray 9 | cock 10 | hen 11 | ostrich 12 | brambling 13 | goldfinch 14 | house finch 15 | junco 16 | indigo bunting 17 | robin 18 | bulbul 19 | jay 20 | magpie 21 | chickadee 22 | water ouzel 23 | kite 24 | bald eagle 25 | vulture 26 | great grey owl 27 | European fire salamander 28 | common newt 29 | eft 30 | spotted salamander 31 | axolotl 32 | bullfrog 33 | tree frog 34 | tailed frog 35 | loggerhead 36 | leatherback turtle 37 | mud turtle 38 | terrapin 39 | box turtle 40 | banded gecko 41 | common iguana 42 | American chameleon 43 | whiptail 44 | agama 45 | frilled lizard 46 | alligator lizard 47 | Gila monster 48 | green lizard 49 | African chameleon 50 | Komodo dragon 51 | African crocodile 52 | American alligator 53 | triceratops 54 | thunder snake 55 | ringneck snake 56 | hognose snake 57 | green snake 58 | king snake 59 | garter snake 60 | water snake 61 | vine snake 62 | night snake 63 | boa constrictor 64 | rock python 65 | Indian cobra 66 | green mamba 67 | sea snake 68 | horned viper 69 | diamondback 70 | sidewinder 71 | trilobite 72 | harvestman 73 | scorpion 74 | black and gold garden spider 75 | barn spider 76 | garden spider 77 | black widow 78 | tarantula 79 | wolf spider 80 | tick 81 | centipede 82 | black grouse 83 | ptarmigan 84 | ruffed grouse 85 | prairie chicken 86 | peacock 87 | quail 88 | partridge 89 | African grey 90 | macaw 91 | sulphur-crested cockatoo 92 | lorikeet 93 | coucal 94 | bee eater 95 | hornbill 96 | hummingbird 97 | jacamar 98 | toucan 99 | drake 100 | red-breasted merganser 101 | goose 102 | black swan 103 | tusker 104 | echidna 105 | platypus 106 | wallaby 107 | koala 108 | wombat 109 | jellyfish 110 | sea anemone 111 | brain coral 112 | flatworm 113 | nematode 114 | conch 115 | snail 116 | slug 117 | sea slug 118 | chiton 119 | chambered nautilus 120 | Dungeness crab 121 | rock crab 122 | fiddler crab 123 | king crab 124 | American lobster 125 | spiny lobster 126 | crayfish 127 | hermit crab 128 | isopod 129 | white stork 130 | black stork 131 | spoonbill 132 | flamingo 133 | little blue heron 134 | American egret 135 | bittern 136 | crane 137 | limpkin 138 | European gallinule 139 | American coot 140 | bustard 141 | ruddy turnstone 142 | red-backed sandpiper 143 | redshank 144 | dowitcher 145 | oystercatcher 146 | pelican 147 | king penguin 148 | albatross 149 | grey whale 150 | killer whale 151 | dugong 152 | sea lion 153 | Chihuahua 154 | Japanese spaniel 155 | Maltese dog 156 | Pekinese 157 | Shih-Tzu 158 | Blenheim spaniel 159 | papillon 160 | toy terrier 161 | Rhodesian ridgeback 162 | Afghan hound 163 | basset 164 | beagle 165 | bloodhound 166 | bluetick 167 | black-and-tan coonhound 168 | Walker hound 169 | English foxhound 170 | redbone 171 | borzoi 172 | Irish wolfhound 173 | Italian greyhound 174 | whippet 175 | Ibizan hound 176 | Norwegian elkhound 177 | otterhound 178 | Saluki 179 | Scottish deerhound 180 | Weimaraner 181 | Staffordshire bullterrier 182 | American Staffordshire terrier 183 | Bedlington terrier 184 | Border terrier 185 | Kerry blue terrier 186 | Irish terrier 187 | Norfolk terrier 188 | Norwich terrier 189 | Yorkshire terrier 190 | wire-haired fox terrier 191 | Lakeland terrier 192 | Sealyham terrier 193 | Airedale 194 | cairn 195 | Australian terrier 196 | Dandie Dinmont 197 | Boston bull 198 | miniature schnauzer 199 | giant schnauzer 200 | standard schnauzer 201 | Scotch terrier 202 | Tibetan terrier 203 | silky terrier 204 | soft-coated wheaten terrier 205 | West Highland white terrier 206 | Lhasa 207 | flat-coated retriever 208 | curly-coated retriever 209 | golden retriever 210 | Labrador retriever 211 | Chesapeake Bay retriever 212 | German short-haired pointer 213 | vizsla 214 | English setter 215 | Irish setter 216 | Gordon setter 217 | Brittany spaniel 218 | clumber 219 | English springer 220 | Welsh springer spaniel 221 | cocker spaniel 222 | Sussex spaniel 223 | Irish water spaniel 224 | kuvasz 225 | schipperke 226 | groenendael 227 | malinois 228 | briard 229 | kelpie 230 | komondor 231 | Old English sheepdog 232 | Shetland sheepdog 233 | collie 234 | Border collie 235 | Bouvier des Flandres 236 | Rottweiler 237 | German shepherd 238 | Doberman 239 | miniature pinscher 240 | Greater Swiss Mountain dog 241 | Bernese mountain dog 242 | Appenzeller 243 | EntleBucher 244 | boxer 245 | bull mastiff 246 | Tibetan mastiff 247 | French bulldog 248 | Great Dane 249 | Saint Bernard 250 | Eskimo dog 251 | malamute 252 | Siberian husky 253 | dalmatian 254 | affenpinscher 255 | basenji 256 | pug 257 | Leonberg 258 | Newfoundland 259 | Great Pyrenees 260 | Samoyed 261 | Pomeranian 262 | chow 263 | keeshond 264 | Brabancon griffon 265 | Pembroke 266 | Cardigan 267 | toy poodle 268 | miniature poodle 269 | standard poodle 270 | Mexican hairless 271 | timber wolf 272 | white wolf 273 | red wolf 274 | coyote 275 | dingo 276 | dhole 277 | African hunting dog 278 | hyena 279 | red fox 280 | kit fox 281 | Arctic fox 282 | grey fox 283 | tabby 284 | tiger cat 285 | Persian cat 286 | Siamese cat 287 | Egyptian cat 288 | cougar 289 | lynx 290 | leopard 291 | snow leopard 292 | jaguar 293 | lion 294 | tiger 295 | cheetah 296 | brown bear 297 | American black bear 298 | ice bear 299 | sloth bear 300 | mongoose 301 | meerkat 302 | tiger beetle 303 | ladybug 304 | ground beetle 305 | long-horned beetle 306 | leaf beetle 307 | dung beetle 308 | rhinoceros beetle 309 | weevil 310 | fly 311 | bee 312 | ant 313 | grasshopper 314 | cricket 315 | walking stick 316 | cockroach 317 | mantis 318 | cicada 319 | leafhopper 320 | lacewing 321 | dragonfly 322 | damselfly 323 | admiral 324 | ringlet 325 | monarch 326 | cabbage butterfly 327 | sulphur butterfly 328 | lycaenid 329 | starfish 330 | sea urchin 331 | sea cucumber 332 | wood rabbit 333 | hare 334 | Angora 335 | hamster 336 | porcupine 337 | fox squirrel 338 | marmot 339 | beaver 340 | guinea pig 341 | sorrel 342 | zebra 343 | hog 344 | wild boar 345 | warthog 346 | hippopotamus 347 | ox 348 | water buffalo 349 | bison 350 | ram 351 | bighorn 352 | ibex 353 | hartebeest 354 | impala 355 | gazelle 356 | Arabian camel 357 | llama 358 | weasel 359 | mink 360 | polecat 361 | black-footed ferret 362 | otter 363 | skunk 364 | badger 365 | armadillo 366 | three-toed sloth 367 | orangutan 368 | gorilla 369 | chimpanzee 370 | gibbon 371 | siamang 372 | guenon 373 | patas 374 | baboon 375 | macaque 376 | langur 377 | colobus 378 | proboscis monkey 379 | marmoset 380 | capuchin 381 | howler monkey 382 | titi 383 | spider monkey 384 | squirrel monkey 385 | Madagascar cat 386 | indri 387 | Indian elephant 388 | African elephant 389 | lesser panda 390 | giant panda 391 | barracouta 392 | eel 393 | coho 394 | rock beauty 395 | anemone fish 396 | sturgeon 397 | gar 398 | lionfish 399 | puffer 400 | abacus 401 | abaya 402 | academic gown 403 | accordion 404 | acoustic guitar 405 | aircraft carrier 406 | airliner 407 | airship 408 | altar 409 | ambulance 410 | amphibian 411 | analog clock 412 | apiary 413 | apron 414 | ashcan 415 | assault rifle 416 | backpack 417 | bakery 418 | balance beam 419 | balloon 420 | ballpoint 421 | Band Aid 422 | banjo 423 | bannister 424 | barbell 425 | barber chair 426 | barbershop 427 | barn 428 | barometer 429 | barrel 430 | barrow 431 | baseball 432 | basketball 433 | bassinet 434 | bassoon 435 | bathing cap 436 | bath towel 437 | bathtub 438 | beach wagon 439 | beacon 440 | beaker 441 | bearskin 442 | beer bottle 443 | beer glass 444 | bell cote 445 | bib 446 | bicycle-built-for-two 447 | bikini 448 | binder 449 | binoculars 450 | birdhouse 451 | boathouse 452 | bobsled 453 | bolo tie 454 | bonnet 455 | bookcase 456 | bookshop 457 | bottlecap 458 | bow 459 | bow tie 460 | brass 461 | brassiere 462 | breakwater 463 | breastplate 464 | broom 465 | bucket 466 | buckle 467 | bulletproof vest 468 | bullet train 469 | butcher shop 470 | cab 471 | caldron 472 | candle 473 | cannon 474 | canoe 475 | can opener 476 | cardigan 477 | car mirror 478 | carousel 479 | carpenter's kit 480 | carton 481 | car wheel 482 | cash machine 483 | cassette 484 | cassette player 485 | castle 486 | catamaran 487 | CD player 488 | cello 489 | cellular telephone 490 | chain 491 | chainlink fence 492 | chain mail 493 | chain saw 494 | chest 495 | chiffonier 496 | chime 497 | china cabinet 498 | Christmas stocking 499 | church 500 | cinema 501 | cleaver 502 | cliff dwelling 503 | cloak 504 | clog 505 | cocktail shaker 506 | coffee mug 507 | coffeepot 508 | coil 509 | combination lock 510 | computer keyboard 511 | confectionery 512 | container ship 513 | convertible 514 | corkscrew 515 | cornet 516 | cowboy boot 517 | cowboy hat 518 | cradle 519 | crane 520 | crash helmet 521 | crate 522 | crib 523 | Crock Pot 524 | croquet ball 525 | crutch 526 | cuirass 527 | dam 528 | desk 529 | desktop computer 530 | dial telephone 531 | diaper 532 | digital clock 533 | digital watch 534 | dining table 535 | dishrag 536 | dishwasher 537 | disk brake 538 | dock 539 | dogsled 540 | dome 541 | doormat 542 | drilling platform 543 | drum 544 | drumstick 545 | dumbbell 546 | Dutch oven 547 | electric fan 548 | electric guitar 549 | electric locomotive 550 | entertainment center 551 | envelope 552 | espresso maker 553 | face powder 554 | feather boa 555 | file 556 | fireboat 557 | fire engine 558 | fire screen 559 | flagpole 560 | flute 561 | folding chair 562 | football helmet 563 | forklift 564 | fountain 565 | fountain pen 566 | four-poster 567 | freight car 568 | French horn 569 | frying pan 570 | fur coat 571 | garbage truck 572 | gasmask 573 | gas pump 574 | goblet 575 | go-kart 576 | golf ball 577 | golfcart 578 | gondola 579 | gong 580 | gown 581 | grand piano 582 | greenhouse 583 | grille 584 | grocery store 585 | guillotine 586 | hair slide 587 | hair spray 588 | half track 589 | hammer 590 | hamper 591 | hand blower 592 | hand-held computer 593 | handkerchief 594 | hard disc 595 | harmonica 596 | harp 597 | harvester 598 | hatchet 599 | holster 600 | home theater 601 | honeycomb 602 | hook 603 | hoopskirt 604 | horizontal bar 605 | horse cart 606 | hourglass 607 | iPod 608 | iron 609 | jack-o'-lantern 610 | jean 611 | jeep 612 | jersey 613 | jigsaw puzzle 614 | jinrikisha 615 | joystick 616 | kimono 617 | knee pad 618 | knot 619 | lab coat 620 | ladle 621 | lampshade 622 | laptop 623 | lawn mower 624 | lens cap 625 | letter opener 626 | library 627 | lifeboat 628 | lighter 629 | limousine 630 | liner 631 | lipstick 632 | Loafer 633 | lotion 634 | loudspeaker 635 | loupe 636 | lumbermill 637 | magnetic compass 638 | mailbag 639 | mailbox 640 | maillot 641 | maillot 642 | manhole cover 643 | maraca 644 | marimba 645 | mask 646 | matchstick 647 | maypole 648 | maze 649 | measuring cup 650 | medicine chest 651 | megalith 652 | microphone 653 | microwave 654 | military uniform 655 | milk can 656 | minibus 657 | miniskirt 658 | minivan 659 | missile 660 | mitten 661 | mixing bowl 662 | mobile home 663 | Model T 664 | modem 665 | monastery 666 | monitor 667 | moped 668 | mortar 669 | mortarboard 670 | mosque 671 | mosquito net 672 | motor scooter 673 | mountain bike 674 | mountain tent 675 | mouse 676 | mousetrap 677 | moving van 678 | muzzle 679 | nail 680 | neck brace 681 | necklace 682 | nipple 683 | notebook 684 | obelisk 685 | oboe 686 | ocarina 687 | odometer 688 | oil filter 689 | organ 690 | oscilloscope 691 | overskirt 692 | oxcart 693 | oxygen mask 694 | packet 695 | paddle 696 | paddlewheel 697 | padlock 698 | paintbrush 699 | pajama 700 | palace 701 | panpipe 702 | paper towel 703 | parachute 704 | parallel bars 705 | park bench 706 | parking meter 707 | passenger car 708 | patio 709 | pay-phone 710 | pedestal 711 | pencil box 712 | pencil sharpener 713 | perfume 714 | Petri dish 715 | photocopier 716 | pick 717 | pickelhaube 718 | picket fence 719 | pickup 720 | pier 721 | piggy bank 722 | pill bottle 723 | pillow 724 | ping-pong ball 725 | pinwheel 726 | pirate 727 | pitcher 728 | plane 729 | planetarium 730 | plastic bag 731 | plate rack 732 | plow 733 | plunger 734 | Polaroid camera 735 | pole 736 | police van 737 | poncho 738 | pool table 739 | pop bottle 740 | pot 741 | potter's wheel 742 | power drill 743 | prayer rug 744 | printer 745 | prison 746 | projectile 747 | projector 748 | puck 749 | punching bag 750 | purse 751 | quill 752 | quilt 753 | racer 754 | racket 755 | radiator 756 | radio 757 | radio telescope 758 | rain barrel 759 | recreational vehicle 760 | reel 761 | reflex camera 762 | refrigerator 763 | remote control 764 | restaurant 765 | revolver 766 | rifle 767 | rocking chair 768 | rotisserie 769 | rubber eraser 770 | rugby ball 771 | rule 772 | running shoe 773 | safe 774 | safety pin 775 | saltshaker 776 | sandal 777 | sarong 778 | sax 779 | scabbard 780 | scale 781 | school bus 782 | schooner 783 | scoreboard 784 | screen 785 | screw 786 | screwdriver 787 | seat belt 788 | sewing machine 789 | shield 790 | shoe shop 791 | shoji 792 | shopping basket 793 | shopping cart 794 | shovel 795 | shower cap 796 | shower curtain 797 | ski 798 | ski mask 799 | sleeping bag 800 | slide rule 801 | sliding door 802 | slot 803 | snorkel 804 | snowmobile 805 | snowplow 806 | soap dispenser 807 | soccer ball 808 | sock 809 | solar dish 810 | sombrero 811 | soup bowl 812 | space bar 813 | space heater 814 | space shuttle 815 | spatula 816 | speedboat 817 | spider web 818 | spindle 819 | sports car 820 | spotlight 821 | stage 822 | steam locomotive 823 | steel arch bridge 824 | steel drum 825 | stethoscope 826 | stole 827 | stone wall 828 | stopwatch 829 | stove 830 | strainer 831 | streetcar 832 | stretcher 833 | studio couch 834 | stupa 835 | submarine 836 | suit 837 | sundial 838 | sunglass 839 | sunglasses 840 | sunscreen 841 | suspension bridge 842 | swab 843 | sweatshirt 844 | swimming trunks 845 | swing 846 | switch 847 | syringe 848 | table lamp 849 | tank 850 | tape player 851 | teapot 852 | teddy 853 | television 854 | tennis ball 855 | thatch 856 | theater curtain 857 | thimble 858 | thresher 859 | throne 860 | tile roof 861 | toaster 862 | tobacco shop 863 | toilet seat 864 | torch 865 | totem pole 866 | tow truck 867 | toyshop 868 | tractor 869 | trailer truck 870 | tray 871 | trench coat 872 | tricycle 873 | trimaran 874 | tripod 875 | triumphal arch 876 | trolleybus 877 | trombone 878 | tub 879 | turnstile 880 | typewriter keyboard 881 | umbrella 882 | unicycle 883 | upright 884 | vacuum 885 | vase 886 | vault 887 | velvet 888 | vending machine 889 | vestment 890 | viaduct 891 | violin 892 | volleyball 893 | waffle iron 894 | wall clock 895 | wallet 896 | wardrobe 897 | warplane 898 | washbasin 899 | washer 900 | water bottle 901 | water jug 902 | water tower 903 | whiskey jug 904 | whistle 905 | wig 906 | window screen 907 | window shade 908 | Windsor tie 909 | wine bottle 910 | wing 911 | wok 912 | wooden spoon 913 | wool 914 | worm fence 915 | wreck 916 | yawl 917 | yurt 918 | web site 919 | comic book 920 | crossword puzzle 921 | street sign 922 | traffic light 923 | book jacket 924 | menu 925 | plate 926 | guacamole 927 | consomme 928 | hot pot 929 | trifle 930 | ice cream 931 | ice lolly 932 | French loaf 933 | bagel 934 | pretzel 935 | cheeseburger 936 | hotdog 937 | mashed potato 938 | head cabbage 939 | broccoli 940 | cauliflower 941 | zucchini 942 | spaghetti squash 943 | acorn squash 944 | butternut squash 945 | cucumber 946 | artichoke 947 | bell pepper 948 | cardoon 949 | mushroom 950 | Granny Smith 951 | strawberry 952 | orange 953 | lemon 954 | fig 955 | pineapple 956 | banana 957 | jackfruit 958 | custard apple 959 | pomegranate 960 | hay 961 | carbonara 962 | chocolate sauce 963 | dough 964 | meat loaf 965 | pizza 966 | potpie 967 | burrito 968 | red wine 969 | espresso 970 | cup 971 | eggnog 972 | alp 973 | bubble 974 | cliff 975 | coral reef 976 | geyser 977 | lakeside 978 | promontory 979 | sandbar 980 | seashore 981 | valley 982 | volcano 983 | ballplayer 984 | groom 985 | scuba diver 986 | rapeseed 987 | daisy 988 | yellow lady's slipper 989 | corn 990 | acorn 991 | hip 992 | buckeye 993 | coral fungus 994 | agaric 995 | gyromitra 996 | stinkhorn 997 | earthstar 998 | hen-of-the-woods 999 | bolete 1000 | ear 1001 | toilet tissue 1002 | --------------------------------------------------------------------------------