diff --git a/Samples/ResnetPicture/python/README.md b/Samples/ResnetPicture/python/README.md new file mode 100644 index 0000000000000000000000000000000000000000..85f74b8907e7b9297bec43f9b45c2c1bfdae9317 --- /dev/null +++ b/Samples/ResnetPicture/python/README.md @@ -0,0 +1,107 @@ +# 图片分类(ResNet50) + +#### 样例介绍 + +基于PyTorch框架的ResNet50模型,对*.jpg图片分类,输出各图片Top5置信度的分类ID、分类名称。 + +#### 样例下载 + +可以使用以下两种方式下载,请选择其中一种进行源码准备。 + +- 命令行方式下载(**下载时间较长,但步骤简单**)。 + + ``` + # 登录开发板,HwHiAiUser用户命令行中执行以下命令下载源码仓。 + cd ${HOME} + git clone https://gitee.com/ascend/EdgeAndRobotics.git + # 切换到样例目录 + cd EdgeAndRobotics/Samples/ResnetPicture/pyACLLite/ + ``` + +- 压缩包方式下载(**下载时间较短,但步骤稍微复杂**)。 + + ``` + # 1. 仓右上角选择 【克隆/下载】 下拉框并选择 【下载ZIP】。 + # 2. 将ZIP包上传到开发板的普通用户家目录中,【例如:${HOME}/EdgeAndRobotics-master.zip】。 + # 3. 开发环境中,执行以下命令,解压zip包。 + cd ${HOME} + chmod +x EdgeAndRobotics-master.zip + unzip EdgeAndRobotics-master.zip + # 4. 切换到样例目录 + cd EdgeAndRobotics-master/Samples/ResnetPicture/pyACLLite/ + ``` + +#### 执行准备 + +1. 以HwHiAiUser用户登录开发板。 + +2. 安装ACLLite库。 + + 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装ACLLite库python版。 + + +#### 运行样例 + +1. 以HwHiAiUser用户登录开发板,切换到当前样例目录。 +2. 获取PyTorch框架的ResNet50模型(\*.onnx),并转换为昇腾AI处理器能识别的模型(\*.om)。 + - 当设备内存**小于8G**时,可设置如下两个环境变量减少atc模型转换过程中使用的进程数,减小内存占用。 + ``` + export TE_PARALLEL_COMPILER=1 + export MAX_COMPILE_CORE_NUMBER=1 + ``` + - 为了方便下载,在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。 + ``` + cd model + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/resnet50/resnet50.onnx + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/resnet50/resnet50_DVPP/aipp.cfg + atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_shape="actual_input_1:1,3,224,224" --soc_version=Ascend310B4 --insert_op_conf=aipp.cfg + ``` + + atc命令中各参数的解释如下,详细约束说明请参见[《ATC模型转换指南》](https://hiascend.com/document/redirect/CannCommunityAtc)。 + + - --model:ResNet-50网络的模型文件的路径。 + - --framework:原始框架类型。5表示ONNX。 + - --output:resnet50.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。 + - --input\_shape:模型输入数据的shape。 + - --soc\_version:昇腾AI处理器的版本。 + + +3. 获取测试图片数据。 + + 请从以下链接获取该样例的测试图片dog1\_1024\_683.jpg,放在data目录下。 + + ``` + cd ../data + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg + ``` + + **注:**若需更换测试图片,则需自行准备测试图片,并将测试图片放到data目录下。 + +4. 运行样例。 + + 执行以下脚本运行样例: + + ``` + bash sample_run.sh + ``` + + 执行成功后,在屏幕上的关键提示信息示例如下,提示信息中的top1-5表示图片置信度的前5种类别、index表示类别标识、value表示该分类的最大置信度,class表示所属类别。这些值可能会根据版本、环境有所不同,请以实际情况为准: + + ``` + ======== top5 inference results: ============= + label:162 confidence:0.849168 class:beagle + label:161 confidence:0.147563 class:basset, basset hound + label:167 confidence:0.001627 class:English foxhound + label:166 confidence:0.001228 class:Walker hound, Walker foxhound + label:163 confidence:0.000184 class:bloodhound, sleuthhound + + ``` + +#### 相关操作 + +- 获取更多样例,请单击[Link](https://gitee.com/ascend/samples/tree/master/inference/modelInference)。 +- 获取在线视频课程,请单击[Link](https://www.hiascend.com/edu/courses?activeTab=%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91)。 +- 获取学习文档,请单击[AscendCL python](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/80RC1alpha002/devguide/appdevg/aclpythondevg/aclpythondevg_0001.html),查看最新版本的AscendCL推理应用开发指南。 +- 查模型的输入输出 + + 可使用第三方工具Netron打开网络模型,查看模型输入或输出的数据类型、Shape,便于在分析应用开发场景时使用。 diff --git a/Samples/ResnetPicture/python/data/.keep b/Samples/ResnetPicture/python/data/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/ResnetPicture/python/model/.keep b/Samples/ResnetPicture/python/model/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/ResnetPicture/python/scripts/sample_run.sh b/Samples/ResnetPicture/python/scripts/sample_run.sh new file mode 100644 index 0000000000000000000000000000000000000000..16dd55bf25177ca47032d0f7ddf9d652fa9aa76c --- /dev/null +++ b/Samples/ResnetPicture/python/scripts/sample_run.sh @@ -0,0 +1,13 @@ +#!/bin/bash +ScriptPath="$( cd "$(dirname "$BASH_SOURCE")" ; pwd -P )" +Src=${ScriptPath}/../src + +cd ${Src} +echo "[INFO] The sample starts to run" +running_command="python3 ResnetDVPP.py" +${running_command} +if [ $? -ne 0 ];then + echo "[INFO] The program runs failed" +else + echo "[INFO] The program runs successfully" +fi diff --git a/Samples/ResnetPicture/python/src/ResnetDVPP.py b/Samples/ResnetPicture/python/src/ResnetDVPP.py new file mode 100644 index 0000000000000000000000000000000000000000..1d4ea6b6d4f3bc62f46a17b6a6e433d1f8b5a31f --- /dev/null +++ b/Samples/ResnetPicture/python/src/ResnetDVPP.py @@ -0,0 +1,102 @@ +import os +import numpy as np +from acllite_imageproc import AclLiteImage +from acllite_imageproc import AclLiteImageProc +from acllite_model import AclLiteModel +from acllite_resource import AclLiteResource +from label import label + +class sample_resnet_dvpp(object): + def __init__(self, model_path): + self.model_path = model_path # string + self.resource = None + self.dvpp = None + self.model = None + self.resized_image = None + self.result = None + + def init_resource(self): + # init acl resource + self.resource = AclLiteResource() + self.resource.init() + + # init dvpp resource + self.dvpp = AclLiteImageProc(self.resource) + + # load model from file + self.model = AclLiteModel(self.model_path) + + def process_input(self, input_path, model_width, model_height): + # read image from file + self.image = AclLiteImage(input_path) + + # memory copy from host to dvpp + image_input = self.image.copy_to_dvpp() + + # decode image from JPEGD format to YUV + yuv_image = self.dvpp.jpegd(image_input) + + # execute resize + self.resized_image = self.dvpp.resize(yuv_image, model_width, model_height) + + def inference(self): + # inference + self.result = self.model.execute([self.resized_image]) + + def get_result(self): + # do data processing with softmax + res = np.array(self.result).flatten() + res = np.exp(res) + + # print top 5 classes + top_k = res.argsort()[-1:-6:-1] + total = np.sum(res) + print("======== top5 inference results: =============") + for j in top_k: + label_class = "" + label_string = label.get(str(j)) + if label_string: + list_iterator = iter(range(len(label_string))) + for i in list_iterator: + if i == len(label_string) - 1: + label_class += label_string[i] + else: + label_class += label_string[i] + "," + "\t" + print("label:%d confidence:%f class:%s" % (j, res[j]/total, label_class)) + else: + raise Exception("the key of label is not exist") + + def release_resource(self): + del self.dvpp + del self.model + del self.resource + +if __name__ == '__main__': + model_width = 224 + model_height = 224 + current_dir = os.path.dirname(os.path.abspath(__file__)) + model_path = os.path.join(current_dir, "../model/resnet50.om") + if not os.path.exists(model_path): + raise Exception("the model is not exist") + + # read all file path of image + images_path = os.path.join(current_dir, "../data") + if not os.path.exists(images_path): + raise Exception("the directory is not exist") + all_path = [] + for path in os.listdir(images_path): + if path != '.keep': + total_path = os.path.join(images_path, path) + all_path.append(total_path) + if len(all_path) == 0: + raise Exception("the directory is empty, please download image") + + # inference + net = sample_resnet_dvpp(model_path) + net.init_resource() + for image in all_path: + net.process_input(image, model_width, model_height) + net.inference() + net.get_result() + print("*****run finish******") + net.release_resource() diff --git a/Samples/ResnetPicture/python/src/label.py b/Samples/ResnetPicture/python/src/label.py new file mode 100644 index 0000000000000000000000000000000000000000..76dd0c61476b8e057f03088bc47ee008842b54ba --- /dev/null +++ b/Samples/ResnetPicture/python/src/label.py @@ -0,0 +1,1006 @@ +label = { + "0": ["tench", "Tinca tinca"], + "1": ["goldfish", "Carassius auratus"], + "2": ["great white shark", "white shark", "man-eater", "man-eating shark", "Carcharodon carcharias"], + "3": ["tiger shark", "Galeocerdo cuvieri"], + "4": ["hammerhead", "hammerhead shark"], + "5": ["electric ray", "crampfish", "numbfish", "torpedo"], + "6": ["stingray"], + "7": ["cock"], + "8": ["hen"], + "9": ["ostrich", "Struthio camelus"], + "10": ["brambling", "Fringilla montifringilla"], + "11": ["goldfinch", "Carduelis carduelis"], + "12": ["house finch", "linnet", "Carpodacus mexicanus"], + "13": ["junco", "snowbird"], + "14": ["indigo bunting", "indigo finch", "indigo bird", "Passerina cyanea"], + "15": ["robin", "American robin", "Turdus migratorius"], + "16": ["bulbul"], + "17": ["jay"], + "18": ["magpie"], + "19": ["chickadee"], + "20": ["water ouzel", "dipper"], + "21": ["kite"], + "22": ["bald eagle", "American eagle", "Haliaeetus leucocephalus"], + "23": ["vulture"], + "24": ["great grey owl", "great gray owl", "Strix nebulosa"], + "25": ["European fire salamander", "Salamandra salamandra"], + "26": ["common newt", "Triturus vulgaris"], + "27": ["eft"], + "28": ["spotted salamander", "Ambystoma maculatum"], + "29": ["axolotl", "mud puppy", "Ambystoma mexicanum"], + "30": ["bullfrog", "Rana catesbeiana"], + "31": ["tree frog", "tree-frog"], + "32": ["tailed frog", "bell toad", "ribbed toad", "tailed toad", "Ascaphus trui"], + "33": ["loggerhead", "loggerhead turtle", "Caretta caretta"], + "34": ["leatherback turtle", "leatherback", "leathery turtle", "Dermochelys coriacea"], + "35": ["mud turtle"], + "36": ["terrapin"], + "37": ["box turtle", "box tortoise"], + "38": ["banded gecko"], + "39": ["common iguana", "iguana", "Iguana iguana"], + "40": ["American chameleon", "anole", "Anolis carolinensis"], + "41": ["whiptail", "whiptail lizard"], + "42": ["agama"], + "43": ["frilled lizard", "Chlamydosaurus kingi"], + "44": ["alligator lizard"], + "45": ["Gila monster", "Heloderma suspectum"], + "46": ["green lizard", "Lacerta viridis"], + "47": ["African chameleon", "Chamaeleo chamaeleon"], + "48": ["Komodo dragon", "Komodo lizard", "dragon lizard", "giant lizard", "Varanus komodoensis"], + "49": ["African crocodile", "Nile crocodile", "Crocodylus niloticus"], + "50": ["American alligator", "Alligator mississipiensis"], + "51": ["triceratops"], + "52": ["thunder snake", "worm snake", "Carphophis amoenus"], + "53": ["ringneck snake", "ring-necked snake", "ring snake"], + "54": ["hognose snake", "puff adder", "sand viper"], + "55": ["green snake", "grass snake"], + "56": ["king snake", "kingsnake"], + "57": ["garter snake", "grass snake"], + "58": ["water snake"], + "59": ["vine snake"], + "60": ["night snake", "Hypsiglena torquata"], + "61": ["boa constrictor", "Constrictor constrictor"], + "62": ["rock python", "rock snake", "Python sebae"], + "63": ["Indian cobra", "Naja naja"], + "64": ["green mamba"], + "65": ["sea snake"], + "66": ["horned viper", "cerastes", "sand viper", "horned asp", "Cerastes cornutus"], + "67": ["diamondback", "diamondback rattlesnake", "Crotalus adamanteus"], + "68": ["sidewinder", "horned rattlesnake", "Crotalus cerastes"], + "69": ["trilobite"], + "70": ["harvestman", "daddy longlegs", "Phalangium opilio"], + "71": ["scorpion"], + "72": ["black and gold garden spider", "Argiope aurantia"], + "73": ["barn spider", "Araneus cavaticus"], + "74": ["garden spider", "Aranea diademata"], + "75": ["black widow", "Latrodectus mactans"], + "76": ["tarantula"], + "77": ["wolf spider", "hunting spider"], + "78": ["tick"], + "79": ["centipede"], + "80": ["black grouse"], + "81": ["ptarmigan"], + "82": ["ruffed grouse", "partridge", "Bonasa umbellus"], + "83": ["prairie chicken", "prairie grouse", "prairie fowl"], + "84": ["peacock"], + "85": ["quail"], + "86": ["partridge"], + "87": ["African grey", "African gray", "Psittacus erithacus"], + "88": ["macaw"], + "89": ["sulphur-crested cockatoo", "Kakatoe galerita", "Cacatua galerita"], + "90": ["lorikeet"], + "91": ["coucal"], + "92": ["bee eater"], + "93": ["hornbill"], + "94": ["hummingbird"], + "95": ["jacamar"], + "96": ["toucan"], + "97": ["drake"], + "98": ["red-breasted merganser", "Mergus serrator"], + "99": ["goose"], + "100": ["black swan", "Cygnus atratus"], + "101": ["tusker"], + "102": ["echidna", "spiny anteater", "anteater"], + "103": ["platypus", "duckbill", "duckbilled platypus", "duck-billed platypus", "Ornithorhynchus anatinus"], + "104": ["wallaby", "brush kangaroo"], + "105": ["koala", "koala bear", "kangaroo bear", "native bear", "Phascolarctos cinereus"], + "106": ["wombat"], + "107": ["jellyfish"], + "108": ["sea anemone", "anemone"], + "109": ["brain coral"], + "110": ["flatworm", "platyhelminth"], + "111": ["nematode", "nematode worm", "roundworm"], + "112": ["conch"], + "113": ["snail"], + "114": ["slug"], + "115": ["sea slug", "nudibranch"], + "116": ["chiton", "coat-of-mail shell", "sea cradle", "polyplacophore"], + "117": ["chambered nautilus", "pearly nautilus", "nautilus"], + "118": ["Dungeness crab", "Cancer magister"], + "119": ["rock crab", "Cancer irroratus"], + "120": ["fiddler crab"], + "121": ["king crab", "Alaska crab", "Alaskan king crab", "Alaska king crab", "Paralithodes camtschatica"], + "122": ["American lobster", "Northern lobster", "Maine lobster", "Homarus americanus"], + "123": ["spiny lobster", "langouste", "rock lobster", "crawfish", "crayfish", "sea crawfish"], + "124": ["crayfish", "crawfish", "crawdad", "crawdaddy"], + "125": ["hermit crab"], + "126": ["isopod"], + "127": ["white stork", "Ciconia ciconia"], + "128": ["black stork", "Ciconia nigra"], + "129": ["spoonbill"], + "130": ["flamingo"], + "131": ["little blue heron", "Egretta caerulea"], + "132": ["American egret", "great white heron", "Egretta albus"], + "133": ["bittern"], + "134": ["crane"], + "135": ["limpkin", "Aramus pictus"], + "136": ["European gallinule", "Porphyrio porphyrio"], + "137": ["American coot", "marsh hen", "mud hen", "water hen", "Fulica americana"], + "138": ["bustard"], + "139": ["ruddy turnstone", "Arenaria interpres"], + "140": ["red-backed sandpiper", "dunlin", "Erolia alpina"], + "141": ["redshank", "Tringa totanus"], + "142": ["dowitcher"], + "143": ["oystercatcher", "oyster catcher"], + "144": ["pelican"], + "145": ["king penguin", "Aptenodytes patagonica"], + "146": ["albatross", "mollymawk"], + "147": ["grey whale", "gray whale", "devilfish", "Eschrichtius gibbosus", "Eschrichtius robustus"], + "148": ["killer whale", "killer", "orca", "grampus", "sea wolf", "Orcinus orca"], + "149": ["dugong", "Dugong dugon"], + "150": ["sea lion"], + "151": ["Chihuahua"], + "152": ["Japanese spaniel"], + "153": ["Maltese dog", "Maltese terrier", "Maltese"], + "154": ["Pekinese", "Pekingese", "Peke"], + "155": ["Shih-Tzu"], + "156": ["Blenheim spaniel"], + "157": ["papillon"], + "158": ["toy terrier"], + "159": ["Rhodesian ridgeback"], + "160": ["Afghan hound", "Afghan"], + "161": ["basset", "basset hound"], + "162": ["beagle"], + "163": ["bloodhound", "sleuthhound"], + "164": ["bluetick"], + "165": ["black-and-tan coonhound"], + "166": ["Walker hound", "Walker foxhound"], + "167": ["English foxhound"], + "168": ["redbone"], + "169": ["borzoi", "Russian wolfhound"], + "170": ["Irish wolfhound"], + "171": ["Italian greyhound"], + "172": ["whippet"], + "173": ["Ibizan hound", "Ibizan Podenco"], + "174": ["Norwegian elkhound", "elkhound"], + "175": ["otterhound", "otter hound"], + "176": ["Saluki", "gazelle hound"], + "177": ["Scottish deerhound", "deerhound"], + "178": ["Weimaraner"], + "179": ["Staffordshire bullterrier", "Staffordshire bull terrier"], + "180": ["American Staffordshire terrier", "Staffordshire terrier", "American pit bull terrier", "pit bull terrier"], + "181": ["Bedlington terrier"], + "182": ["Border terrier"], + "183": ["Kerry blue terrier"], + "184": ["Irish terrier"], + "185": ["Norfolk terrier"], + "186": ["Norwich terrier"], + "187": ["Yorkshire terrier"], + "188": ["wire-haired fox terrier"], + "189": ["Lakeland terrier"], + "190": ["Sealyham terrier", "Sealyham"], + "191": ["Airedale", "Airedale terrier"], + "192": ["cairn", "cairn terrier"], + "193": ["Australian terrier"], + "194": ["Dandie Dinmont", "Dandie Dinmont terrier"], + "195": ["Boston bull", "Boston terrier"], + "196": ["miniature schnauzer"], + "197": ["giant schnauzer"], + "198": ["standard schnauzer"], + "199": ["Scotch terrier", "Scottish terrier", "Scottie"], + "200": ["Tibetan terrier", "chrysanthemum dog"], + "201": ["silky terrier", "Sydney silky"], + "202": ["soft-coated wheaten terrier"], + "203": ["West Highland white terrier"], + "204": ["Lhasa", "Lhasa apso"], + "205": ["flat-coated retriever"], + "206": ["curly-coated retriever"], + "207": ["golden retriever"], + "208": ["Labrador retriever"], + "209": ["Chesapeake Bay retriever"], + "210": ["German short-haired pointer"], + "211": ["vizsla", "Hungarian pointer"], + "212": ["English setter"], + "213": ["Irish setter", "red setter"], + "214": ["Gordon setter"], + "215": ["Brittany spaniel"], + "216": ["clumber", "clumber spaniel"], + "217": ["English springer", "English springer spaniel"], + "218": ["Welsh springer spaniel"], + "219": ["cocker spaniel", "English cocker spaniel", "cocker"], + "220": ["Sussex spaniel"], + "221": ["Irish water spaniel"], + "222": ["kuvasz"], + "223": ["schipperke"], + "224": ["groenendael"], + "225": ["malinois"], + "226": ["briard"], + "227": ["kelpie"], + "228": ["komondor"], + "229": ["Old English sheepdog", "bobtail"], + "230": ["Shetland sheepdog", "Shetland sheep dog", "Shetland"], + "231": ["collie"], + "232": ["Border collie"], + "233": ["Bouvier des Flandres", "Bouviers des Flandres"], + "234": ["Rottweiler"], + "235": ["German shepherd", "German shepherd dog", "German police dog", "alsatian"], + "236": ["Doberman", "Doberman pinscher"], + "237": ["miniature pinscher"], + "238": ["Greater Swiss Mountain dog"], + "239": ["Bernese mountain dog"], + "240": ["Appenzeller"], + "241": ["EntleBucher"], + "242": ["boxer"], + "243": ["bull mastiff"], + "244": ["Tibetan mastiff"], + "245": ["French bulldog"], + "246": ["Great Dane"], + "247": ["Saint Bernard", "St Bernard"], + "248": ["Eskimo dog", "husky"], + "249": ["malamute", "malemute", "Alaskan malamute"], + "250": ["Siberian husky"], + "251": ["dalmatian", "coach dog", "carriage dog"], + "252": ["affenpinscher", "monkey pinscher", "monkey dog"], + "253": ["basenji"], + "254": ["pug", "pug-dog"], + "255": ["Leonberg"], + "256": ["Newfoundland", "Newfoundland dog"], + "257": ["Great Pyrenees"], + "258": ["Samoyed", "Samoyede"], + "259": ["Pomeranian"], + "260": ["chow", "chow chow"], + "261": ["keeshond"], + "262": ["Brabancon griffon"], + "263": ["Pembroke", "Pembroke Welsh corgi"], + "264": ["Cardigan", "Cardigan Welsh corgi"], + "265": ["toy poodle"], + "266": ["miniature poodle"], + "267": ["standard poodle"], + "268": ["Mexican hairless"], + "269": ["timber wolf", "grey wolf", "gray wolf", "Canis lupus"], + "270": ["white wolf", "Arctic wolf", "Canis lupus tundrarum"], + "271": ["red wolf", "maned wolf", "Canis rufus", "Canis niger"], + "272": ["coyote", "prairie wolf", "brush wolf", "Canis latrans"], + "273": ["dingo", "warrigal", "warragal", "Canis dingo"], + "274": ["dhole", "Cuon alpinus"], + "275": ["African hunting dog", "hyena dog", "Cape hunting dog", "Lycaon pictus"], + "276": ["hyena", "hyaena"], + "277": ["red fox", "Vulpes vulpes"], + "278": ["kit fox", "Vulpes macrotis"], + "279": ["Arctic fox", "white fox", "Alopex lagopus"], + "280": ["grey fox", "gray fox", "Urocyon cinereoargenteus"], + "281": ["tabby", "tabby cat"], + "282": ["tiger cat"], + "283": ["Persian cat"], + "284": ["Siamese cat", "Siamese"], + "285": ["Egyptian cat"], + "286": ["cougar", "puma", "catamount", "mountain lion", "painter", "panther", "Felis concolor"], + "287": ["lynx", "catamount"], + "288": ["leopard", "Panthera pardus"], + "289": ["snow leopard", "ounce", "Panthera uncia"], + "290": ["jaguar", "panther", "Panthera onca", "Felis onca"], + "291": ["lion", "king of beasts", "Panthera leo"], + "292": ["tiger", "Panthera tigris"], + "293": ["cheetah", "chetah", "Acinonyx jubatus"], + "294": ["brown bear", "bruin", "Ursus arctos"], + "295": ["American black bear", "black bear", "Ursus americanus", "Euarctos americanus"], + "296": ["ice bear", "polar bear", "Ursus Maritimus", "Thalarctos maritimus"], + "297": ["sloth bear", "Melursus ursinus", "Ursus ursinus"], + "298": ["mongoose"], + "299": ["meerkat", "mierkat"], + "300": ["tiger beetle"], + "301": ["ladybug", "ladybeetle", "lady beetle", "ladybird", "ladybird beetle"], + "302": ["ground beetle", "carabid beetle"], + "303": ["long-horned beetle", "longicorn", "longicorn beetle"], + "304": ["leaf beetle", "chrysomelid"], + "305": ["dung beetle"], + "306": ["rhinoceros beetle"], + "307": ["weevil"], + "308": ["fly"], + "309": ["bee"], + "310": ["ant", "emmet", "pismire"], + "311": ["grasshopper", "hopper"], + "312": ["cricket"], + "313": ["walking stick", "walkingstick", "stick insect"], + "314": ["cockroach", "roach"], + "315": ["mantis", "mantid"], + "316": ["cicada", "cicala"], + "317": ["leafhopper"], + "318": ["lacewing", "lacewing fly"], + "319": ["dragonfly", "darning needle", "devil's darning needle", "sewing needle", \ + "snake feeder", "snake doctor", "mosquito hawk", "skeeter hawk"], + "320": ["damselfly"], + "321": ["admiral"], + "322": ["ringlet", "ringlet butterfly"], + "323": ["monarch", "monarch butterfly", "milkweed butterfly", "Danaus plexippus"], + "324": ["cabbage butterfly"], + "325": ["sulphur butterfly", "sulfur butterfly"], + "326": ["lycaenid", "lycaenid butterfly"], + "327": ["starfish", "sea star"], + "328": ["sea urchin"], + "329": ["sea cucumber", "holothurian"], + "330": ["wood rabbit", "cottontail", "cottontail rabbit"], + "331": ["hare"], + "332": ["Angora", "Angora rabbit"], + "333": ["hamster"], + "334": ["porcupine", "hedgehog"], + "335": ["fox squirrel", "eastern fox squirrel", "Sciurus niger"], + "336": ["marmot"], + "337": ["beaver"], + "338": ["guinea pig", "Cavia cobaya"], + "339": ["sorrel"], + "340": ["zebra"], + "341": ["hog", "pig", "grunter", "squealer", "Sus scrofa"], + "342": ["wild boar", "boar", "Sus scrofa"], + "343": ["warthog"], + "344": ["hippopotamus", "hippo", "river horse", "Hippopotamus amphibius"], + "345": ["ox"], + "346": ["water buffalo", "water ox", "Asiatic buffalo", "Bubalus bubalis"], + "347": ["bison"], + "348": ["ram", "tup"], + "349": ["bighorn", "bighorn sheep", "cimarron", "Rocky Mountain bighorn", "Rocky Mountain sheep", \ + "Ovis canadensis"], + "350": ["ibex", "Capra ibex"], + "351": ["hartebeest"], + "352": ["impala", "Aepyceros melampus"], + "353": ["gazelle"], + "354": ["Arabian camel", "dromedary", "Camelus dromedarius"], + "355": ["llama"], + "356": ["weasel"], + "357": ["mink"], + "358": ["polecat", "fitch", "foulmart", "foumart", "Mustela putorius"], + "359": ["black-footed ferret", "ferret", "Mustela nigripes"], + "360": ["otter"], + "361": ["skunk", "polecat", "wood pussy"], + "362": ["badger"], + "363": ["armadillo"], + "364": ["three-toed sloth", "ai", "Bradypus tridactylus"], + "365": ["orangutan", "orang", "orangutang", "Pongo pygmaeus"], + "366": ["gorilla", "Gorilla gorilla"], + "367": ["chimpanzee", "chimp", "Pan troglodytes"], + "368": ["gibbon", "Hylobates lar"], + "369": ["siamang", "Hylobates syndactylus", "Symphalangus syndactylus"], + "370": ["guenon", "guenon monkey"], + "371": ["patas", "hussar monkey", "Erythrocebus patas"], + "372": ["baboon"], + "373": ["macaque"], + "374": ["langur"], + "375": ["colobus", "colobus monkey"], + "376": ["proboscis monkey", "Nasalis larvatus"], + "377": ["marmoset"], + "378": ["capuchin", "ringtail", "Cebus capucinus"], + "379": ["howler monkey", "howler"], + "380": ["titi", "titi monkey"], + "381": ["spider monkey", "Ateles geoffroyi"], + "382": ["squirrel monkey", "Saimiri sciureus"], + "383": ["Madagascar cat", "ring-tailed lemur", "Lemur catta"], + "384": ["indri", "indris", "Indri indri", "Indri brevicaudatus"], + "385": ["Indian elephant", "Elephas maximus"], + "386": ["African elephant", "Loxodonta africana"], + "387": ["lesser panda", "red panda", "panda", "bear cat", "cat bear", "Ailurus fulgens"], + "388": ["giant panda", "panda", "panda bear", "coon bear", "Ailuropoda melanoleuca"], + "389": ["barracouta", "snoek"], + "390": ["eel"], + "391": ["coho", "cohoe", "coho salmon", "blue jack", "silver salmon", "Oncorhynchus kisutch"], + "392": ["rock beauty", "Holocanthus tricolor"], + "393": ["anemone fish"], + "394": ["sturgeon"], + "395": ["gar", "garfish", "garpike", "billfish", "Lepisosteus osseus"], + "396": ["lionfish"], + "397": ["puffer", "pufferfish", "blowfish", "globefish"], + "398": ["abacus"], + "399": ["abaya"], + "400": ["academic gown", "academic robe", "judge's robe"], + "401": ["accordion", "piano accordion", "squeeze box"], + "402": ["acoustic guitar"], + "403": ["aircraft carrier", "carrier", "flattop", "attack aircraft carrier"], + "404": ["airliner"], + "405": ["airship", "dirigible"], + "406": ["altar"], + "407": ["ambulance"], + "408": ["amphibian", "amphibious vehicle"], + "409": ["analog clock"], + "410": ["apiary", "bee house"], + "411": ["apron"], + "412": ["ashcan", "trash can", "garbage can", "wastebin", "ash bin", "ash-bin", "ashbin",\ + "dustbin", "trash barrel", "trash bin"], + "413": ["assault rifle", "assault gun"], + "414": ["backpack", "back pack", "knapsack", "packsack", "rucksack", "haversack"], + "415": ["bakery", "bakeshop", "bakehouse"], + "416": ["balance beam", "beam"], + "417": ["balloon"], + "418": ["ballpoint", "ballpoint pen", "ballpen", "Biro"], + "419": ["Band Aid"], + "420": ["banjo"], + "421": ["bannister", "banister", "balustrade", "balusters", "handrail"], + "422": ["barbell"], + "423": ["barber chair"], + "424": ["barbershop"], + "425": ["barn"], + "426": ["barometer"], + "427": ["barrel", "cask"], + "428": ["barrow", "garden cart", "lawn cart", "wheelbarrow"], + "429": ["baseball"], + "430": ["basketball"], + "431": ["bassinet"], + "432": ["bassoon"], + "433": ["bathing cap", "swimming cap"], + "434": ["bath towel"], + "435": ["bathtub", "bathing tub", "bath", "tub"], + "436": ["beach wagon", "station wagon", "wagon", "estate car", "beach waggon", "station waggon", "waggon"], + "437": ["beacon", "lighthouse", "beacon light", "pharos"], + "438": ["beaker"], + "439": ["bearskin", "busby", "shako"], + "440": ["beer bottle"], + "441": ["beer glass"], + "442": ["bell cote", "bell cot"], + "443": ["bib"], + "444": ["bicycle-built-for-two", "tandem bicycle", "tandem"], + "445": ["bikini", "two-piece"], + "446": ["binder", "ring-binder"], + "447": ["binoculars", "field glasses", "opera glasses"], + "448": ["birdhouse"], + "449": ["boathouse"], + "450": ["bobsled", "bobsleigh", "bob"], + "451": ["bolo tie", "bolo", "bola tie", "bola"], + "452": ["bonnet", "poke bonnet"], + "453": ["bookcase"], + "454": ["bookshop", "bookstore", "bookstall"], + "455": ["bottlecap"], + "456": ["bow"], + "457": ["bow tie", "bow-tie", "bowtie"], + "458": ["brass", "memorial tablet", "plaque"], + "459": ["brassiere", "bra", "bandeau"], + "460": ["breakwater", "groin", "groyne", "mole", "bulwark", "seawall", "jetty"], + "461": ["breastplate", "aegis", "egis"], + "462": ["broom"], + "463": ["bucket", "pail"], + "464": ["buckle"], + "465": ["bulletproof vest"], + "466": ["bullet train", "bullet"], + "467": ["butcher shop", "meat market"], + "468": ["cab", "hack", "taxi", "taxicab"], + "469": ["caldron", "cauldron"], + "470": ["candle", "taper", "wax light"], + "471": ["cannon"], + "472": ["canoe"], + "473": ["can opener", "tin opener"], + "474": ["cardigan"], + "475": ["car mirror"], + "476": ["carousel", "carrousel", "merry-go-round", "roundabout", "whirligig"], + "477": ["carpenter's kit", "tool kit"], + "478": ["carton"], + "479": ["car wheel"], + "480": ["cash machine", "cash dispenser", "automated teller machine", "automatic teller machine",\ + "automated teller", "automatic teller", "ATM"], + "481": ["cassette"], + "482": ["cassette player"], + "483": ["castle"], + "484": ["catamaran"], + "485": ["CD player"], + "486": ["cello", "violoncello"], + "487": ["cellular telephone", "cellular phone", "cellphone", "cell", "mobile phone"], + "488": ["chain"], + "489": ["chainlink fence"], + "490": ["chain mail", "ring mail", "mail", "chain armor", "chain armour", "ring armor", "ring armour"], + "491": ["chain saw", "chainsaw"], + "492": ["chest"], + "493": ["chiffonier", "commode"], + "494": ["chime", "bell", "gong"], + "495": ["china cabinet", "china closet"], + "496": ["Christmas stocking"], + "497": ["church", "church building"], + "498": ["cinema", "movie theater", "movie theatre", "movie house", "picture palace"], + "499": ["cleaver", "meat cleaver", "chopper"], + "500": ["cliff dwelling"], + "501": ["cloak"], + "502": ["clog", "geta", "patten", "sabot"], + "503": ["cocktail shaker"], + "504": ["coffee mug"], + "505": ["coffeepot"], + "506": ["coil", "spiral", "volute", "whorl", "helix"], + "507": ["combination lock"], + "508": ["computer keyboard", "keypad"], + "509": ["confectionery", "confectionary", "candy store"], + "510": ["container ship", "containership", "container vessel"], + "511": ["convertible"], + "512": ["corkscrew", "bottle screw"], + "513": ["cornet", "horn", "trumpet", "trump"], + "514": ["cowboy boot"], + "515": ["cowboy hat", "ten-gallon hat"], + "516": ["cradle"], + "517": ["crane"], + "518": ["crash helmet"], + "519": ["crate"], + "520": ["crib", "cot"], + "521": ["Crock Pot"], + "522": ["croquet ball"], + "523": ["crutch"], + "524": ["cuirass"], + "525": ["dam", "dike", "dyke"], + "526": ["desk"], + "527": ["desktop computer"], + "528": ["dial telephone", "dial phone"], + "529": ["diaper", "nappy", "napkin"], + "530": ["digital clock"], + "531": ["digital watch"], + "532": ["dining table", "board"], + "533": ["dishrag", "dishcloth"], + "534": ["dishwasher", "dish washer", "dishwashing machine"], + "535": ["disk brake", "disc brake"], + "536": ["dock", "dockage", "docking facility"], + "537": ["dogsled", "dog sled", "dog sleigh"], + "538": ["dome"], + "539": ["doormat", "welcome mat"], + "540": ["drilling platform", "offshore rig"], + "541": ["drum", "membranophone", "tympan"], + "542": ["drumstick"], + "543": ["dumbbell"], + "544": ["Dutch oven"], + "545": ["electric fan", "blower"], + "546": ["electric guitar"], + "547": ["electric locomotive"], + "548": ["entertainment center"], + "549": ["envelope"], + "550": ["espresso maker"], + "551": ["face powder"], + "552": ["feather boa", "boa"], + "553": ["file", "file cabinet", "filing cabinet"], + "554": ["fireboat"], + "555": ["fire engine", "fire truck"], + "556": ["fire screen", "fireguard"], + "557": ["flagpole", "flagstaff"], + "558": ["flute", "transverse flute"], + "559": ["folding chair"], + "560": ["football helmet"], + "561": ["forklift"], + "562": ["fountain"], + "563": ["fountain pen"], + "564": ["four-poster"], + "565": ["freight car"], + "566": ["French horn", "horn"], + "567": ["frying pan", "frypan", "skillet"], + "568": ["fur coat"], + "569": ["garbage truck", "dustcart"], + "570": ["gasmask", "respirator", "gas helmet"], + "571": ["gas pump", "gasoline pump", "petrol pump", "island dispenser"], + "572": ["goblet"], + "573": ["go-kart"], + "574": ["golf ball"], + "575": ["golfcart", "golf cart"], + "576": ["gondola"], + "577": ["gong", "tam-tam"], + "578": ["gown"], + "579": ["grand piano", "grand"], + "580": ["greenhouse", "nursery", "glasshouse"], + "581": ["grille", "radiator grille"], + "582": ["grocery store", "grocery", "food market", "market"], + "583": ["guillotine"], + "584": ["hair slide"], + "585": ["hair spray"], + "586": ["half track"], + "587": ["hammer"], + "588": ["hamper"], + "589": ["hand blower", "blow dryer", "blow drier", "hair dryer", "hair drier"], + "590": ["hand-held computer", "hand-held microcomputer"], + "591": ["handkerchief", "hankie", "hanky", "hankey"], + "592": ["hard disc", "hard disk", "fixed disk"], + "593": ["harmonica", "mouth organ", "harp", "mouth harp"], + "594": ["harp"], + "595": ["harvester", "reaper"], + "596": ["hatchet"], + "597": ["holster"], + "598": ["home theater", "home theatre"], + "599": ["honeycomb"], + "600": ["hook", "claw"], + "601": ["hoopskirt", "crinoline"], + "602": ["horizontal bar", "high bar"], + "603": ["horse cart", "horse-cart"], + "604": ["hourglass"], + "605": ["iPod"], + "606": ["iron", "smoothing iron"], + "607": ["jack-o'-lantern"], + "608": ["jean", "blue jean", "denim"], + "609": ["jeep", "landrover"], + "610": ["jersey", "T-shirt", "tee shirt"], + "611": ["jigsaw puzzle"], + "612": ["jinrikisha", "ricksha", "rickshaw"], + "613": ["joystick"], + "614": ["kimono"], + "615": ["knee pad"], + "616": ["knot"], + "617": ["lab coat", "laboratory coat"], + "618": ["ladle"], + "619": ["lampshade", "lamp shade"], + "620": ["laptop", "laptop computer"], + "621": ["lawn mower", "mower"], + "622": ["lens cap", "lens cover"], + "623": ["letter opener", "paper knife", "paperknife"], + "624": ["library"], + "625": ["lifeboat"], + "626": ["lighter", "light", "igniter", "ignitor"], + "627": ["limousine", "limo"], + "628": ["liner", "ocean liner"], + "629": ["lipstick", "lip rouge"], + "630": ["Loafer"], + "631": ["lotion"], + "632": ["loudspeaker", "speaker", "speaker unit", "loudspeaker system", "speaker system"], + "633": ["loupe", "jeweler's loupe"], + "634": ["lumbermill", "sawmill"], + "635": ["magnetic compass"], + "636": ["mailbag", "postbag"], + "637": ["mailbox", "letter box"], + "638": ["maillot"], + "639": ["maillot", "tank suit"], + "640": ["manhole cover"], + "641": ["maraca"], + "642": ["marimba", "xylophone"], + "643": ["mask"], + "644": ["matchstick"], + "645": ["maypole"], + "646": ["maze", "labyrinth"], + "647": ["measuring cup"], + "648": ["medicine chest", "medicine cabinet"], + "649": ["megalith", "megalithic structure"], + "650": ["microphone", "mike"], + "651": ["microwave", "microwave oven"], + "652": ["military uniform"], + "653": ["milk can"], + "654": ["minibus"], + "655": ["miniskirt", "mini"], + "656": ["minivan"], + "657": ["missile"], + "658": ["mitten"], + "659": ["mixing bowl"], + "660": ["mobile home", "manufactured home"], + "661": ["Model T"], + "662": ["modem"], + "663": ["monastery"], + "664": ["monitor"], + "665": ["moped"], + "666": ["mortar"], + "667": ["mortarboard"], + "668": ["mosque"], + "669": ["mosquito net"], + "670": ["motor scooter", "scooter"], + "671": ["mountain bike", "all-terrain bike", "off-roader"], + "672": ["mountain tent"], + "673": ["mouse", "computer mouse"], + "674": ["mousetrap"], + "675": ["moving van"], + "676": ["muzzle"], + "677": ["nail"], + "678": ["neck brace"], + "679": ["necklace"], + "680": ["nipple"], + "681": ["notebook", "notebook computer"], + "682": ["obelisk"], + "683": ["oboe", "hautboy", "hautbois"], + "684": ["ocarina", "sweet potato"], + "685": ["odometer", "hodometer", "mileometer", "milometer"], + "686": ["oil filter"], + "687": ["organ", "pipe organ"], + "688": ["oscilloscope", "scope", "cathode-ray oscilloscope", "CRO"], + "689": ["overskirt"], + "690": ["oxcart"], + "691": ["oxygen mask"], + "692": ["packet"], + "693": ["paddle", "boat paddle"], + "694": ["paddlewheel", "paddle wheel"], + "695": ["padlock"], + "696": ["paintbrush"], + "697": ["pajama", "pyjama", "pj's", "jammies"], + "698": ["palace"], + "699": ["panpipe", "pandean pipe", "syrinx"], + "700": ["paper towel"], + "701": ["parachute", "chute"], + "702": ["parallel bars", "bars"], + "703": ["park bench"], + "704": ["parking meter"], + "705": ["passenger car", "coach", "carriage"], + "706": ["patio", "terrace"], + "707": ["pay-phone", "pay-station"], + "708": ["pedestal", "plinth", "footstall"], + "709": ["pencil box", "pencil case"], + "710": ["pencil sharpener"], + "711": ["perfume", "essence"], + "712": ["Petri dish"], + "713": ["photocopier"], + "714": ["pick", "plectrum", "plectron"], + "715": ["pickelhaube"], + "716": ["picket fence", "paling"], + "717": ["pickup", "pickup truck"], + "718": ["pier"], + "719": ["piggy bank", "penny bank"], + "720": ["pill bottle"], + "721": ["pillow"], + "722": ["ping-pong ball"], + "723": ["pinwheel"], + "724": ["pirate", "pirate ship"], + "725": ["pitcher", "ewer"], + "726": ["plane", "carpenter's plane", "woodworking plane"], + "727": ["planetarium"], + "728": ["plastic bag"], + "729": ["plate rack"], + "730": ["plow", "plough"], + "731": ["plunger", "plumber's helper"], + "732": ["Polaroid camera", "Polaroid Land camera"], + "733": ["pole"], + "734": ["police van", "police wagon", "paddy wagon", "patrol wagon", "wagon", "black Maria"], + "735": ["poncho"], + "736": ["pool table", "billiard table", "snooker table"], + "737": ["pop bottle", "soda bottle"], + "738": ["pot", "flowerpot"], + "739": ["potter's wheel"], + "740": ["power drill"], + "741": ["prayer rug", "prayer mat"], + "742": ["printer"], + "743": ["prison", "prison house"], + "744": ["projectile", "missile"], + "745": ["projector"], + "746": ["puck", "hockey puck"], + "747": ["punching bag", "punch bag", "punching ball", "punchball"], + "748": ["purse"], + "749": ["quill", "quill pen"], + "750": ["quilt", "comforter", "comfort", "puff"], + "751": ["racer", "race car", "racing car"], + "752": ["racket", "racquet"], + "753": ["radiator"], + "754": ["radio", "wireless"], + "755": ["radio telescope", "radio reflector"], + "756": ["rain barrel"], + "757": ["recreational vehicle", "RV", "R.V."], + "758": ["reel"], + "759": ["reflex camera"], + "760": ["refrigerator", "icebox"], + "761": ["remote control", "remote"], + "762": ["restaurant", "eating house", "eating place", "eatery"], + "763": ["revolver", "six-gun", "six-shooter"], + "764": ["rifle"], + "765": ["rocking chair", "rocker"], + "766": ["rotisserie"], + "767": ["rubber eraser", "rubber", "pencil eraser"], + "768": ["rugby ball"], + "769": ["rule", "ruler"], + "770": ["running shoe"], + "771": ["safe"], + "772": ["safety pin"], + "773": ["saltshaker", "salt shaker"], + "774": ["sandal"], + "775": ["sarong"], + "776": ["sax", "saxophone"], + "777": ["scabbard"], + "778": ["scale", "weighing machine"], + "779": ["school bus"], + "780": ["schooner"], + "781": ["scoreboard"], + "782": ["screen", "CRT screen"], + "783": ["screw"], + "784": ["screwdriver"], + "785": ["seat belt", "seatbelt"], + "786": ["sewing machine"], + "787": ["shield", "buckler"], + "788": ["shoe shop", "shoe-shop", "shoe store"], + "789": ["shoji"], + "790": ["shopping basket"], + "791": ["shopping cart"], + "792": ["shovel"], + "793": ["shower cap"], + "794": ["shower curtain"], + "795": ["ski"], + "796": ["ski mask"], + "797": ["sleeping bag"], + "798": ["slide rule", "slipstick"], + "799": ["sliding door"], + "800": ["slot", "one-armed bandit"], + "801": ["snorkel"], + "802": ["snowmobile"], + "803": ["snowplow", "snowplough"], + "804": ["soap dispenser"], + "805": ["soccer ball"], + "806": ["sock"], + "807": ["solar dish", "solar collector", "solar furnace"], + "808": ["sombrero"], + "809": ["soup bowl"], + "810": ["space bar"], + "811": ["space heater"], + "812": ["space shuttle"], + "813": ["spatula"], + "814": ["speedboat"], + "815": ["spider web", "spider's web"], + "816": ["spindle"], + "817": ["sports car", "sport car"], + "818": ["spotlight", "spot"], + "819": ["stage"], + "820": ["steam locomotive"], + "821": ["steel arch bridge"], + "822": ["steel drum"], + "823": ["stethoscope"], + "824": ["stole"], + "825": ["stone wall"], + "826": ["stopwatch", "stop watch"], + "827": ["stove"], + "828": ["strainer"], + "829": ["streetcar", "tram", "tramcar", "trolley", "trolley car"], + "830": ["stretcher"], + "831": ["studio couch", "day bed"], + "832": ["stupa", "tope"], + "833": ["submarine", "pigboat", "sub", "U-boat"], + "834": ["suit", "suit of clothes"], + "835": ["sundial"], + "836": ["sunglass"], + "837": ["sunglasses", "dark glasses", "shades"], + "838": ["sunscreen", "sunblock", "sun blocker"], + "839": ["suspension bridge"], + "840": ["swab", "swob", "mop"], + "841": ["sweatshirt"], + "842": ["swimming trunks", "bathing trunks"], + "843": ["swing"], + "844": ["switch", "electric switch", "electrical switch"], + "845": ["syringe"], + "846": ["table lamp"], + "847": ["tank", "army tank", "armored combat vehicle", "armoured combat vehicle"], + "848": ["tape player"], + "849": ["teapot"], + "850": ["teddy", "teddy bear"], + "851": ["television", "television system"], + "852": ["tennis ball"], + "853": ["thatch", "thatched roof"], + "854": ["theater curtain", "theatre curtain"], + "855": ["thimble"], + "856": ["thresher", "thrasher", "threshing machine"], + "857": ["throne"], + "858": ["tile roof"], + "859": ["toaster"], + "860": ["tobacco shop", "tobacconist shop", "tobacconist"], + "861": ["toilet seat"], + "862": ["torch"], + "863": ["totem pole"], + "864": ["tow truck", "tow car", "wrecker"], + "865": ["toyshop"], + "866": ["tractor"], + "867": ["trailer truck", "tractor trailer", "trucking rig", "rig", "articulated lorry", "semi"], + "868": ["tray"], + "869": ["trench coat"], + "870": ["tricycle", "trike", "velocipede"], + "871": ["trimaran"], + "872": ["tripod"], + "873": ["triumphal arch"], + "874": ["trolleybus", "trolley coach", "trackless trolley"], + "875": ["trombone"], + "876": ["tub", "vat"], + "877": ["turnstile"], + "878": ["typewriter keyboard"], + "879": ["umbrella"], + "880": ["unicycle", "monocycle"], + "881": ["upright", "upright piano"], + "882": ["vacuum", "vacuum cleaner"], + "883": ["vase"], + "884": ["vault"], + "885": ["velvet"], + "886": ["vending machine"], + "887": ["vestment"], + "888": ["viaduct"], + "889": ["violin", "fiddle"], + "890": ["volleyball"], + "891": ["waffle iron"], + "892": ["wall clock"], + "893": ["wallet", "billfold", "notecase", "pocketbook"], + "894": ["wardrobe", "closet", "press"], + "895": ["warplane", "military plane"], + "896": ["washbasin", "handbasin", "washbowl", "lavabo", "wash-hand basin"], + "897": ["washer", "automatic washer", "washing machine"], + "898": ["water bottle"], + "899": ["water jug"], + "900": ["water tower"], + "901": ["whiskey jug"], + "902": ["whistle"], + "903": ["wig"], + "904": ["window screen"], + "905": ["window shade"], + "906": ["Windsor tie"], + "907": ["wine bottle"], + "908": ["wing"], + "909": ["wok"], + "910": ["wooden spoon"], + "911": ["wool", "woolen", "woollen"], + "912": ["worm fence", "snake fence", "snake-rail fence", "Virginia fence"], + "913": ["wreck"], + "914": ["yawl"], + "915": ["yurt"], + "916": ["web site", "website", "internet site", "site"], + "917": ["comic book"], + "918": ["crossword puzzle", "crossword"], + "919": ["street sign"], + "920": ["traffic light", "traffic signal", "stoplight"], + "921": ["book jacket", "dust cover", "dust jacket", "dust wrapper"], + "922": ["menu"], + "923": ["plate"], + "924": ["guacamole"], + "925": ["consomme"], + "926": ["hot pot", "hotpot"], + "927": ["trifle"], + "928": ["ice cream", "icecream"], + "929": ["ice lolly", "lolly", "lollipop", "popsicle"], + "930": ["French loaf"], + "931": ["bagel", "beigel"], + "932": ["pretzel"], + "933": ["cheeseburger"], + "934": ["hotdog", "hot dog", "red hot"], + "935": ["mashed potato"], + "936": ["head cabbage"], + "937": ["broccoli"], + "938": ["cauliflower"], + "939": ["zucchini", "courgette"], + "940": ["spaghetti squash"], + "941": ["acorn squash"], + "942": ["butternut squash"], + "943": ["cucumber", "cuke"], + "944": ["artichoke", "globe artichoke"], + "945": ["bell pepper"], + "946": ["cardoon"], + "947": ["mushroom"], + "948": ["Granny Smith"], + "949": ["strawberry"], + "950": ["orange"], + "951": ["lemon"], + "952": ["fig"], + "953": ["pineapple", "ananas"], + "954": ["banana"], + "955": ["jackfruit", "jak", "jack"], + "956": ["custard apple"], + "957": ["pomegranate"], + "958": ["hay"], + "959": ["carbonara"], + "960": ["chocolate sauce", "chocolate syrup"], + "961": ["dough"], + "962": ["meat loaf", "meatloaf"], + "963": ["pizza", "pizza pie"], + "964": ["potpie"], + "965": ["burrito"], + "966": ["red wine"], + "967": ["espresso"], + "968": ["cup"], + "969": ["eggnog"], + "970": ["alp"], + "971": ["bubble"], + "972": ["cliff", "drop", "drop-off"], + "973": ["coral reef"], + "974": ["geyser"], + "975": ["lakeside", "lakeshore"], + "976": ["promontory", "headland", "head", "foreland"], + "977": ["sandbar", "sand bar"], + "978": ["seashore", "coast", "seacoast", "sea-coast"], + "979": ["valley", "vale"], + "980": ["volcano"], + "981": ["ballplayer", "baseball player"], + "982": ["groom", "bridegroom"], + "983": ["scuba diver"], + "984": ["rapeseed"], + "985": ["daisy"], + "986": ["yellow lady's slipper", "yellow lady-slipper", "Cypripedium calceolus", "Cypripedium parviflorum"], + "987": ["corn"], + "988": ["acorn"], + "989": ["hip", "rose hip", "rosehip"], + "990": ["buckeye", "horse chestnut", "conker"], + "991": ["coral fungus"], + "992": ["agaric"], + "993": ["gyromitra"], + "994": ["stinkhorn", "carrion fungus"], + "995": ["earthstar"], + "996": ["hen-of-the-woods", "hen of the woods", "Polyporus frondosus", "Grifola frondosa"], + "997": ["bolete"], + "998": ["ear", "spike", "capitulum"], + "999": ["toilet tissue", "toilet paper", "bathroom tissue"] +} diff --git a/Samples/YOLOV5MultiInput/python/README.md b/Samples/YOLOV5MultiInput/python/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3f4a1b69c6662c6200f360b28d71cd730def5f1d --- /dev/null +++ b/Samples/YOLOV5MultiInput/python/README.md @@ -0,0 +1,96 @@ +# 目标检测(YoloV5s) + +#### 样例介绍 + +使用多路离线视频流(*.mp4)作为应用程序的输入,基于YoloV5s模型对输入视频中的物体做实时检测,将推理结果信息使用imshow方式显示。 +样例代码逻辑如下所示:![输入图片说明](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/samples-pic/EdgeAndRobotics/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%A4%BA%E4%BE%8B%E5%9B%BE%E7%89%87.png) + +#### 样例下载 + +可以使用以下两种方式下载,请选择其中一种进行源码准备。 + +- 命令行方式下载(**下载时间较长,但步骤简单**)。 + + ``` + # 登录开发板,HwHiAiUser用户命令行中执行以下命令下载源码仓。 + cd ${HOME} + git clone https://gitee.com/ascend/EdgeAndRobotics.git + # 切换到样例目录 + cd EdgeAndRobotics/Samples/YOLOV5MultiInput + ``` + +- 压缩包方式下载(**下载时间较短,但步骤稍微复杂**)。 + + ``` + # 1. 仓右上角选择 【克隆/下载】 下拉框并选择 【下载ZIP】。 + # 2. 将ZIP包上传到开发板的普通用户家目录中,【例如:${HOME}/EdgeAndRobotics-master.zip】。 + # 3. 开发环境中,执行以下命令,解压zip包。 + cd ${HOME} + chmod +x EdgeAndRobotics-master.zip + unzip EdgeAndRobotics-master.zip + # 4. 切换到样例目录 + cd EdgeAndRobotics-master/Samples/YOLOV5MultiInput/python + ``` + +#### 准备环境 + +1. 以HwHiAiUser用户登录开发板。 + +2. 安装ACLLite库。 + + 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装PyACLLite库。 + + +#### 运行样例 + +1. 以HwHiAiUser用户登录开发板,切换到当前样例目录。 + +2. 获取PyTorch框架的YoloV5s模型(\*.onnx),并转换为昇腾AI处理器能识别的模型(\*.om)。 + - 当设备内存**小于8G**时,可设置如下两个环境变量减少atc模型转换过程中使用的进程数,减小内存占用。 + ``` + export TE_PARALLEL_COMPILER=1 + export MAX_COMPILE_CORE_NUMBER=1 + ``` + - 为了方便下载,在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。 + ``` + cd model + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/yolov5s_nms.onnx --no-check-certificate + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/aipp_rgb.cfg --no-check-certificate + atc --model=yolov5s_nms.onnx --framework=5 --output=yolov5s_rgb --input_shape="images:1,3,640,640;img_info:1,4" --soc_version=Ascend310B4 --insert_op_conf=aipp_rgb.cfg + ``` + +* Home page: https://www.hiascend.com/hardware/developer-kit-a2 +* Documentation: https://www.hiascend.com/hardware/developer-kit-a2/resource + atc命令中各参数的解释如下,详细约束说明请参见[《ATC模型转换指南》](https://hiascend.com/document/redirect/CannCommunityAtc)。 + + - --model:YoloV5s网络的模型文件的路径。 + - --framework:原始框架类型。5表示ONNX。 + - --output:om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。 + - --input\_shape:模型输入数据的shape。 + - --soc\_version:昇腾AI处理器的版本。 + +3. 准备测试视频。 + + 请从以下链接获取该样例的测试视频,放在data目录下。 + + ``` + cd ../data + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/test.mp4 --no-check-certificate + ``` + + **注:**若需更换测试视频,则需自行准备测试视频,并将测试视频放到data目录下。 + +4. 运行样例。 + + ``` + bash sample_run.sh + ``` + +#### 相关操作 + +- 获取更多样例,请单击[Link](https://gitee.com/ascend/samples/tree/master/inference/modelInference)。 +- 获取在线视频课程,请单击[Link](https://www.hiascend.com/edu/courses?activeTab=%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91)。 +- 获取学习文档,请单击[AscendCL python](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/80RC1alpha002/devguide/appdevg/aclpythondevg/aclpythondevg_0001.html),查看最新版本的AscendCL推理应用开发指南。 +- 查模型的输入输出 + + 可使用第三方工具Netron打开网络模型,查看模型输入或输出的数据类型、Shape,便于在分析应用开发场景时使用。 diff --git a/Samples/YOLOV5MultiInput/python/data/.keep b/Samples/YOLOV5MultiInput/python/data/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/YOLOV5MultiInput/python/model/.keep b/Samples/YOLOV5MultiInput/python/model/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/YOLOV5MultiInput/python/scripts/sample_run.sh b/Samples/YOLOV5MultiInput/python/scripts/sample_run.sh new file mode 100644 index 0000000000000000000000000000000000000000..edae8439b50737ef9b18f1a881ce2116f4b7b6f4 --- /dev/null +++ b/Samples/YOLOV5MultiInput/python/scripts/sample_run.sh @@ -0,0 +1,12 @@ +#!/bin/bash +ScriptPath="$( cd "$(dirname "$BASH_SOURCE")" ; pwd -P )" + +echo "[INFO] The sample starts to run" +running_command="python3 YOLOV5MultiInput.py" +cd ${ScriptPath}/../src +${running_command} +if [ $? -ne 0 ];then + echo "[INFO] The program runs failed" +else + echo "[INFO] The program runs successfully" +fi diff --git a/Samples/YOLOV5MultiInput/python/src/YOLOV5MultiInput.py b/Samples/YOLOV5MultiInput/python/src/YOLOV5MultiInput.py new file mode 100644 index 0000000000000000000000000000000000000000..596456db447bc3ed8eed6c043cf0abfd7604f19d --- /dev/null +++ b/Samples/YOLOV5MultiInput/python/src/YOLOV5MultiInput.py @@ -0,0 +1,158 @@ +import numpy as np +import videocapture as video +import acl +import acllite_utils as utils +import time +import cv2 +import constants as const + +from acllite_resource import AclLiteResource +from acllite_model import AclLiteModel +from acllite_imageproc import AclLiteImageProc +from acllite_image import AclLiteImage +from acllite_logger import log_error, log_info +from multiprocessing import Process, Queue, Pool, Value + +Q_PRE_SIZE = 32 +Q_OUT_SIZE = 32 +VIDEO_WIDTH = 1920 +VIDEO_HEIGHT = 1080 +WAIT_TIME = 0.000003 +labels = ["person", "bicycle", "car", "motorbike", "aeroplane", + "bus", "train", "truck", "boat", "traffic light", + "fire hydrant", "stop sign", "parking meter", "bench", "bird", + "cat", "dog", "horse", "sheep", "cow", + "elephant", "bear", "zebra", "giraffe", "backpack", + "umbrella", "handbag", "tie", "suitcase", "frisbee", + "skis", "snowboard", "sports ball", "kite", "baseball bat", + "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", + "wine glass", "cup", "fork", "knife", "spoon", + "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", + "pizza", "donut", "cake", "chair", "sofa", "potted plant", "bed", "dining table", + "toilet", "TV monitor", "laptop", "mouse", "remote", "keyboard", "cell phone", + "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", + "scissors", "teddy bear", "hair drier", "toothbrush"] + +def preprocess(path, q_pre, model_width, model_height, channel): + print(f'sub process preprocess{i} start') + VIDEO_WIDTH = 1920 + VIDEO_HEIGHT = 1080 + scale_x = VIDEO_WIDTH / model_width + scale_y = VIDEO_HEIGHT / model_height + # get scale factor + if scale_x > scale_y: + max_scale = scale_x + resize_shape = (model_width, int(VIDEO_HEIGHT/max_scale)) + else: + max_scale = scale_y + resize_shape = (int(VIDEO_WIDTH/max_scale), model_height) + count = 0 + cap = cv2.VideoCapture(path) + if not cap.isOpened() : + print('video connect failed') + exit(0) + while True: + ret, frame = cap.read() + if not ret: # + print('cap read end! close subprocess cap read') + q_pre.put('EOF') + break + else: + img = np.zeros([model_height, model_width, 3], dtype=np.uint8) + # frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + resize_image = cv2.resize(frame, resize_shape) + img[0:resize_shape[1],0:resize_shape[0]] = resize_image + q_pre.put(img) + count += 1 + print(f'pre process end! {channel}') + +def infer(model_path, q_pre, q_out, pnums): + resource = AclLiteResource() + resource.init() + model = AclLiteModel(model_path) + count = 0 + nums = pnums + image_info = np.array([640, 640, + 640, 640], + dtype=np.float32) + start = time.time() + while True: + if pnums == 0: + break + for i,q in enumerate(q_pre): + img = q.get() + if isinstance(img, str): + pnums -= 1 + q_out[i].put('EOF') + continue + output = model.execute([img, image_info]) + count += 1 + q_out[i].put(output) + end = time.time() + print(f'fps: {count/(end-start):.3f}') + del resource + del model + print('infer end! close infer ') + +def postprocess(q_out, model_width, model_height): + VIDEO_WIDTH = 1920 + VIDEO_HEIGHT = 1080 + while True: + output = q_out.get() + if isinstance(output, str): + print('postprocess end! close subprocess postprocess') + break + box_num = output[1][0, 0] + box_info = output[0].flatten() + scale_x = VIDEO_WIDTH / model_width + scale_y = VIDEO_HEIGHT / model_height + + # get scale factor + if scale_x > scale_y: + max_scale = scale_x + else: + max_scale = scale_y + colors = [0, 0, 255] + + # draw the boxes in original image + result_msg = "" + for n in range(int(box_num)): + ids = int(box_info[5 * int(box_num) + n]) + score = box_info[4 * int(box_num) + n] + label = labels[ids] + ":" + str("%.2f" % score) + top_left_x = box_info[0 * int(box_num) + n] * max_scale + top_left_y = box_info[1 * int(box_num) + n] * max_scale + bottom_right_x = box_info[2 * int(box_num) + n] * max_scale + bottom_right_y = box_info[3 * int(box_num) + n] * max_scale + result_msg += f'label:{label} ' + # cv2.rectangle(src_image, (int(top_left_x), int(top_left_y)), + # (int(bottom_right_x), int(bottom_right_y)), colors) + # p3 = (max(int(top_left_x), 15), max(int(top_left_y), 15)) + # cv2.putText(src_image, label, p3, cv2.FONT_ITALIC, 0.6, colors, 1) + # cv2.imshow('frame', src_image) + # cv2.imwrite(f'../out/out_{count}.jpg', src_image) + print(f'results: {result_msg}') + +if __name__ == '__main__': + stream_path = "../data/test.mp4" + model_path = "../model/yolov5s_rgb.om" + model_width = 640 + model_height = 640 + pnums = 2 + + q_pre = [Queue(maxsize=Q_PRE_SIZE) for i in range(pnums)] + q_out = [Queue(maxsize=Q_OUT_SIZE) for i in range(pnums)] + + loopTime, initTime = time.time(), time.time() + + processes = [] + for i in range(pnums): + processes.append(Process(target=preprocess, args=(stream_path, q_pre[i], model_width, model_height, i))) + processes.append(Process(target=infer, args=(model_path, q_pre, q_out, pnums))) + for i in range(pnums): + processes.append(Process(target=postprocess, args=(q_out[i],model_width, model_width))) + + [process.start() for process in processes] + [process.join() for process in processes] + print('子进程运行结束') + diff --git a/Samples/YOLOV5USBCamera/README.md b/Samples/YOLOV5USBCamera/README.md index 98141b581a9d9f748a3b641479607e471cefb23f..eb8337f4beeae7b2b1fa61281b081ada563ccb4b 100644 --- a/Samples/YOLOV5USBCamera/README.md +++ b/Samples/YOLOV5USBCamera/README.md @@ -72,7 +72,7 @@ atc命令中各参数的解释如下,详细约束说明请参见[《ATC模型转换指南》](https://hiascend.com/document/redirect/CannCommunityAtc)。 - - --model:ResNet-50网络的模型文件的路径。 + - --model:Yolov5网络的模型文件的路径。 - --framework:原始框架类型。5表示ONNX。 - --output:yolov5s.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。 - --input\_shape:模型输入数据的shape。 diff --git a/Samples/YOLOV5USBCamera/python/README.md b/Samples/YOLOV5USBCamera/python/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f7f14b91669a9fe49aa8e19bd703019debce8a1b --- /dev/null +++ b/Samples/YOLOV5USBCamera/python/README.md @@ -0,0 +1,85 @@ +# 目标检测(YoloV5s) + +#### 样例介绍 + +通过USB接口连接Camera与开发板,从Camera获取视频,基于yolov5s模型对输入视频中的物体做实时检测,将推理结果信息使用imshow方式显示。 + +#### 样例下载 + +可以使用以下两种方式下载,请选择其中一种进行源码准备。 + +- 命令行方式下载(**下载时间较长,但步骤简单**)。 + + ``` + # 登录开发板,HwHiAiUser用户命令行中执行以下命令下载源码仓。 + cd ${HOME} + git clone https://gitee.com/ascend/EdgeAndRobotics.git + # 切换到样例目录 + cd EdgeAndRobotics/Samples/YOLOV5USBCamera/python + ``` + +- 压缩包方式下载(**下载时间较短,但步骤稍微复杂**)。 + + ``` + # 1. 仓右上角选择 【克隆/下载】 下拉框并选择 【下载ZIP】。 + # 2. 将ZIP包上传到开发板的普通用户家目录中,【例如:${HOME}/EdgeAndRobotics-master.zip】。 + # 3. 开发环境中,执行以下命令,解压zip包。 + cd ${HOME} + chmod +x EdgeAndRobotics-master.zip + unzip EdgeAndRobotics-master.zip + # 4. 切换到样例目录 + cd EdgeAndRobotics-master/Samples/YOLOV5USBCamera/python + ``` + +#### 执行准备 + +1. 确认已安装带桌面的镜像且HDMI连接的屏幕正常显示 + +2. 以HwHiAiUser用户登录开发板。 + +3. 安装ACLLite库。 + + 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装PyACLLite库。 + +#### 运行样例 + +1. 以HwHiAiUser用户登录开发板,切换到当前样例目录。 + +2. 获取PyTorch框架的Yolov5模型(\*.onnx),并转换为昇腾AI处理器能识别的模型(\*.om)。 + - 当设备内存**小于8G**时,可设置如下两个环境变量减少atc模型转换过程中使用的进程数,减小内存占用。 + ``` + export TE_PARALLEL_COMPILER=1 + export MAX_COMPILE_CORE_NUMBER=1 + ``` + - 为了方便下载,在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。 + ``` + cd model + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/yolov5s_nms.onnx --no-check-certificate + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/aipp_rgb.cfg --no-check-certificate + atc --model=yolov5s_nms.onnx --framework=5 --output=yolov5s_rgb --input_shape="images:1,3,640,640;img_info:1,4" --soc_version=Ascend310B4 --insert_op_conf=aipp_rgb.cfg + ``` + + atc命令中各参数的解释如下,详细约束说明请参见[《ATC模型转换指南》](https://hiascend.com/document/redirect/CannCommunityAtc)。 + + - --model:yolov5网络的模型文件的路径。 + - --framework:原始框架类型。5表示ONNX。 + - --output:yolov5s_rgb.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。 + - --input\_shape:模型输入数据的shape。 + - --soc\_version:昇腾AI处理器的版本。 + +3. 运行样例。 + + 执行以下脚本运行样例: + + ``` + bash sample_run.sh + ``` + +#### 相关操作 + +- 获取更多样例,请单击[Link](https://gitee.com/ascend/samples/tree/master/inference/modelInference)。 +- 获取在线视频课程,请单击[Link](https://www.hiascend.com/edu/courses?activeTab=%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91)。 +- 获取学习文档,请单击[AscendCL Python](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/80RC1alpha003/devguide/appdevg/aclpythondevg/aclpythondevg_0001.html),查看最新版本的AscendCL推理应用开发指南。 +- 查模型的输入输出 + + 可使用第三方工具Netron打开网络模型,查看模型输入或输出的数据类型、Shape,便于在分析应用开发场景时使用。 diff --git a/Samples/YOLOV5USBCamera/python/data/.keep b/Samples/YOLOV5USBCamera/python/data/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/YOLOV5USBCamera/python/model/.keep b/Samples/YOLOV5USBCamera/python/model/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/YOLOV5USBCamera/python/scripts/sample_run.sh b/Samples/YOLOV5USBCamera/python/scripts/sample_run.sh new file mode 100644 index 0000000000000000000000000000000000000000..14e9d7e5ef4589097e296a5bb17d67bbc3e546c1 --- /dev/null +++ b/Samples/YOLOV5USBCamera/python/scripts/sample_run.sh @@ -0,0 +1,12 @@ +#!/bin/bash +ScriptPath="$( cd "$(dirname "$BASH_SOURCE")" ; pwd -P )" + +echo "[INFO] The sample starts to run" + +cd ${ScriptPath}/../src +python3 YOLOV5USBCamera.py +if [ $? -ne 0 ];then + echo "[INFO] The program runs failed" +else + echo "[INFO] The program runs successfully" +fi diff --git a/Samples/YOLOV5USBCamera/python/src/YOLOV5USBCamera.py b/Samples/YOLOV5USBCamera/python/src/YOLOV5USBCamera.py new file mode 100644 index 0000000000000000000000000000000000000000..b7a88894f9d2bbd19f641ad00d0606c678507104 --- /dev/null +++ b/Samples/YOLOV5USBCamera/python/src/YOLOV5USBCamera.py @@ -0,0 +1,112 @@ +import videocapture as video +import numpy as np +import cv2 + +import time + +from acllite_resource import AclLiteResource +from acllite_model import AclLiteModel +from acllite_imageproc import AclLiteImageProc +from acllite_image import AclLiteImage +from label import labels +from acllite_logger import log_error, log_info + + +class sampleYOLOV7(object): + '''load the model, and do preprocess, infer, postprocess''' + def __init__(self, model_path, model_width, model_height): + self.model_path = model_path + self.model_width = model_width + self.model_height = model_height + + def init_resource(self): + # initial acl resource, create image processor, create model + self._resource = AclLiteResource() + self._resource.init() + + self._dvpp = AclLiteImageProc(self._resource) + self._model = AclLiteModel(self.model_path) + + def preprocess(self, frame): + # resize frame, keep original image + self.src_image = frame + self.resized_image = cv2.resize(frame, (self.model_width, self.model_height)) + + def infer(self): + # infer frame + image_info = np.array([640, 640, + 640, 640], + dtype=np.float32) + self.result = self._model.execute([self.resized_image, image_info]) + + def postprocess(self): + box_num = self.result[1][0, 0] + box_info = self.result[0].flatten() + + height, width, _ = self.src_image.shape + scale_x = width / self.model_width + scale_y = height / self.model_height + + colors = [0, 0, 255] + text = "" + # draw the boxes in original image + for n in range(int(box_num)): + ids = int(box_info[5 * int(box_num) + n]) + score = box_info[4 * int(box_num) + n] + label = labels[ids] + ":" + str("%.2f" % score) + top_left_x = box_info[0 * int(box_num) + n] * scale_x + top_left_y = box_info[1 * int(box_num) + n] * scale_y + bottom_right_x = box_info[2 * int(box_num) + n] * scale_x + bottom_right_y = box_info[3 * int(box_num) + n] * scale_y + cv2.rectangle(self.src_image, (int(top_left_x), int(top_left_y)), + (int(bottom_right_x), int(bottom_right_y)), colors) + p3 = (max(int(top_left_x), 15), max(int(top_left_y), 15)) + position = [int(top_left_x), int(top_left_y), int(bottom_right_x), int(bottom_right_y)] + cv2.putText(self.src_image, label, p3, cv2.FONT_ITALIC, 0.6, colors, 1) + text += f'label:{label} {position} ' + log_info(text) + cv2.imshow('out', self.src_image) + + def release_resource(self): + # release resource includes acl resource, data set and unload model + del self._resource + del self._dvpp + del self._model + del self.resized_image + +def find_camera_index(): + max_index_to_check = 10 # Maximum index to check for camera + for index in range(max_index_to_check): + cap = cv2.VideoCapture(index) + if cap.read()[0]: + cap.release() + return index + # If no camera is found + raise ValueError("No camera found.") + + +if __name__ == '__main__': + model_path = '../model/yolov5s_rgb.om' + model_width = 640 + model_height = 640 + model = sampleYOLOV7(model_path, model_width, model_height) + model.init_resource() + + camera_index = find_camera_index() + cap = cv2.VideoCapture(camera_index) + cv2.namedWindow('out', cv2.WINDOW_NORMAL) + while True: + ret, frame = cap.read() + if not ret: + print("Can't receive frame (stream end?). Exiting ...") + break + model.preprocess(frame) + model.infer() + model.postprocess() + # cv2.imshow('Frame', frame) + if cv2.waitKey(1) & 0xFF == ord('q'): + break + cap.release() + cv2.destroyAllWindows() + + model.release_resource() diff --git a/Samples/YOLOV5USBCamera/python/src/label.py b/Samples/YOLOV5USBCamera/python/src/label.py new file mode 100644 index 0000000000000000000000000000000000000000..cc23459ea93a175bf113f22f8776aa6ff664625b --- /dev/null +++ b/Samples/YOLOV5USBCamera/python/src/label.py @@ -0,0 +1,20 @@ +""" +Copyright (R) @huawei.com, all rights reserved +-*- coding:utf-8 -*- +CREATED: 2023-05-25 09:12:13 +MODIFIED: 2023-05-25 10:10:55 +""" +labels = ["person", "bicycle", "car", "motorbike", "aeroplane", + "bus", "train", "truck", "boat", "traffic light", + "fire hydrant", "stop sign", "parking meter", "bench", "bird", + "cat", "dog", "horse", "sheep", "cow", + "elephant", "bear", "zebra", "giraffe", "backpack", + "umbrella", "handbag", "tie", "suitcase", "frisbee", + "skis", "snowboard", "sports ball", "kite", "baseball bat", + "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", + "wine glass", "cup", "fork", "knife", "spoon", + "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", + "pizza", "donut", "cake", "chair", "sofa", "potted plant", "bed", "dining table", + "toilet", "TV monitor", "laptop", "mouse", "remote", "keyboard", "cell phone", + "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", + "scissors", "teddy bear", "hair drier", "toothbrush"] \ No newline at end of file diff --git a/Samples/YOLOV5Video/README.md b/Samples/YOLOV5Video/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ac623ec8f243ea5dba27be152f6c2bedae2630e1 --- /dev/null +++ b/Samples/YOLOV5Video/README.md @@ -0,0 +1,98 @@ +# 目标检测(YoloV5s) + +#### 样例介绍 + +通过USB接口连接Camera与开发板,从Camera获取视频,基于yolov5s模型对输入视频中的物体做实时检测,将推理结果信息使用imshow方式显示。 + +#### 样例下载 + +可以使用以下两种方式下载,请选择其中一种进行源码准备。 + +- 命令行方式下载(**下载时间较长,但步骤简单**)。 + + ``` + # 登录开发板,HwHiAiUser用户命令行中执行以下命令下载源码仓。 + cd ${HOME} + git clone https://gitee.com/ascend/EdgeAndRobotics.git + # 切换到样例目录 + cd EdgeAndRobotics/Samples/YOLOV5Video + ``` + +- 压缩包方式下载(**下载时间较短,但步骤稍微复杂**)。 + + ``` + # 1. 仓右上角选择 【克隆/下载】 下拉框并选择 【下载ZIP】。 + # 2. 将ZIP包上传到开发板的普通用户家目录中,【例如:${HOME}/EdgeAndRobotics-master.zip】。 + # 3. 开发环境中,执行以下命令,解压zip包。 + cd ${HOME} + chmod +x EdgeAndRobotics-master.zip + unzip EdgeAndRobotics-master.zip + # 4. 切换到样例目录 + cd EdgeAndRobotics-master/Samples/YOLOV5Video + ``` + +#### 执行准备 + +1. 确认已安装带桌面的镜像且HDMI连接的屏幕正常显示 + +2. 以HwHiAiUser用户登录开发板。 + +3. 安装ACLLite库。 + + 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装PyACLLite库。 + +#### 运行样例 + +1. 以HwHiAiUser用户登录开发板,切换到当前样例目录。 + +2. 获取PyTorch框架的Yolov5模型(\*.onnx),并转换为昇腾AI处理器能识别的模型(\*.om)。 + - 当设备内存**小于8G**时,可设置如下两个环境变量减少atc模型转换过程中使用的进程数,减小内存占用。 + ``` + export TE_PARALLEL_COMPILER=1 + export MAX_COMPILE_CORE_NUMBER=1 + ``` + - 为了方便下载,在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。 + ``` + cd model + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/yolov5s_nms.onnx --no-check-certificate + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/aipp.cfg --no-check-certificate + atc --model=yolov5s_nms.onnx --framework=5 --output=yolov5s_nms --input_shape="images:1,3,640,640;img_info:1,4" --soc_version=Ascend310B4 --insert_op_conf=aipp.cfg + ``` + + atc命令中各参数的解释如下,详细约束说明请参见[《ATC模型转换指南》](https://hiascend.com/document/redirect/CannCommunityAtc)。 + + - --model:yolov5网络的模型文件的路径。 + - --framework:原始框架类型。5表示ONNX。 + - --output:yolov5s_nms.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。 + - --input\_shape:模型输入数据的shape。 + - --soc\_version:昇腾AI处理器的版本。 + +3. 准备测试视频和图片。 + + 请从以下链接获取该样例的测试视频,放在data目录下。 + + ``` + cd ../data + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/test.和64 --no-check-certificate + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg --no-check-certificate + ``` + + **注:**若需更换测试视频,则需自行准备测试视频,并将测试视频放到data目录下。 + +4. 运行样例。 + + 执行以下脚本运行样例: + + ``` + bash sample_run.sh + ``` + 可以通过修改YOLOV5Video.py中的变量mode选择处理图片或视频,结果会以imshow的方式呈现。 + +#### 相关操作 + +- 获取更多样例,请单击[Link](https://gitee.com/ascend/samples/tree/master/inference/modelInference)。 +- 获取在线视频课程,请单击[Link](https://www.hiascend.com/edu/courses?activeTab=%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91)。 +- 获取学习文档,请单击[AscendCL Python](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/80RC1alpha003/devguide/appdevg/aclpythondevg/aclpythondevg_0001.html),查看最新版本的AscendCL推理应用开发指南。 +- 查模型的输入输出 + + 可使用第三方工具Netron打开网络模型,查看模型输入或输出的数据类型、Shape,便于在分析应用开发场景时使用。 diff --git a/Samples/YOLOV5Video/data/.keep b/Samples/YOLOV5Video/data/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/YOLOV5Video/model/.keep b/Samples/YOLOV5Video/model/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/YOLOV5Video/scripts/sample_run.sh b/Samples/YOLOV5Video/scripts/sample_run.sh new file mode 100644 index 0000000000000000000000000000000000000000..abc91851ff53212657ddc7e8586a9c83d4dc8404 --- /dev/null +++ b/Samples/YOLOV5Video/scripts/sample_run.sh @@ -0,0 +1,12 @@ +#!/bin/bash +ScriptPath="$( cd "$(dirname "$BASH_SOURCE")" ; pwd -P )" + +echo "[INFO] The sample starts to run" + +cd ${ScriptPath}/../src +python3 YOLOV5Video.py +if [ $? -ne 0 ];then + echo "[INFO] The program runs failed" +else + echo "[INFO] The program runs successfully" +fi diff --git a/Samples/YOLOV5Video/src/YOLOV5Video.py b/Samples/YOLOV5Video/src/YOLOV5Video.py new file mode 100644 index 0000000000000000000000000000000000000000..5b827ec508e3d20f1dfc5f3410c6cb51cd51f0ba --- /dev/null +++ b/Samples/YOLOV5Video/src/YOLOV5Video.py @@ -0,0 +1,137 @@ +import videocapture as video +import numpy as np +import cv2 + +import time + +from acllite_resource import AclLiteResource +from acllite_model import AclLiteModel +from acllite_imageproc import AclLiteImageProc +from acllite_image import AclLiteImage +from label import labels +from acllite_logger import log_error, log_info + + +class sampleYOLOV7(object): + '''load the model, and do preprocess, infer, postprocess''' + def __init__(self, model_path, model_width, model_height): + self.model_path = model_path + self.model_width = model_width + self.model_height = model_height + self.conf_thres = 0.25 + self.nms_thres = 0.45 + self.src_image = None + + def init_resource(self): + # initial acl resource, create image processor, create model + self._resource = AclLiteResource() + self._resource.init() + + self._dvpp = AclLiteImageProc(self._resource) + self._model = AclLiteModel(self.model_path) + + def preprocess_image(self, frame): + # resize frame by dvpp + yuv_image = self._dvpp.jpegd(frame) + self.resized_image = self._dvpp.resize(yuv_image, self.model_width, self.model_height) + + def preprocess_vis(self, frame): + # resize frame, keep original image + src_image = frame.byte_data_to_np_array().astype(np.uint8) + self.src_image = cv2.cvtColor(src_image.reshape((frame.height*3//2, frame.width)), cv2.COLOR_YUV2RGB_NV21) + + self.resized_image = self._dvpp.resize(frame, self.model_width, self.model_height) + + def infer(self): + # infer frame + image_info = np.array([640, 640, + 640, 640], + dtype=np.float32) + self.result = self._model.execute([self.resized_image, image_info]) + + def postprocess(self,path): + box_num = self.result[1][0, 0] + box_info = self.result[0].flatten() + + if self.src_image is None: + src_image = cv2.imread(path) + else: + src_image = self.src_image + height, width, _ = src_image.shape + scale_x = width / self.model_width + scale_y = height / self.model_height + + colors = [0, 0, 255] + text = "" + # draw the boxes in original image + for n in range(int(box_num)): + ids = int(box_info[5 * int(box_num) + n]) + score = box_info[4 * int(box_num) + n] + label = labels[ids] + ":" + str("%.2f" % score) + top_left_x = box_info[0 * int(box_num) + n] * scale_x + top_left_y = box_info[1 * int(box_num) + n] * scale_y + bottom_right_x = box_info[2 * int(box_num) + n] * scale_x + bottom_right_y = box_info[3 * int(box_num) + n] * scale_y + cv2.rectangle(src_image, (int(top_left_x), int(top_left_y)), + (int(bottom_right_x), int(bottom_right_y)), colors) + p3 = (max(int(top_left_x), 15), max(int(top_left_y), 15)) + position = [int(top_left_x), int(top_left_y), int(bottom_right_x), int(bottom_right_y)] + cv2.putText(src_image, label, p3, cv2.FONT_ITALIC, 0.6, colors, 1) + text += f'label:{label} {position} ' + log_info(text) + cv2.imshow('out', src_image) + + def release_resource(self): + # release resource includes acl resource, data set and unload model + del self.resized_image + del self._model + del self._dvpp + del self._resource + +def video_infer(video_path, model): + cap = video.VideoCapture(video_path) + while True: + ret, frame = cap.read() + if ret: + print('cap read end! close subprocess cap read') + break + if frame is not None: + print('start preprocess') + model.preprocess_vis(frame) + model.infer() + model.postprocess(video_path) + cv2.waitKey(1) + else: + log_info("read frame finish") + break + del cap + +def image_infer(image_path, model): + frame = AclLiteImage(image_path) + model.preprocess_image(frame) + model.infer() + model.postprocess(image_path) + cv2.waitKey(0) + + +if __name__ == '__main__': + model_path = '../model/yolov5s_nms.om' + model_width = 640 + model_height = 640 + + model = sampleYOLOV7(model_path, model_width, model_height) + model.init_resource() + cv2.namedWindow('out', cv2.WINDOW_NORMAL) + + mode = "video" + if mode == "image": + path = "../data/dog1_1024_683.jpg" + image_infer(path, model) + elif mode == "video": + path = "../data/test.h264" + video_infer(path, model) + else: + print('input mode is incorrect.') + + cv2.destroyAllWindows() + model.release_resource() diff --git a/Samples/YOLOV5Video/src/label.py b/Samples/YOLOV5Video/src/label.py new file mode 100644 index 0000000000000000000000000000000000000000..cc23459ea93a175bf113f22f8776aa6ff664625b --- /dev/null +++ b/Samples/YOLOV5Video/src/label.py @@ -0,0 +1,20 @@ +""" +Copyright (R) @huawei.com, all rights reserved +-*- coding:utf-8 -*- +CREATED: 2023-05-25 09:12:13 +MODIFIED: 2023-05-25 10:10:55 +""" +labels = ["person", "bicycle", "car", "motorbike", "aeroplane", + "bus", "train", "truck", "boat", "traffic light", + "fire hydrant", "stop sign", "parking meter", "bench", "bird", + "cat", "dog", "horse", "sheep", "cow", + "elephant", "bear", "zebra", "giraffe", "backpack", + "umbrella", "handbag", "tie", "suitcase", "frisbee", + "skis", "snowboard", "sports ball", "kite", "baseball bat", + "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", + "wine glass", "cup", "fork", "knife", "spoon", + "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", + "pizza", "donut", "cake", "chair", "sofa", "potted plant", "bed", "dining table", + "toilet", "TV monitor", "laptop", "mouse", "remote", "keyboard", "cell phone", + "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", + "scissors", "teddy bear", "hair drier", "toothbrush"] \ No newline at end of file